JaneGu 发表于 2007-2-16 21:45:07

我的QTP总结

我的QTP总结写了一段时间了,因为上班不能上网,直到现在才发出来。以后兄弟姐妹们也许还能用到,供大家参考,有写得不对的地方,欢迎指点。

录制原理:对可识别的对象,在录制过程中,使用识别原理将GUI加载到对象库,并在脚本里对对象进行各种动作触发。对不可识别的对象,有analog recording和low level recording(QTP) 两种录制方式。适合GUI软件的自动化测试。识别对象原理即反编译原理,根据GUI对象的属性的识别对象。回放原理:将对象库里的对象属性和实际被测软件的对象一一匹配,完成相应的动作触发或校验。
录制脚本注意事项:
⑴尽量使用工具来启动程序;
⑵录制状态下,杜决多余操作;
⑶关闭应用程序;
⑷录制最后要STOP。

录制过程中可能出现的问题:
   1.无法识别对象
   解决方案:如果是没有相应程序的插件,而导致的对象不能识别,请填加相应的插件.如果是少量的几个控件不能识别的话,可以用合适类型的虚拟对象来代替.当然还有两个万能的办法,就是更改录制模式使用LOW-LEVEL Recording 和 Analog Recording来录制.

   2.无法生成脚本,但对象可以识别
   解决方案:把对象手工添加到对象库中去,然后手工来生成需要的脚本

回放过程中可能出现的问题:
   1.找不到测试对象
   解决方案:把该对象填加到对象库中去
   2.测试对象与运行时对象不匹配
解决方案:如果是因为脚本的上下文依赖而导致的对象不能识别,请加相应的延时.如果是由于对象属性发生了变化而导致的对象不能识别,请修改相应的属性.
   3.无法执行脚本操作
   解决方案:请检查脚本程序


QTP要点:
录制脚本。一种方式:Record and run test on any open Windows-based application,这种方式需要在脚本里添加命令Systemutil.Run “要打开的被测软件名”。另一种方式:Record and run on these applications(open on session start),这种方式下如果回放时与录制时打开的应用程序不一致,回放就会报错。

往对象库里增加对象。第一种方式:录制时的对象自动加到对象库里。第二种方式:点击对象库按钮或打开对象库菜单,点击“Add objects”增加所需的对象。第三种方式:在快照里右击所需对象,选择增加对象菜单。

关于验证点:
1、在脚本里加标准验证点、数据库验证点,可以边录制边加验证点,或先录制后加验证点。添加方式可以选择菜单,也可以在快照里右击所需验证对象。
2、标准和数据库验证点,预期数据可以常量或参数方式表示。参数分Data table、Environment、Random Number三种。
3、输出值可以输出到Data Table和Environment中,可将输出值与预期值比较来验证。
4、用GetRoProperty捕获界面元素输出值,赋给变量,再进行比较验证。这种方式比QTP的输出值方式更方便使用。

关于输入内容
输入内容可以用常量也可以用参数方式。录制后可在关键字视图或专家视图中更改。
  
关于输出日志
1、判断验证结果输出日志:reporter.ReportEvent micfail,"检查×××","×××失败"。事件状态有:micPass、micFail、micDone、micWarning。
2、可以输出日志到Excel文件,Txt文件,方法在下文中。


关于Data Table
1、可用Data Table驱动循环,需在Action的Action Call Properties菜单中选择运行条目数。
2、Data Table可以导入已有文件,例
    a = environment("TestDir")&"\mydata.xls"
datatable.import(a)
3、Data Table的Sheet可以用命令方式增加字段,例
datatable.LocalSheet.AddParameter "testlog",""
4、获取Data Table的Sheet中记录数目用来循环,如
c=datatable.LocalSheet.GetRowCount
移动Sheet中记录指针,如datatable.LocalSheet.SetNextRow
5、导出Data Table,如
datatable.ExportSheet environment("TestDir")&"\final.xls",2(2为第二张Sheet表,第一张Sheet表是Global。)
                exitaction(结束Action)

关于SetToProperty的用法
相同类型对象,只有“Text”属性(或其它)不同,用SetToProperty对一个对象的属性根据不同情况进行不同设置,常在循环或选择分支语句中使用。
例 For i=0 to 9
         Window("计算器").WinButton("number").SetTOProperty "text",cstr(i)
