用QTP实现自动化功能测试的实践 – 前期准备

下一篇:用QTP实现自动化功能测试的实践 – 付诸行动

话说已经有一年没写QTP的脚本了,几次提笔都不知道从什么地方写起。不过既然答应了小九要总结总结,就试着努力回忆一下吧。

很多同学刚开始接触QTP的时候都觉得无从下手,有不少同学问我要过教程啊之类的,也有的问我有没有好的书籍推荐。我还真是没有教程,其实QTP自带的帮助就挺不错的,就看你能不能耐心看下来。

接到自动化测试的任务后,我们首先和大家一起讨论了要自动化的用例,并不是所有的用例都能自动化,也不是所有的用例都需要自动化。

用例确定好之后,就开始了脚本的架构设计(PS:请忽略那些个流程中的设计文档啊,编码规范啊,我们直接切入主题吧)。在设计架构的时候,我主要考虑了以下几个方面:
1. 代码的复用
2. 数据如何准备
3. 数据如何清理
4. 一条用例一个脚本还是几条用例一个脚本
5. 测试报告如何生成
6. 对象库的管理
7. 因为项目有地区差异性,所以脚本的易维护性也很重要

带着上面的疑问,我们进行了编码前的准备工作
1.代码复用。如一个方法需要被重复调用2-3次以上的,就抽出来作为可以公共调用的方法。
2.数据驱动。测试数据用excel进行数据驱动。把需要的测试数据保存到excel里面,用的时候就从excel中读取,这样做有个好处就是方便对测试数据进行编辑。
3.数据准备。测试过程中如果需要准备数据,采取直插数据库的方式进行数据准备。这种方式有个很大的弊端,必须相当熟悉数据库的保存逻辑,否则会造成脏数据,而且也会影响测试结果,强烈不建议使用。如果系统中已经有现成的满足数据准备的功能,还是用已有的功能来实现。例如:要测试编辑员工资料的功能,就先用脚本跑一下增加员工的功能。
4.数据清理
5.一条用例一个脚本。脚本之间不相互依赖,这样可以保证不会因为一条用例的失败,影响其他用例的执行。
6.测试报告的生成。现在已经忘了从哪个网站下载的原始测试报告框架ReporterManager,去掉了其中一些不需要的功能。保留了生成Excel报告和发生错误截屏的功能。推荐使用该框架,测试结果一目了然,尤其喜欢截屏部分,很好的保存了现场证据,呵呵。
7.对象库的管理。把多个用例中都会用到的对象都抽取出来,并进行归类,相同类别的对象保存到一个库中,方便脚本编写的时候查找调用。为什么不一条用例保存一份对象库呢?如果一条用例就保存成一个对象库,会造成一部分对象,在多个对象库中存在,假设该对象属性发生了变化,需要把N多的对象库进行相应的修改,而且也容易造成漏改的现象。
8.地区差异性。本来是想把各个地区的相同用例抽取出来作为主干代码,然后由地区差异的部分做成分支。但是脚本中有很多公共调用的部分,如果搞成分支,分支中也需要包含这些公共调用的代码。以后修改维护就很麻烦,一个小小的改动要把主干和所有分支中的代码都修改一下。我想SVN可能有解决方案,但是我们不会用而已。最后,我们把地区的信息,放在了负责数据驱动的excel里面,在excel里面进行差异化配置,在脚本中进行地区的判断。这样只维护一套代码就可以了。
9. 运用类。虽然在vbscript中也谈类啊对象啊有些奇怪,但是用了之后会发现,代码结构比较清晰,用起来很方便。我们可以在Class_Initialize中定义用例一开始必须要初始化的一些内容,在Class_Terminate中定义一些用例结束需要做的清理工作。在用到的时候,前后两句代码就可以解决。如果在执行过程中遇到一些异常情况,导致代码没有执行到最后一行就终止了,这时候Class_Terminate中定义的清理工作仍然会被执行,就不会造成有始无终的情况了(比如说用例开始的时候准备了很多测试数据,但是最后却没有被清理掉)。好处就不一一举例了。

下一篇:用QTP实现自动化功能测试的实践 – 付诸行动