Window("计算器").WinButton("number").Click
Next

关于GetToProperties的用法
Set b = dialog("Login").WinEdit("winedit").GetTOProperties
PropsCount = b.Count
For i=0 to PropsCount-1
                PropName = b(i).Name
                PropValue = b(i).Value
                msgbox PropName & "属性的值是 " & PropValue
Next

在一个脚本中插入多个Action
1、        多个Action并列结构:Insert Call to New Action―――选择At the end of the test
2、        多个Action嵌套结构:Insert Call to New Action―――选择After the current step,这种方式会在主Action里加入一行命令,如RunAction "OpenApp", oneIteration。
这种结构下,可以按级传递输入输出参数。脚本参数在Test Setting中设置,运行时输入,输出参数不可见,输出到QC等外部软件中去。主Action中Action Properties中添加输入输出参数,Action Call Properties中添加参数对应关系,再设置下一级Action的参数及对应关系。
输入输出参数的应用,例
Window("计算器").Type Parameter("number1")
Window("计算器").WinButton("+").Click
Window("计算器").Type Parameter("number2")
Window("计算器").WinButton("=").Click
parameter("sum")=window("计算器").WinEdit("Edit").GetROProperty("text")
3、        还可以插入一个Action的拷贝,或插入一个已存在Action。

描述性编程
Dim computer
set computer = description.Create()
computer("regexpwndtitle").value = "计算器"
computer("regexpwndclass").value = "SciCalc"
Dimseven
set seven =description.Create()
seven("text").value = "7"
seven("nativeclass").value = "Button"
window(computer).winbutton(seven).click

systemutil.Run "d:\gyj\calc.exe"
For i=0 to 9
window("regexpwndtitle:=计算器","regexpwndclass:=SciCalc").winbutton("text:="&cstr(i),"nativeclass:=Button").click
Next

关闭子窗体,可作为Action预处理
Option explicit
Dim loginwin,mainwin,child,i
Set loginwin=description.create()
loginwin("text").value = "Login"
Set child=desktop.ChildObjects(loginwin)
For i=1 to child.count
        child(i-1).close
Next

Set mainwin=description.Create()
mainwin("text").value = "Flight Reservation"
Set child = desktop.ChildObjects(mainwin)
For i=1 to child.count
        child(i-1).close
Next

Txt格式文件作为输入,输出日志到Txt格式文件
Const ForReading =1,ForWriting = 2
Dim fso,f,g,i
Set fso =CreateObject("Scripting.FileSystemObject")

Set f = fso.OpenTextFile("d:\gyj\login.txt",Forreading)
Set g= fso.OpenTextFile("d:\gyj\log.txt",Forwriting,true)
i=0
While f.atendofline<>true
        systemutil.Run "C:\Program Files\Mercury Interactive\QuickTest Professional\samples\flight\app\flight4a.exe"
        Dim myArray
        myArray = split(f.readline,",")
        Dialog("Login").WinEdit("Agent Name:").Set myArray(0)
        Dialog("Login").WinEdit("Password:").Set myArray(1)
        Dialog("Login").WinButton("OK").Click
        wait 3
        window("Flight Reservation").Close
        i=i+1
        g.write "第"&i&"次登录成功"&vbcrlf
Wend
f.close
g.close
Set fso =nothing

Excel格式文件作为输入,并输出日志到另一Sheet
Dim res,cmd,sql
Set res=createobject("adodb.recordset")
Set cmd=createobject("adodb.command")
cmd.activeconnection="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Program Files\Mercury Interactive\QuickTest Professional\samples\flight\app\flight32.mdb;Persist Security Info=False"
cmd.CommandType=1

Dim xlapp,wkbook,wksheet,wklog
Dim i
        Set xlapp = CreateObject("excel.application")
        Set wkbook = xlapp.Workbooks.Open(environment("TestDir")&"\test.xls")
        xlapp.visible = false
        Set wksheet = wkbook.Worksheets("testdata")
        Set wklog = wkbook.Worksheets("testlog")
        For i=2 to 4
                a = wksheet.Cells(i,1)
                b = wksheet.Cells(i,2)
          c= wksheet.Cells(i,3)
          d = wksheet.Cells(i,4)
          e = wksheet.Cells(i,5)
   
                window("Flight Reservation").ActiveX("MaskEdBox").Type a
               window("Flight Reservation").WinComboBox("Fly From:").Select b
                window("Flight Reservation").WinComboBox("Fly To:").Select c
                Window("Flight Reservation").WinButton("FLIGHT").Click
                Window("Flight Reservation").Dialog("Flights Table").WinButton("OK").Click
                window("Flight Reservation").WinEdit("Name:").Set d
                window("Flight Reservation").WinEdit("Tickets:").Set e
                window("Flight Reservation").WinButton("Insert Order").Click
                Window("Flight Reservation").ActiveX("Threed Panel Control").WaitProperty "text", "Insert Done...", 10000
      OrderNo = window("Flight Reservation").WinEdit("Order No:").GetROProperty("text")
                sql="SELECT MAX(Order_Number) AS dbOrderNOFROM ORDERS"
                cmd.CommandText=sql
                Set res=cmd.Execute()
                If trim(OrderNo) = trim(res("dbOrderNo")) Then
                        wklog.Cells(i,1) =   res("dbOrderNo")
                        wklog.Cells(i,2) = "订单" &OrderNo &"创建成功"
                else
                        wklog.Cells(i,1) =   OrderNo
                        wklog.Cells(i,2) = "订单" &OrderNo &"创建失败"
                end if
                window("Flight Reservation").WinButton("Button_5").Click
        Next

        window("Flight Reservation").Close
        wkbook.save
    wkbook.close
        xlapp.Quit
        Set xlapp = Nothing
       
        Set res=nothing
        Set cmd.ActiveConnection = nothing
        Set cmd = nothing

打开数据库函数
Function opendb(sql)
dbstr="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Program Files\Mercury Interactive\QuickTest Professional\samples\flight\app\flight32.mdb;Persist Security Info=False"
Set Cnn =CreateObject("ADODB.Connection")
Cnn.Open dbstr
Set res =CreateObject("ADODB.Recordset")
res.Open sql, Cnn,1,1
res.MoveFirst
arraylen=res.fields.count
ReDim myarray(res.RecordCount-1)
j=0
While not res.eof
        myarray(j)=res.fields(0).value
        For i=1 to arraylen-1
        myarray(j)=myarray(j)&","&res.fields(i).value   
        Next
        j=j+1
        res.movenext
Wend
opendb = myarray
Set res = nothing
Set Cnn= nothing
End Function

虚拟对象技术

baizhudan 发表于 2007-2-17 11:09:22

sdlkfj3

wssgily 发表于 2007-2-17 14:22:05

真是强,学习中!

ebuluo 发表于 2007-2-20 21:06:13

这个总结不错

JamesGosling 发表于 2007-2-26 11:59:30

赫赫,我考QTP前就拿到了JaneGu的这份资料。在此,向GU大姐说 “감사합니다!”

kevin_swpi 发表于 2007-2-26 16:57:04

学习了.........呵呵

wangziyang 发表于 2007-2-28 12:50:10

好多代码都忘了,过了年把什么都忘啦!

rickyzhu 发表于 2007-2-28 13:18:22

总结的不错,相当全面和细致.

辛苦了.

支持这种原创的作品. 随时测试,随时学习,随时总结,随时分享.

Rosetan 发表于 2007-3-3 16:27:45

现在工作中都不用QTP,都快忘了。sdlkfj1

zhenghong 发表于 2007-3-4 20:35:48

正需要!

好东西,谢了!

nan3937 发表于 2007-3-6 14:57:53

好久没用QTP了,礼拜六要考试。。。好东西~耶!!
你现在能用到QTP吗?

yhzmw 发表于 2007-3-6 16:58:09

原帖由 rickyzhu 于 2007-2-28 13:18 发表
总结的不错,相当全面和细致.
.
这个兄弟的话我不认同。总结的不错,但不全面,还有很多地方没涉及

serena_chueng 发表于 2007-3-7 14:03:55

原帖由 yhzmw 于 2007-3-6 16:58 发表

这个兄弟的话我不认同。总结的不错,但不全面,还有很多地方没涉及


楼上的,那他没涉及到的你给大家补充下吧?

JaneGu 发表于 2007-3-7 21:24:05

我只是把上课讲到的要点总结了一下,肯定有不足之处,欢迎大家补充。比如,虚拟对象技术我没有总结,因为印象不深。所以,大家集思广益啊!sdlkfj5
页: [1]
查看完整版本: 我的QTP总结