WriteToFile – 向文件中写入内容,并且覆盖原有的内容

  1. '函数名:WriteToFile
  2. '作用:向文件中写入内容,并且覆盖原有的内容
  3. Function WriteToFile(sFilename, sLine)
  4.   Const ForWriting = 2
  5.   If sFilename = "" Then
  6.     sFilename = Environment("SystemTempDir") & "\QTDebug.txt"
  7.   End If
  8.   Set f = OpenFile(sFilename, ForWriting, True)
  9.   f.WriteLine sLine
  10.   f.Close
  11. End Function
  12.  
  13. Function OpenFile(sFilename, iomode, create)
  14.   Set fso = CreateObject("Scripting.FileSystemObject")
  15.   Set OpenFile = fso.OpenTextFile(sFilename, iomode, create)
  16. End Function
  17.  
  18. ' 使用示例:
  19. WriteToFile "d:\beenhere.txt", Now

AppendToFile – 在文件中附加内容

  1. '函数名:AppendToFile
  2. '作用:在文件中附加内容.
  3. Function AppendToFile(sFilename, sLine)
  4.   Const ForAppending = 8
  5.   If sFilename = "" Then
  6.     sFilename = Environment("SystemTempDir")&"\QTDebug.txt"
  7.   End If
  8.   Set f = OpenFile(sFilename, ForAppending, True)
  9.   f.WriteLine sLine
  10.   f.Close
  11. End Function
  12.  
  13. Function OpenFile(sFilename, iomode, create)
  14.   Set fso = CreateObject("Scripting.FileSystemObject")
  15.   Set OpenFile = fso.OpenTextFile(sFilename, iomode, create)
  16. End Function
  17.  
  18. '使用示例 (与OpenFile函数配合使用)
  19. AppendToFile "d:\beenhere.txt", Now

OpenFile – 打开指定的文件,返回一个可以用来读、写、附加内容到文件的TextStream对象

  1. '函数名:OpenFile
  2. '作用:打开指定的文件,返回一个可以用来读、写、附加内容到文件的TextStream对象
  3. '参数iomode: 1-ForReading, 2-ForWriting, 8-ForAppending
  4. Function OpenFile(sFilename, iomode, create)
  5.   Set fso = CreateObject("Scripting.FileSystemObject")
  6.   Set OpenFile = fso.OpenTextFile(sFilename,iomode,create)
  7. End Function
  8.  
  9. '示例代码
  10. '打开d盘下的beenhere.txt文件,如果没有则自动创建该文件
  11. Set f = OpenFile("d:\beenhere.txt", 2, True)
  12. '将当前系统时间写入文件,如果文件之前已经有内容,则覆盖掉原有的内容
  13. f.WriteLine Now
  14. f.Close

NormalizeString – 转义QTP中的特殊字符,返回相应的正则表达式

QTP中有几个字符是需要被转义之后才能正常使用(尤其是在对象识别中),而QTP自带的帮助里面提供了一个函数NormalizeString,可以实现这种转义

  1. Function NormalizeString(OrgStr)
  2.   Dim TempStr
  3.   TempStr = Replace(OrgStr, "\", "\\")
  4.   TempStr = Replace(TempStr, "*", "\*")
  5.   TempStr = Replace(TempStr, "+", "\+")
  6.   TempStr = Replace(TempStr, ".", "\.")
  7.   NormalizeString = Replace(TempStr, "?", "\?")
  8. End function
  9.  
  10. msgbox NormalizeString ("http://www.threes.cn/blog/?p=799")

QTP描述性编程中利用url识别对象

QTP中利用url识别对象时,有时会出现对象无法被识别的问题
例如下面这种情况:
Browser(“xxx”).Page(“url:=http://www.threes.cn/index.php?p=755″).Sync
如果执行上句会提醒页面上找不到与之匹配的对象

这是因为在VBScript的正则表达式中?号是匹配前面的子表达式零次或一次,这样明显是错误的
解决方法是:将?进行转义
即Browser(“xxx”).Page(“url:=http://www.threes.cn/index.php\?p=755″).Sync