发布新日志

  • 如何让你的QTP脚本执行效率更高?

    2013-05-09 17:36:35

    Launch QTP using a .vbs file and not the QTP desktop icon. You will notice a substantial increase in speed. (使用VBS文件来启动QTP。) 
    For large tests, always define variables, function in an external .vbs file and not inside a reusable action. Attach these files with your test scripts. If you define a variable or a function in an action, on every iteration of your test run, memory(RAM) will be allocated to those variables/functions and would not be released. Now as your script. starts consuming more and more RAM, your System Under Test (SUT) will tend to become slower. (把变量和函数定义放到外部VBS文件,而不要放在Action中。) 
    While running, QTP consumes a lot of memory by itself. It is always advisable to have lots of available RAM( much more than what is recommended by HP) and good processor speed on a system where you intend to install QTP. When you have tests (and hence QTP) running for a prolonged period if time, there are chances of memory leaks. To avoid memory leakage always restart QTP at some intervals of time. Using AOM you can automate this process. (通过AOM控制QTP重启来解决QTP内存泄漏问题。) 
    Avoid using hard coded wait(x) statement. Wait statement waits for full x seconds, even if the event has already occurred. Instead use .sync or exist statement. While using exist statement always have a value inside it. (尽量不要使用wait,而使用.sync或exist语句。) 
    For ex: .Exist(10) Here QTP will wait max till 10 seconds and if it finds the object at (say) 3 secs , it will resume the execution immediately thereby saving your precious time. On the other hand if you leave the parenthesis blank, QTP would wait for object synchronization timeout you have mentioned under File > Test Settings > Run Tab.

    Make full use of what HP-QTP has provided you in the tool IDE. Use “Automatically Generate “With” statements after recording” option present under Tools > Options > General Tab. This will not only make your code look neater but also make your scripts perform. better. (使用With语句可以让代码更清晰,而且效率更好。) 
    Make your own judgement whether you want to go for Descriptive Programming or Object Repository or mixed approach. Each approach has it own pros and cons that in turn is related to QTP performance.(使用OR要比DP快点。) 
    Unless absolutely required, uncheck the options “Save still image capture to results” and “Save movie to results” present under Tools > Options > Run tab. These options definitely have some bearing on QTP run time performance.(不要保存image和movie到测试结果中。) 
    Make the Run Mode as “fast”. This setting is present under Tool > Options > Run tab. Note: If you intend to run your scripts from QC no need to worry about this option, as the scripts WILL run in fast mode whether you want or not. (把运行模式设置为fast。) 
    If you are new to automation or QTP. Read this beginner article on Automation Object Model (AOM). AOM simplifies many aspects of QTP scripting. It can help you in controlling QTP from an external file. (通过AOM控制QTP。) 
    Make use of relative paths while calling reusable actions in your script. Using relative path would make your script. portable and easy to manage. (在调用Action时使用相对路径。) 
     

    可以使用下面的代码测试一下使用与不使用With语句在代码效率上的差异 :

    Dim StartTime, EndTime, StartTime1, EndTime1

     

    SystemUtil.Run "C:/Program Files/HP/QuickTest Professional/samples/flight/app/flight4a.exe"

     

    With Dialog("Login")

    .WinEdit("Agent Name:").Set "mercury"

    .WinEdit("Agent Name:").Type micTab

    .WinEdit("Password:").SetSecure "4864ede3f3f8f30757cf694e3e100d29bf1ea9b9"

    .WinEdit("Password:").Type micReturn

    End With

     

    StartTime = Timer

    For i=1 to 100

           Window("Flight Reservation").WinEdit("Name:").Set "Ankur"

    Next

    'With Window("Flight Reservation")

    'For i=1 to 100

    '.WinEdit("Name:").Set "Ankur"

    'Next

    'End With

    EndTime = Timer

    Print  EndTime - StartTime

     

     

     


    在测试WEB应用程序时,往往看到QTP运行速度比被测试的应用程序要快很多,往往都是QTP在等待页面加载完成。


    While working on a web applications using QTP, you may have noticed most of the time QTP runs too fast in comparison to the application. Moreover QTP would not perform. any operation on a particular page unless that page has loaded completely (100%). You may wonder in bewilderment about what to do to make the application (web page) load faster.

    如何让页面加载得更快呢?关键在于图片的加载。

    Here I would like to give you a simple tip to alleviate your pain (and waiting time) a bit.

    If you will notice carefully, most of the times text on a web page renders very quickly. It is the images that creates problem and increases the web page loading time. What if we can stop the images from loading altogether?


    All browsers provides this facility whereby you can stop pictures from showing. To do this in IE6, go to Tools > Internet Options > Advanced tab. Scroll down to ‘Multimedia’ section and uncheck ‘Show pictures‘.

     

    To do this in Firefox, go to Tools > Options > Content. Uncheck ‘Load Images automatically‘


    Run your script. now and let us know if this tip helped you. [For obvious reasons, this tip won't be of any use when you have to work on image/bitmap checkpoints.]

    当然,如果考虑到图片检查点的话,这个技巧就没用了。
  • fireevent

    2013-03-15 17:42:16

    QTP Web操作时,当鼠标移到某个对象上时,才会出现对应的操作,而这些都是通过JS来实现的,所以使用Click事件,无法成功达到我们想要的结果。 

      还好,对应JS中的FireEvent方法,QTP中也有对应的,它支持的事件 

      有:onchange, onclick,ondblclick, onblur, onfocus, onmousedown, onmouseup,

             onmouseover, onmouseout, onsubmit,onreset, onpropertychange。

      对上述情况,使用onmouseover即可实现,当onmouseover完成之后,再去执行接下来的操作,就能顺利通关了。

    灵活运用FireEvent可以实现JS多样性的操作。

  • VBScript操作Excel

    2013-01-10 15:09:07

    以下是一些VBScript操作Excel的实例,比如如何通过VbS打开Excel,新建Excel、Sheet,删除

    Sheet,另存Excel文件,在指定的Sheet Cells中写入以及读取Sheet中usedRange中的内容。

     

    '==========================================================================
    ' VBScript. Source File -- Created with SAPIEN Technologies PrimalScript. 4.1
    ' NAME:Example1
    ' AUTHOR: Weibin , cpic-ing
    ' DATE  : 2011-1-31
    ' COMMENT: 打开Excel文件
    '==========================================================================
    Dim xlsApp,xlsWorkBook,xlsSheet
    Dim iRowCount,numAdd
    Set xlsApp = CreateObject("Excel.Application") '创建Excel对象
    xlsApp.Visible = True 'true 为显示excel对象,false为不显示
    Set xlsWorkBook = xlsApp.Workbooks.Open ("d:\data.xls") '打开指定路径的Excel表格
    Set xlsSheet = xlsWorkBook.Sheets("sheet1") '选择指定Sheet1
    iRowCount = xlsSheet.usedRange.Rows.Count '获取sheet中有内容的Rowcount行数
    For iLoop = 2 To iRowCount
    numAdd = xlsSheet.Cells(iLoop,1) '取Cells中的值
    MsgBox iLoop '显示第一列从第二行开始到iLoop行为止。
    Next
    xlsWorkBook.Save
    xlsWorkBook.Close
    xlsApp.Quit
    Set xlsApp = Nothing  '释放Excel对象
    Set xlsWorkBook = Nothing '释放内存
    Set xlsApp = Nothing '释放内存


    '==========================================================================
    ' VBScript. Source File -- Created with SAPIEN Technologies PrimalScript. 4.1
    ' NAME:Example2
    ' AUTHOR: Weibin , cpic-ing
    ' DATE  : 2011-1-31
    ' COMMENT: 打开Excel文件
    '==========================================================================
    rem 打开Excel文件,Excel及sheet2需预先建立,不然找不到要打开的文件
    Dim xlsApp,xlsWorkBook,xlsSheet
    Set xlsApp = CreateObject("Excel.Application") '创建Excel对象
    Set xlsWorkBook = xlsApp.Workbooks.Open ("d:\weibin\2010.xls")'打开指定路径的Excel表格
    xlsApp.Visible = True 'true 为显示excel对象,false为不显示
    Set xlsSheet = xlsApp.Sheets.Item("Sheet2")'选择指定Sheet2
    xlsWorkBook.Save '保存工作
    'xlsApp.Quit '退出Excel对象
    Set xlsApp = Nothing  '释放Excel对象
    Set xlsWorkBook = Nothing '释放内存
    Set xlsApp = Nothing '释放内存


    rem 将上面的一段程序封装成Function函数,Exel文件路径作为参数。
    Function OPenExcelFile(FilePath)
    Dim xlsApp,xlsWorkBook,xlsSheet
    Set xlsApp = CreateObject("Excel.Application") '创建Excel对象
    Set xlsWorkBook = xlsApp.Workbooks.Open (FilePath)'打开指定路径的Excel表格
    xlsApp.Visible = True 'true 为显示excel对象,false为不显示
    Set xlsSheet = xlsApp.Sheets.Item("Sheet2")'选择指定Sheet2页
    xlsWorkBook.Save '保存工作表
    'xlsApp.Quit '退出Excel对象
    Set xlsApp = Nothing  '释放Excel对象
    Set xlsWorkBook = Nothing '释放内存
    Set xlsApp = Nothing '释放内存
    End Function


    '==========================================================================
    ' VBScript. Source File -- Created with SAPIEN Technologies PrimalScript. 4.1
    ' NAME:Example3
    ' AUTHOR: Weibin , cpic-ing
    ' DATE  : 2011-1-31
    ' COMMENT: 另存Excel文件
    '==========================================================================
    rem 新建Excel文件并保存到一个指定位置,并在Sheet2中写入值
    Dim xlsApp,xlsWorkBook,xlsSheet
    Set xlsApp = WScript.CreateObject("Excel.Application") '定义一个Excel对象
    Set xlsWorkBook = xlsapp.Workbooks.Add '新建一Excel实例
    xlsApp.Visible = True '显示Excel对象
    Set xlsSheet = xlsApp.Sheets.Item(2) '获取工作簿的第二个Sheet页
    ' xlsApp.Sheets.Item(2).Select '与上一句有相同的功能
    xlsSheet.Cells(1,1).Value = "Hello World!" '在单元格录入Hello World
    xlsApp.ActiveWorkbook.SaveAs ("d:\test.xls") '保存工作表
    xlsApp.Quit '退出
    Set xlsSheet = Nothing '释放内存
    Set xlsWorkBook = Nothing '释放内存
    Set xlsApp = Nothing '释放内存


    rem 将上面的一段程序封装成Function函数,Exel文件路径作为参数。
    Function CreateExcelFile(FilePath)
    Dim xlsApp,xlsWorkBook,xlsSheet

    Set xlsApp = WScript.CreateObject("Excel.Application") '定义一个Excel对象
    Set xlsWorkBook = xlsapp.Workbooks.Add '新建一Excel实例
    xlsApp.Visible = True '显示Excel对象
    Set xlsSheet = xlsApp.Sheets.Item(2) '获取工作簿的第二个Sheet页
    ' xlsApp.Sheets.Item(2).Select '与上一句有相同的功能
    xlsSheet.Cells(1,1).Value = "Hello World!" '在单元格录入Hello World
    xlsApp.ActiveWorkbook.SaveAs (FilePath) '保存工作表
    xlsApp.Quit '退出

    Set xlsSheet = Nothing '释放内存
    Set xlsWorkBook = Nothing '释放内存
    Set xlsApp = Nothing '释放内存
    End Function


    '==========================================================================
    ' VBScript. Source File -- Created with SAPIEN Technologies PrimalScript. 4.1
    ' NAME:Example4
    ' AUTHOR: Weibin , cpic-ing
    ' DATE  : 2011-1-31
    ' COMMENT: 添加新的Sheets并且命名另存
    '==========================================================================
    rem excel新建,sheet新建,重命名后另存
    Dim xlsApp,xlsWorkBook,xlsSheet
    Set xlsApp = WScript.CreateObject("Excel.Application") '新建一Excel实例
    xlsApp.Visible = True '显示Excel对象
    Set xlsWorkBook = xlsapp.Workbooks.Add()  '新建一Excel实例
    Set xlsSheet = xlsWorkBook.Sheets.Add() '新建一新Sheet
    xlsSheet.name "Practise" '新Sheet命名为Practise
    xlsSheet.activate '激活sheet
    xlsSheet.range("A1:B5").Value = "Hello World" '在新sheet range A1至B5中中写入Hello World
    xlsApp.ActiveWorkbook.SaveAs "D:\weibin\Hope.xls" '保存Excel至D:\weibin
    xlsApp.Quit '退出
    Set xlsSheet = Nothing '释放内存
    Set xlsWorkBook = Nothing '释放内存
    Set xlsApp = Nothing '释放内存

    rem 封装AddSheets函数
    Function AddSheets(FilePath)
    Dim xlsApp,xlsWorkBook,xlsSheet
    Set xlsApp = WScript.CreateObject("Excel.Application") '新建一Excel实例
    xlsApp.Visible = True '显示Excel对象
    Set xlsWorkBook = xlsapp.Workbooks.Add()  '新建一Excel实例
    Set xlsSheet = xlsWorkBook.Sheets.Add() '新建一新Sheet
    xlsSheet.name "Practise" '新Sheet命名为Practise
    xlsSheet.activate '激活sheet
    xlsSheet.range("A1:B5").Value = "Hello World" '在新sheet range A1至B5中中写入Hello World
    xlsApp.ActiveWorkbook.SaveAs (FilePath) '保存Excel至D:\weibin
    xlsApp.Quit '退出
    Set xlsSheet = Nothing '释放内存
    Set xlsWorkBook = Nothing '释放内存
    Set xlsApp = Nothing '释放内存
    End Function
    AddSheets "c:\weibin\hope.xls"

     

    '==========================================================================
    ' VBScript. Source File -- Created with SAPIEN Technologies PrimalScript. 4.1
    ' NAME:Example5
    ' AUTHOR: Weibin , cpic-ing
    ' DATE  : 2011-1-31
    ' COMMENT: 删除新建Excel指定的Sheet
    '==========================================================================
    Rem 删除指定的Sheet1,设定不同的n,可以删除不同的Sheet
    Function DeleteSheet(n)
    Dim xlsApp,xlsWorkBook,xlsSheet
    Set xlsApp = WScript.CreateObject("Excel.Application") '新建一Excel实例
    Set xlsWorkBook = xlsapp.Workbooks.Add()  '新建一Excel实例
    xlsApp.Visible = True '显示Excel对象
    xlsWorkBook.Worksheets("Sheet"&n).Delete
    xlsApp.Quit '退出
    Set xlsSheet = Nothing '释放内存
    Set xlsWorkBook = Nothing '释放内存
    Set xlsApp = Nothing '释放内存
    End Function
    DeleteSheet(1)

     

    '==========================================================================
    ' VBScript. Source File -- Created with SAPIEN Technologies PrimalScript. 4.1
    ' NAME:Example6
    ' AUTHOR: Weibin , cpic-ing
    ' DATE  : 2011-1-31
    ' COMMENT: 创建,写入,保存Excel文件
    '==========================================================================
    Function CreateWriteSaveAsExcelFile(n,i,j,FilePath)
    Dim xlsApp,xlsWorkBook,xlsSheet
    Set xlsApp = WScript.CreateObject("Excel.Application") '新建一Excel实例
    Set xlsWorkBook = xlsApp.Workbooks.Add()  '新建一Excel实例
    xlsapp.Visible = True '显示Excel对象
    Set xlsSheet = xlsApp.Sheets.Item(n) '获取工作簿的第二个Sheet页
    ' xlsApp.Sheets.Item(2).Select '与上一句有相同的功能
    ' xlsWorkBook.Worksheets("Sheet1").activate '与上一句有相同功能
    xlsSheet.Cells(i,j).Value = "For Testing" '在单元格录入For Testing
    ' xlsWorkBook.Worksheets("Sheet2").Cells(1,1).Value = "For Testing" '与上一句有相同功能
    xlsApp.ActiveWorkbook.SaveAs (FilePath) '保存工作表
    xlsApp.Quit '退出
    Set xlsSheet = Nothing '释放内存
    Set xlsWorkBook = Nothing '释放内存
    Set xlsApp = Nothing '释放内存
    End Function
    CreateWriteSaveAsExcelFile (1,2,2,"c:\weibin\Practice.xls")

    '==========================================================================
    ' VBScript. Source File -- Created with SAPIEN Technologies PrimalScript. 4.1
    ' NAME:Example7
    ' AUTHOR: Weibin , cpic-ing
    ' DATE  : 2011-3-10
    ' COMMENT: 比较InsuredNo,若相同写入新创建的Sheet中

    '==========================================================================
    Option Explicit
    On Error Resume Next
    '定义相关变量
    Dim xlsApp,xlsWorkBook,xlsSheet
    Dim iRowCount
    Dim a()
    Dim b()
    Dim oLoop,xLoop,jLoop
    Dim i
    Dim rowCount

    Set xlsApp = CreateObject("Excel.Application") '创建Excel对象
    xlsApp.Visible = True 'true 为显示excel对象,false为不显示
    Set xlsWorkBook = xlsApp.Workbooks.Open ("d:\tmp001.xlsx") '打开指定路径的Excel表格
    Set xlsSheet = xlsWorkBook.Sheets.add()'
    xlsWorkBook.ActiveSheet.Name = "Collection"
    xlsSheet.Cells(1,1).Value = "InsuredNo"
    xlsSheet.Cells(1,2).Value = "ContNo"
    xlsWorkBook.ActiveSheet.Rows(1).Font.Bold = True

    Set xlsSheet = xlsWorkBook.Sheets("SQL Results") '选择指定Sheet1
    iRowCount = xlsSheet.usedRange.Rows.Count '获取sheet中有内容的Rowcount行数

    '声明动态数组变量并分配或重新分配存储空间
    WScript.Echo "通知:声明动态数组变量并分配或重新分配存储空间开始,请等待!"
    ReDim a(iRowCount-2)
    ReDim b(iRowCount-2)
    WScript.Echo "通知:声明动态数组变量并分配或重新分配存储空间成功!"

    '文件中逐行读取,并记录数到组a,b中
    WScript.Echo "通知:读取InsuredNo和ContNo到数组a,b开始!,读取完后有提示,请耐心等待!"
    For Loop = 0 To iRowCount - 2
    a(oLoop)= xlsSheet.Cells(oLoop + 2,27).Value
    b(oLoop)= xlsSheet.Cells(oLoop + 2,3).Value
    Next
    WScript.Echo "通知:读取InsuredNo和ContNo到数组a,b成功!"
     
    ' 比较InsuredNO
    WScript.Echo "通知:数据筛选开始,请耐心等待!"
    Set xlsSheet = xlsWorkBook.Sheets("Collection") '选择指定Sheet1
    For xLoop = 0 To iRowCount - 2
    For jLoop = xLoop + 1 To iRowCount - 2
    If a(xLoop) = a(jLoop) Then
    xlsApp.Worksheets("Collection").Cells(xLoop + 2,1).Value = a(jLoop)
    xlsApp.Worksheets("Collection").Cells(xLoop + 2,2).Value = b(jLoop)
    End If
    Next
    Next
    WScript.Echo "通知:数据筛选完成,并写入Excel中成功!"
    xlsWorkBook.Save
    xlsWorkBook.Close
    xlsApp.Quit
    Set xlsApp = Nothing  '释放Excel对象
    Set xlsWorkBook = Nothing '释放内存
    Set xlsSheet = Nothing '释放内存
    WScript.Echo "通知:保存并关闭Excel,释放内存成功!"

  • getElementById()

    2013-01-07 16:52:58

    getElementById:
    语法: document.getElementByIdx_x(id)
    参数: id :必选项为字符串(String)
    返回值:对象; 返回相同id对象中的第一个,如果无符合条件的对象,则返回 null
    example:document.getElementByIdx_x("id1").value;
    getElementsByName:
    语法: document.getElementsByName(name)
    参数: name :必选项为字符串(String)
    返回值:数组对象; 如果无符合条件的对象,则返回空数组
    example:document.getElementsByName("name1")[0].value;
    document.getElementsByName("name1")[1].value;


    getElementsByTagName:
    语法: object.getElementsByTagName_r(tagname) object可以是document或event.srcElement.parentElement等
    参数: tagname:必选项为字符串(String)
    返回值:数组对象; 如果无符合条件的对象,则返回空数组
    example:document.getElementsByTagName_r("p")[0].childNodes[0].nodeValue;
    document.getElementsByTagName_r("p")[1].childNodes[0].nodeValue;

    --------------------------------------------------------------------------------
    getElementsByTagName_r() 不只是用在全局,更多的用法是:
    obj.getElementsByTagName_r();
    obj可以是任何对象。
    --------------------------------------------------------------------------------
    var all = document.getElementsByTagName_r('div')[0].getElementsByTagName_r('*');
    就是取document.getElementsByTagName_r('div')[0]这个节点下边的所有。
    准确的说应该是所有Element类型的节点,不包括TextNode类型的节点。
    getElementsByTagName_r('*') *就像通配符一样,表示所有的TagName。
    --------------------------------------------------------------------------------
    document.getElementsByTagName_r('ul')[0].childNodes就是li的数组
    它的长度就是li的个数
  • QTP经验总结

    2012-12-05 22:59:56

    1、拆分语句split
    例:取得当前日期后拆分
    riqi=date()
        my=split(riqi,"-")
        riqi=my(1)&"月"&my(2)&"日" 
        datatable("riqi",DtGlobalSheet)=riqi
        本地表:DataTable("a", dtLocalSheet)
    riqi= year(date)& "-" & Right("0"& month(date),2) & "-"&Right("0"&   Day(Date),2)

    2、取得表格中某行某列的值GetCellData
    例:飞机票取票价
    shuA=Browser("Welcome: Mercury Tours").Page("Book a Flight: Mercury").WebTable("New York to Zurich").GetCellData(3,3)


    3、取距某年某月某日的天数datediff
    例:计算距2008-08-08奥运天数
    datediff("d",now,"2008-8-8")


    4、描述性编程text:=
    例:取得某页面上某文字的链接
    Browser("").Page("").Link("text:=娱乐").Click
         或
         neirong="娱乐"
         Browser("").Page("").Link("text:="&neirong).Click


    5、网页中HTML编辑器的录制
    功能:验证126邮箱的发信功能正确
    操作步骤:
          a.录制脚本,动作包括整个发信的过程。
          b.修改脚本,在输入信件主题代码后加wait 10语句
           c.回放脚本,观察在邮件正文中输入的内容,回放时QTP是否写入
          d.重新修改脚本,保证回放时QTP在邮件正文中写入内容

    英文解决方案:
        Browser("网易126免费邮--你的专业电子邮局").Page("网易电子邮箱 - xueqinzhaoqing@126.co").Frame("indexFrame").WebEdit("subject").Click
        wait 1
         Setting.WebPackage( "ReplayType")=2      '配置使用浏览器事件或鼠标运行鼠标操作的'方式.1 - 使用浏览器事件运行鼠标操作,2 - 使用鼠标运行鼠标操作。
         Set ōbj=createobject("wscrīpt.shell") 
         obj.sendkeys "{TAB}"
         wait 2 
         obj.sendkeys "abc1111"
         wait 1
         Setting.WebPackage( "ReplayType")=1
    中文解决方案

    strCopy = "软件测试." 
    Set ōbjIE = CreateObject("InternetExplorer.Application") 
    objIE.Navigate("about:blank") 
    objIE.document.parentwindow.clipboardData.SetData "text", strCopy 
    objIE.Quit

    wait 1
    Setting.WebPackage( "ReplayType")=2
    Set ōbj=createobject("wscrīpt.shell") 
    obj.sendkeys "{TAB}"
    wait 2 
    obj.sendkeys "^v"
    wait 1
    Setting.WebPackage( "ReplayType")=1

    6.使用Multi Test Manager添加文件时可以直接往里拖的哦。

    7.函数:新建记事本,改名为public.vbs例:
       function ZHIRSS
    ZHIRSS="RSS行业资讯分类维护"
    end function
    使用语句executefile "d:\zhaopin\case\denglu.vbs"或设置QTP test/settings/resources/+函数目录

    8.设置动作循环:右击/actiong call properties/run on all rows

    9.设置动作允许被调用:右击/action properties/general/reusable action打勾

    10.QTP与MTM连接:Tools/option/run/allow other mercury products to run...

    11.插入已存在的动作1)insert/call to copy of action...复制可修改
                       2)insert/call to existing of action...复制不可修改

    12.QTP报告自动跳出设置:Options>Run>View results when run session ends

    13.判断表格是否存在:
    If Browser("数商3.0后台管理系统").Page("Page").Frame("main_5").WebTable("标题").Exist then
    reporter.ReportEvent 0,"pass","系统显示了所有的资讯列表!"
    else
    reporter.ReportEvent 1,"fail","系统没有显示资讯列表!"
    end if

    14.获取表格行数:Browser("数商3.0后台管理系统").Page("Page").Frame("main_5").WebTable("标题").RowCount

    15.注释脚本存在位置:qtp/dat/ActionTemplate.mst

    16取本地文件名称Function ShowFileList(folderspec)
       Dim fso, f, f1, fc, s
       Set fso = CreateObject("scrīpting.FileSystemObject")
       Set f = fso.GetFolder(folderspec)
       Set fc = f.Files
       For Each f1 in fc
          s = s & f1.name 
          s = s &   " "
       Next
       ShowFileList = s
    End Function
    wenjian=ShowFileList("D:\下载\本地下载1\")

    17.取本地文件删除:del= DeleFile("D:\下载\本地下载1\")
    Function DeleFile(folderspec)
       Dim fso, f, f1, fc, s
       Set fso = CreateObject("scrīpting.FileSystemObject")
       Set f = fso.GetFolder(folderspec)
       Set fc = f.Files
       For Each f1 in fc
             f1.delete
       Next
    End Function

    18.sousuo2=Browser("Browser").Page("Page_4").Check (CheckPoint("2007-11-08 14:21"))
    If (sousuo2)eqv(true) Then
        reporter.ReportEvent 0,"",""
    else 
       reporter.ReportEvent 1,"",""
    End If

    19.取参数化数据的行数,只在某几行进执行某些语句
    row=datatable.GetSheet(3).getcurrentrow
    If row = 3 Or row = 4 Then

    20.单选框置灰zhihui=Browser("下载中心--新增下载文件").Page("下载中心--新增下载文件_4").WebRadioGroup("downloadType").GetROProperty("disabled")
    If zhihui=1 Then
    End If

    29.取树结构
    Set Desc=descrīption.create
    Desc("miclearcase/" target="_blank" >cclass").value="WebTable"
    Set List=Browser("Browser").Page("Page").Frame("main").ChildObjects(Desc)
    yuqi=List(0).GetROProperty("innertext")
    msgbox yuqi
    yuqi=split(yuqi," ")
    msgbox yuqi(1)

    30.关闭所有IE
    SystemUtil.CloseProcessByName("iexplore.exe")

    31.创建action template.
        当希望在每一个新建action时都增加一些头部说明,比如作者、创建日期、说明等,用action template
        来实现最简单快捷。
        方法:用记事本等文本编辑器,输入如下类似的内容:
              'Company: xxxx
              'Author: xxx
              'Product: xxx
              'Date: xx
             然后将文件保存为ActionTemplate.mst,并存放到QTP安装目录下的dat目录。

    32.启动IE的语句:SystemUtil.Run "iexplore.exe", "http://www.***.com" 
       关闭IE或其他程序的语句:SystemUtil.CloseProcessByName "app.exe"
         or SystemUtil.CloseProcessByWndTitle "Some Title"

    33.获取图片的名称
    ObjectName = Browser(…).Page(…).Image("Find").GetProperty("Name")

    34.检查某个对象是否存在,如果存在弹出对话框说明对象存在。
    If Browser("Browser").Page("Page").Applet("login.html").JavaEdit("username").Exist Then
    MsgBox("The object exists.")
    End if

    35.同步点
    Browser("数商3.0制作平台").Dialog("Microsoft Internet Explorer").WaitProperty "visible", True, 120000
    设置test/test settings/object synchronizationg timeout 一致

    36.视图框显示为乱码时:调整原页面编码,在QTP/tools/change active screen

    37.添加附件:
       Browser("**").Page("**").WebFile("filePath").Click
    Browser("**").Dialog("**").WinEdit("文件名(N):").Set "D:\**.jpg"
    Browser("下载中心--新增下载文件").Dialog("选择文件").WinButton("打开(O)").Click
    添加相应的对象


    38.在图片上右击添加:tools/web event recording configuration/custom settings
    webedit/event/add/onblur,onchange,onfocus,onpropertychan,onsubmit
    webdlement/event/add/onclick,onmousedown,onmouseup/listen always

    39.数据执行保护
    方法一、右击我的电脑/高级/性能/设置/数据执行保护/为除下列选定程序之外的所有程序和服务启用DEP/添加被保护的程序。
    方法二、C:/BOOT.INT修改noexecute=alwaysoff

    40.在图片上右击添加:tools/web event recording configuration/custom settings
    webedit/event/add/onblur,onchange,onfocus,onpropertychan,onsubmit
    webdlement/event/add/onclick,onmousedown,onmouseup/listen always

    41.去掉前后空格
    If trim(mingcheng)=trim(yuqi) Then

    42.分类树问题解决
    Set Desc=descrīption.create
    Desc("micclass").value="WebTable"
    Set List=Browser("Browser").Page("Page").Frame("main").ChildObjects(Desc)
    yuqi=List(0).GetROProperty("innertext")
    msgbox yuqi
    yuqi=split(yuqi," ")
    msgbox yuqi(1)


    43.引用自定义环境变量
    Environment.LoadFromFile "D:\询价\case\环境\huiyuan.xml"

    44. 环境变量有2种,一种是QTP的内置变量,一种是用户自定义的变量。内置变量是可以直接就可以用,自定义环境变量需要在菜单中选择“文件”——> “设置”——>“环境”,在变量类型中选择“用户自定义”,然后进行添加,可以对添加的变量全部导出,导出的文件为.xml格式的文档。既然可以导 出,那么必然可以导入.xml文件,你可以在该对话框中的选中“从外部文件导入”,然后添加其文件路径即可。(当然这些操作都可以直接使用脚本来实现, 如:Environment.LoadFromFile(“FileName”))
    例如:在桌面建立一个Var.xml,如下
    -<Environment>    //以这个开始的内部都是定义环境变量,直到以</Environment>结束
    - <Variable>                           // 变量定义起始标识
                     <Name>aa</Name>               // 变量名称 
                     <Value>11</Value>               // 变量值
            </Variable>                            // 变量定义结束标识
    - <Variable>
                     <Name>bb</Name> 
                     <Value>22</Value> 
            </Variable>
    - <Variable>
                     <Name>cc</Name> 
                     <Value>33</Value>


                  </Variable>
    </Environment>
    然后导入本测试的环境变量文件中,在专家视图里编写下面的脚本代码:
    Dim aParam3
    aParam3=Environment.Value(“aa”)          // 调用环境变量
    msgbox aParam3
    运行测试,会输出”11”

    45.在HTML编辑器中写入数据
    用低水平录制写入编辑器过程,增加编辑部器前的对象,加入click事件,再用TAB
    例如:
    Browser("广告管理").Page("广告管理").WebEdit("descrīption").Click
    Window("Microsoft Internet Explorer").WinObject("Internet Explorer_Server").Type mictab
    Window("Microsoft Internet Explorer").WinObject("Internet Explorer_Server").Type "aaa"

    46.Browser("creationtime:=1").close
       两个页面title相同无法识别时使用描述必编辑
        Browser("creationtime:=1").page(title:=****).WebEdit("name:=***").Set "***"
        或Browser("creationtime:=1").page(index:=1).WebEdit("index:=0").Set "***"

    47.场景恢复:
       当某些提示框会在不定期时有提示时,如果自动点击确定或某些按钮
       1、tools/recovery scenaril manager,制作相应的提示框和要点击的按钮,并保存
       2、test/settings/recovery,添加刚保存的.qrs

    48.输入验证码,先提示一个输入框,在输入框内输入验证码,点击[确定],把输入的验证码框
       Dim a
    a = InputBox("输入名字")

    49.对象库中对象名称不分为_2,_3...设置:tool/options/web/page/fram options/
         crate a new page test object for为different test object descrīptons
         crest a new frame. test object for为different test object descrīptions

    50.验证测试输入框输入的最大允许字数功能的正确

    QTP脚本代码中编写
    Set aa=Browser("Browser").Page("Page").Frame("main").WebEdit("PayTypeName")
    if konglen(aa,20) eqv true then 
    reporter.ReportEvent 0,"添加支付方式,支付方式输入框允许输入的最大字符功能正确",""
    else
    reporter.ReportEvent 1,"添加支付方式,支付方式输入框允许输入的最大字符功能错误",""
    end if

    此函数的功能为:验证测试输入框输入的最大允许字数功能的正确,函数可写在public.vbs中
    Function konglen(duixiang,guifanshu)
    duixiang.Click
    wait 1
    Setting.WebPackage( "ReplayType")=2
    Set ōbj=createobject("wscrīpt.shell") 
    i=0
    ōld="a"
    xin="b"
    while old<>xin
    ōld=duixiang.GetROProperty("value")
    i=i+1
    wait 0,20
    obj.sendkeys "1"
    wait 0,20
    xin=duixiang.GetROProperty("value") 
    wend
    'msgbox i 
    If i-1=guifanshu Then
    konglen=true
    else 
    konglen=false
    End If
         Setting.WebPackage( "ReplayType")=1
    End Function

    51.超时设置:Setting("DefaultTimeout") =1000000

    52.共享对象库:Set App = CreateObject("QuickTest.Application")
    App.Test.Settings.Resources.ObjectRepositoryPath = "path"

    53.取颜色   browser("b").page("p").Object.currentStyle“:.color 
    54.显示行号设置:Tools- --> Editor Options...-->General-->Show line number,


    55.不同数据库检查点手动SQL写法
    QTP插入数据库检查点,手动指定SQL语句的写法。
    一、SQL Server格式(本地无需安装SQL Server)
    connectionstring(连接字符串):
    1.本地没有创建数据源的方式
    DRIVER=SQL Server;SERVER=数据库IP地址;UID=用户名;PWD=密码;APP=Microsoft Office 2003;WSID=本地主机名;DATABASE=数据库名

    实例:
    DRIVER=SQL Server;SERVER=10.160.11.10;UID=sa;PWD=sa;APP=Microsoft Office 2003;WSID=RJHLJUN;DATABASE=dcwork

    2.本地已创建数据源的方式
    DSN=数据源名称;UID=用户名;PWD=密码;APP=Microsoft Office 2003;WSID=数据库的主机名;DATABASE=数据库名

    实例:
    DSN=LocalServer;UID=sa;PWD=sa;APP=Microsoft Office 2003;WSID=RJDCWORKTEST;DATABASE=dcwork

    3.SQL语句实例(从数据库表HR_LANGUAGE_TYPE中,查询字段语言名称LANGUAGE_NAME,条件语言名称=中文,按语言名称升序排序结果)
    source(SQL语句):
    SELECT HR_LANGUAGE_TYPE.LANGUAGE_NAME FROM dcwork.dbo.HR_LANGUAGE_TYPE HR_LANGUAGE_TYPE WHERE (HR_LANGUAGE_TYPE.LANGUAGE_NAME='中文') ORDER BY HR_LANGUAGE_TYPE.LANGUAGE_NAME


    二、DB2格式:(本地至少安装DB2 Run-Time Client Lite)
    connectionstring(连接字符串):
    1.本地没有创建数据源的方式
    DRIVER={IBM DB2 ODBC DRIVER};UID=用户名;PWD=密码;MODE=SHARE;DBALIAS=数据库名;

    实例:
    DRIVER={IBM DB2 ODBC DRIVER};UID=db2admin;PWD=db2admin;MODE=SHARE;DBALIAS=DCWORK;

    2.本地已创建数据源的方式
    DSN=数据源名称;UID=用户名;PWD=密码;MODE=SHARE;DBALIAS=DCWORK;

    实例:
    DSN=DWCORKDB2;UID=db2admin;PWD=db2admin;MODE=SHARE;DBALIAS=DCWORK;

    3.SQL语句实例
    source:SQL语句
    SELECT HR_LANGUAGE_TYPE.LANGUAGE_NAME FROM DB2ADMIN.HR_LANGUAGE_TYPE HR_LANGUAGE_TYPE WHERE (HR_LANGUAGE_TYPE.LANGUAGE_NAME='中文') ORDER BY HR_LANGUAGE_TYPE.LANGUAGE_NAME


    三、Oracle格式:(本地需要安装Oracle ODBC DRIVER)
    connectionstring(连接字符串):
    1.本地没有创建数据源的方式
    DRIVER={Oracle in OraHome92};SERVER=数据库服务名;UID=用户名;PWD=密码;DBQ=数据库名;DBA=W;APA=T;EXC=F;XSM= Default;FEN=T;QTO=T;FRC=10;FDL=10;LOB=T;RST=T;GDE=F;FRL=Lo;BAM=IfAllSuccessful;MTS=F;MDI=Me;CSR=F;FWC=F;PFC=10;TLO=O;

    实例:
    DRIVER={Oracle in OraHome92};SERVER=DCWORK;UID=DCWORK;PWD=DCWORK;DBQ=DCWORK;DBA=W;APA=T;EXC=F;XSM=Default;FEN=T;QTO=T;FRC=10;FDL=10;LOB=T;RST=T;GDE=F;FRL=Lo;BAM=IfAllSuccessful;MTS=F;MDI=Me;CSR=F;FWC=F;PFC=10;TLO=O;

     

    2.本地已创建数据源的方式
    DSN =数据源名称;UID=用户名;PWD=密码;DBQ=数据库名;DBA=W;APA=T;EXC=F;FEN=T;QTO=T;FRC=10;FDL= 10;LOB=T;RST=T;GDE=F;FRL=F;BAM=IfAllSuccessful;MTS=F;MDI=F;CSR=F;FWC=F;PFC=10;TLO=0;

    实例:
    DSN=dcworkoracle;UID=DCWORK;DBQ=DCWORK;DBA=W;APA=T;EXC=F;FEN=T;QTO=T;FRC=10;FDL=10;LOB=T;RST=T;GDE=F;FRL=F;BAM=IfAllSuccessful;MTS=F;MDI=F;CSR=F;FWC=F;PFC=10;TLO=0;

    3.SQL语句实例
    source:SQL语句
    SELECT HR_LANGUAGE_TYPE.LANGUAGE_NAME FROM DCWORK.HR_LANGUAGE_TYPE HR_LANGUAGE_TYPE WHERE (HR_LANGUAGE_TYPE.LANGUAGE_NAME='中文') ORDER BY HR_LANGUAGE_TYPE.LANGUAGE_NAME

     

    四, mysql
    Set Conn = CreateObject("ADODB.Connection" )
    str="DRIVER={MySQL ODBC 3.51 Driver};SERVER=192.168.1.100;DATABASE=wp_blog;user id=zzz ; password=123456" 
    Conn.open str
    Set Rs = CreateObject ("ADODB.Recordset" )
    sql = "select * from `wp_blog`.`blg_webcategory` limit 0, 5000;"
    Rs.open sql,conn,1,3 
    If (not Rs.eof) then
    Rs.MoveFirst
    MsgBox Rs(0)
    MsgBox Rs(1)
    MsgBox Rs(2)
    MsgBox Rs(3)
    end if

    Rs.close
    Set Rs = Nothing
    Conn.close
    Set Conn = Nothing 

    五. access

    Set Conn = CreateObject("ADODB.Connection" )
    str="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:/db1.mdb" 
    Conn.open str
    Set Rs = CreateObject ("ADODB.Recordset" )


    56.*.xml
    Environment.LoadFromFile "D:\新建文件夹\a.xml"
    Browser("百度一下,你就知道").Page("百度一下,你就知道").WebEdit("wd").Set Environment("HuiYuanB")

    57、类似时间控件,不能手到输入的文本档
       1)手工添加对象,
       2).object.value="2008-4-12"

  • 什么是ReplayType

    2012-12-05 22:59:25

    什么是ReplayType:

    ReplayType is QTP Web Add-in setting. It can be used to change how the events are replayed on the browser. There are two modes of ReplayType

    • Events (1) - Replay of events using the Browser methods (something similar to DOM).
    • Mouse (2) - Replay of events using the mouse and keyboard simulation.

     

    在QTP脚本中的使用方法:

    Setting.WebPackage("ReplayType") = 2 'Mouse
    Browser("KnowledgeInbox").Page("ReplayType").WebEdit("txtReplayType").Set "KnowledgeInbox"
    Browser("KnowledgeInbox").Page("ReplayType").WebButton("Type and enable me").Click
    Setting.WebPackage("ReplayType") = 1 'Events
  • 正则表达式

    2012-11-26 13:21:38

    ********************************************************************

    ******************************************************************
    Hi all, 如下正则表达式为编写自动化测试脚本常用的表达式。请参考

    http://www.jb51.net/tools/zhengze.htm
    ********************************************************************

    ******************************************************************

    需要转义的特殊字符
    $ ---> \$    
    ( ---> \(    
    ) ---> \)    
    * ---> \*    
    + ---> \+    
    . ---> \.    
    [ ---> \[    
    ] ---> \]    
    ? ---> \?      
    \ ---> \\   
    ^ ---> \^    
    { ---> \{    
    } ---> \} 

    解释:
    一、 
    特殊字符 注释 $ 匹配输入字符串结尾的位置。 
    若要匹配 $ 字符本身,请使用 /$。 
    二、 
    ( ) 标记子表达式的开始和结束。可以捕获子表达式以供以后使用。 
    若要匹配这两个字符,请使用 /( 和 /)。 
    三、 
    * 零次或多次匹配前面的字符或子表达式。 
    若要匹配 * 字符,请使用 /*。 
    四、 
    + 一次或多次匹配前面的字符或子表达式。 
    若要匹配 + 字符,请使用 /+。 
    五、 
    . 匹配除换行符 /n 之外的任何单个字符。 
    若要匹配 .,请使用 /。 
    六、 
    [ ] 标记中括号表达式的开始。 
    若要匹配这些字符,请使用 /[ 和 /]。 
    七、 
    ? 零次或一次匹配前面的字符或子表达式,或指示“非贪心”限定符。 
    若要匹配 ? 字符,请使用 /?。 
    八、 
    / 将下一字符标记为特殊字符、文本、反向引用或八进制转义符。 
    例如,字符 n 匹配字符 n。 
    /n 匹配换行符。序列 // 匹配 /,序列 /( 匹配 (。 
    九、 
    / 表示文本正则表达式的开始或结束。 
    若要匹配 / 字符,请使用 //。 
    十、 
    ^ 匹配输入字符串开始处的位置,但在中括号表达式中使用的情况除外,在那

    种情况下它对字符集求反。 
    若要匹配 ^ 字符本身,请使用 /^。 
    十一、 
    { } 标记限定符表达式的开始。 
    若要匹配这些字符,请使用 /{ 和 /}。 
    十二、 
    | 指出在两个项之间进行选择。 
    若要匹配 | ,请使用 /|


    1、匹配场景:匹配满足不包含“keyword”关键词
    关键词:keyword
    匹配表达式:^(?!.*?keyword).*$

    2、匹配场景:有且仅有关键词“keyword”,前后不能有空格或换行符
    关键词:keyword
    匹配表达式:^keyword$

    3、匹配场景:或关系 只要出现good或bad关键字,则为匹配
    关键词:good、bad
    匹配表达式:(good)|(bad) 或 (成功转交到)|(您有新的事务)

    4、匹配场景:并关系 出现good和bad关键字,则为匹配
    关键词:good、bad
    匹配表达式:.*good.*bad.*(注释:这是带顺序的)  使用(.*good.*bad.*)

    |(.*bad.*good.*)(注释:这是不带顺序的)
  • 浅谈自动化测试

    2012-11-26 13:18:09

    浅谈自动化测试

    [说明既然是“浅谈”,那当然是浅浅的谈了,再说了,深的我也谈不来^_^

          本文为本人个人结合自己在公司中的实践情况谈的一些感想,欢迎讨论,但不想理论。哎,实在是本人理论功底不好,而且懒于辩论。从初中开始,语文就没很好过- -

      自动化测试从广义上来说包括自动化功能测试、自动化性能测试、自动化安全测试、自动化单元测试等等。而我们日常常说的自动化测试一般是指自动化功能测试,本文主要也是从自动化功能测试角度考虑。

    [正文]

    说起自动化测试的强大,很多人起先的了解来自于测试论坛或者说来自于自动化测试工具厂商对工具的介绍。咱们先来看一段我因为需要而写的一段有关自动化测试的描述(不代表本人真实想法,这是因为有需要才为之的):

    自动化测试就是通过模拟手动测试步骤,执行用某种程序设计语言编制的测试程序,控制被测软件的执行,完成全自动或半自动测试的过程。自动化测试解决了功能测试不仅耗时且高成本的问题。采用自动化测试,企业可以将重点放在改进自动业务过程方面。开发和QA组可以增加测试过程的速度和精确度。整个IT部门可以获得更高的投资回报,而且降低了大量风险。

    这段话,个人感觉或许对于像微软这些大公司而言是对的,但就目前中国软件企业现状来说,自动化测试是不是像这段话说的这样真的很难说。单不说我们的定制项目战略与大公司的通用产品战略的差距,就我们公司的质量意识也能使这段话失效。就说以下这点,进行了程序修改后,需要对程序进行比较全面的测试这点,我们的很多公司就不做。原因很简单,上级认为这没有必要、而且是浪费时间,另一点,定制项目的利润可比通用产品少得多得多,哪有那么多钱让我们认真测试呢。而定制项目好像还是我们的主流。

    对于自动化测试,有这么一句总结的定义“利用程序测试程序”。这句话很简练吧,自动化测试归根到底也确实是这么个味道。利用工具、利用软件、利用小脚本等等都可以进行自动化测试。本人一直认为自动化测试是一种技术,是一种能力。既然是一种技术,那就不应该用太固定的框框把它限死了。应该是做到随需所用、依需而定。既然是一种能力,就应该用发散的思维去发挥它更多更大的作用。就像阅读这个能力,谁说一定要先划定中心思想,谁说一定要精读,更没人说一定要用三遍阅读法哦。阅读当然得根据读者的目的以及所读文章的特点,甚至是读者的水平来确定读此文章的方法。自动化测试也一样,不一定要用在回归测试上,也不一定要用在集成测试上。有时甚至可以写个小脚本用在解决功能人员测试难的小问题上。这不也是很好的自动化测试嘛。

    关于自动化测试工具,厂商说的可以说基本不可信。说什么“录制/回放”就可以实现,“简单得很”。要真相信这个,那你自动化测试的失败也会“快得很”。当然,微软所吹嘘的,要自己编程序来进行自动化测试,而不应该想着使用自动化测试工具来实现自动化测试。这个观点对于微软来说,应该是正确的。但是得看看微软什么现状:就微软的产品,有哪个自动化测试工具能支持得了全自动化测试的?再说了,微软的产品是全世界在卖,那质量要求高,而且利润更高,有的是钱请牛人来编写自动化测试程序。而且微软的人才也是我们这些公司不可企盼的。因此,如果有好的工具,甚至小工具或开源工具,只要能更好的解决公司中的问题,那何乐而不为呢?

    可以毫不客气的说,想要进行自动化测试,那还真得会编码。就拿易用性方面名声不错的QTP来说,要是不会编写VBScript脚本,要是不会综合应用QTP内置的对象和函数,要是不了解QTP支持的扩展,那么就是对QTP这个工具没有很深入的了解,那么如何做到能灵活应用呢。要是真碰到特殊问题,那很容易就GameOver了。我曾经拿几个自动化测试工具(如QTP9.2版、RFT7.1版、TestComplete5.0版)试了试一些基本的标准html页面的功能。有的没法完全回放成功,而如果要进行一些特殊的判断或处理,那“录制”基本就不可能了。而且,即使录制的都能成功回放,那能说明这就实现了自动化测试嘛?自动化测试重点还是在测试,要实现的是测试的目的,而不是在于几个工具的使用上。

    自动化测试是一种技术、是一种能力,它不是绑定在某种工具上的。在实际的实践中,发现一些自动化测试人员,在熟练掌握一个自动化测试工具后,非常的高兴,而且有点炫耀的味道。于是乎,本人就问他:“你以为会这个工具,你就会自动化测试了吗?你最多就算会这个工具,或精通这个工具,跟自动化测试无关。”(本人说话较直,总喜欢实话实说- -!)。这里要说的是,要注意自动化测试不是工具的必然。如果只是把自动化测试定位在一两个工具上,那这个人到头来可能会的不是自动化测试技术,而是工具。当然如果要直接从自动化测试技术入手,可能学起来会没有感观认识,而且进入那个自动化测试思维大门较难。因此,一般的学习和进阶方法可以如下:找一个或两个比较容易实现自动化测试的工具,进行深入的学习,并在项目中进行实践,等有一定实践经验后,自然会有一定的认识的。而这时就需要自己的思维脱离这些自动化测试工具,进而思考自动化测试技术的方方面面。然后当然就是可以试用其他的测试工具(强调一下,不要以为只有测试工具才能用于自动化测试,其他工具也可以的,只要那个工具提供的功能满足应用的需求,那就可以了),或自己编码实现一个小型工具(自动化测试人员是需要编程技术的),或直接用脚本语言编写执行程序等等。这时就是要根据要测试的内容能随心所欲的应用自动化测试了。

    接下来根据几个网友的讨论,谈点有关自动化测试框架的认识吧。在开展自动化测试时,没有必要去深究自动化测试框架到底是什么,要怎么定义。因为这个定义的话,估计还没人敢说他有标准的定义。而且即使有标准的框架要求,那我根据公司的自动化测试需要,加入一些东西也是可以的嘛。在应用自动化测试框架方面,个人感觉还是不要跟风的好。有人总喜欢有什么好的框架或功能齐全的框架,就要拿来用。当然并不是说这些框架不好,也不是说不能用。只是说在用时,请考虑一下,自己目前用这些框架真的好嘛?如果刚开展自动化测试,就拿封装度很高的框架来套上,这不仅会增加学习量(框架是要学习的),而且会使测试人员只对框架有概念,而对于原版的工具生疏,要真是碰到框架不好解决的问题,那到时就不好办了。个人感觉,适用自己公司自动化测试要求的框架是比较好的框架。这个框架,可以是开源的,可以是自己开发的,甚至前期可以就几个文件夹或者规范要求或者再加几个共享文件、几个通用脚本等等。

    自动化测试也是需要比较完备的规范的,不仅需要脚本规范,也需要适用公司的自动化测试流程规范。只有有了脚本规范,才能使合作开发的脚本更像一个整体,使后期的脚本维护相对容易些。自动化测试流程规范是相当重要的。流程规范需要确定如何与手工测试人员交互,如何获取需求,如何产生测试用例,如何开发自动化测试程序,如何使用自动化测试,如何分析结果等等。如果这些没有确定好,很容易使自动化测试不流畅,甚至于“破产”。

    公司中要实行自动化测试,上级领导和现有开发测试人员对质量的意识很重要。举个碰到过的小例子:系统在发布前,按理应该要进行比较完备的回归测试的。但目前的现状就是只进行简单跑跑看看。这对于手工测试来说,时间不太多。而如果用自动化测试来实现了比较完备的回归测试,时间也不见得比手工测试少,因为手工测试没有进行完备的回归测试呀。在对这点的认识上,手工测试人员和上级认为自动化测试确实没有节省时间,也没有产生效益(因为发现的问题几乎没有)。后来我只问了一句:“难道你们认为在发布前也应该找出一堆BUG吗?难道质量保证是没有效益的吗?”。在后来的自动化测试实现中,我当然是拒绝再为这种之前测试就不完备,而且还不被上级和手工测试人员所承认的功能实现自动化测试了。因为这很容易让上级和手工测试人员感觉自动化测试也就这样,还不如手工测试得了。久而久之,自动化测试基本就会被抛弃了。

    瞎扯了这么多,主要还是要说明,自动化测试不像厂商吹的那么强大、易用。具体还得自己去试试,就像小马过河不试怎么能知道呢。而且每个人的认识都会不一样的。最后说明一点,咱们国家现在更需要的是创新,而不是复制。当然创新性的应用也是创新呀。

  • 自动化测试用例设计的原则

    2012-11-26 13:14:43

    自动化测试用例设计的原则

    很多公司在实施自动化测试的过程中,往往会把所有的手工测试用例作为自动化测试用例,并且直接进行脚本的开发工作,甚至有些公司不写自动化测试用例,直接想当然地开发测试脚本,这些都是极其不规范的做法,甚至很有可能是导致最后自动化测试项目失败的最大原因。那么问题就来了,为什么不能使用手工测试用例完全替代自动化测试用例呢?有以下几点原因,同时也是自动化测试用例的设计原则

     ● 原则1:自动化测试用例的范围往往是核心业务流程或者重复执行率较高的。

      在选取自动化测试用例范围时,很多测试工程师或者上级领导可能心里会过分依赖自动化测试,会认为自动化测试就应该覆盖所有的手工测试用例,自动化测试的覆盖率就应该达到百分之百。其实恰好相反,这样的想法往往会导致自动化测试最终失败。在一些大型项目中,往往测试用例的数量会很庞大,而且如果遇到一些繁杂的被测程序(特别是C/S架构),脚本开发工作往往会相当耗时间,并且很多测试用例甚至根本就不能通过自动化来实现。举些例子,现在很多公司自动化测试都是刚起步,对自动化测试的了解程度只是停留在字面上,在公司对测试也不是非常重视的情况下,当然不太愿意去花精力招一个具有自动化测试开发经验的工程师,很多还是停留在使用工具的录制回放功能来完成自动化测试。正是存在这样的技术限制情况下,往往在实施中,会出现很多录制回放不能解决的问题,测试工具完全无法识别测试对象,无法识别一些特殊的加密测试控件。还有,如果项目的变更频率,测试用例数量大的话,增加了后期的维护工作量等,都是造成最终失败的一些隐患。投入越大,损失越大。因此,往往我们会选取最核心的一些业务路径或者是重复执行率较高的一些手工测试用例进行自动化测试,这样能够充分发挥出自动化测试的优势。

      ● 原则2:自动化测试用例的选择一般以“正向”为主。

      手工测试用例分正常情况和异常情况,在设计的时候,可能往往会去设计很多异常情况来验证程序是否有Bug,并且一个正常情况的测试用例往往会对应几十个非正常情况的测试用例,而每种异常情况的测试用例都会有各种各样的预期结果。在自动化测试中,很多人喜欢将正常情况称为“正向”;反之,异常情况则称为“反向”。下面,我们试想以下,如果将这些异常情况全部转化、反应到自动化测试脚本中,那肯定需要非常繁琐的判断才能做到。这个对于自动化测试工程师来说,其现有的工作量还是今后的脚本维护量都是不可小视的。对于整个自动化测试项目来说,如果每个异常情况都要写进脚本中,那真的是花了大价钱买一堆小东西,小东西真正能发挥大作用的毕竟很少。因此,真正在自动化测试项目实施中,往往会舍弃反向用例,个别比较重要的除外。使每个东西都能发挥其最大的作用才是企业最想看到的。功能自动化测试主要还是用于回归测试,回归测试的目的就是保证新增功能后老功能是否能够正常继续运作。而自动化测试则是让测试人员从繁琐又枯燥的重复手工测试中解放出来,这就是目的和目标。

      原则3:不是所有手工测试用例都可以使用自动化测试来实现的。

      这里纠正许多测试从业人员的一个错误观念,刚接触测试自动化的普遍都会认为手工测试用例全部要转化为自动化测试用例,但是在真正实施的时候,却发现很多测试用例是自动化无法实现的,或者有些测试用例根本就没有必要去自动化的。例如,有些用例会牵涉到硬件设备辅助的,最简单的例子就是用例执行过程中需要使用刷卡机才能获取卡号信息(如果有技术能力,当然不排除自行开发接口供测试工具调用,但毕竟能有技术实力做到这一步的不多,能有这样的重视程度的更不多);再比如,有些测试用例是需要与合作机构进行互动联调,联调时是需要和对方实时沟通,以及根据具体情况给予响应的,这些情况多数还是只能使用手工人为地来完成。当然,决定是否转化为自动化测试,必须事先有一个规范文档来定义哪些是需要转化为自动化测试哪些是不需要的,否则测试工程师就会不知所措,没有一个标准。一旦有了这个标准,自动化测试工程师就可以严格按照文档里的流程去完成需要转化部分的自动化测试用例的脚本开发工作了。

      原则4:手工测试用例可以不用回归原点,而自动化用例往往是必须的。

      很多有经验的自动化测试从业人员一定有这样的经历,很多时候脚本写完后,第一次执行没有任何问题,而第二次执行时立刻就会报错,原因就是没有回归原点。所谓回归原点就是执行的测试用例最终需要恢复其在执行前的初始状态,如果没有回归原点,就会把此脚本称之为死脚本。举个最简单的例子,比如添加用户功能,我们都知道每个用户名都是唯一的,当写完一个添加用户的脚本之后,执行第一次没有问题,因为执行前此用户还不存在,但是当执行第二次时,程序就会出现用户重复而报错,此时这个添加用户的脚本就失去了它的价值,在这种情况下,我们就需要在自动化测试用例的最后加上删除这个用户的步骤,这样在下次执行用例时就不会出现用户重复的情况了。当然,除了回归原点,还可以使用另一种方式进行,那就是初始化数据,比如ATM机取款,假设需要执行取款100元的操作,而银行卡余额是120元,当测试脚本第一次执行时可能没有任何问题,但是第二次系统就会报余额不足,这样就成为了死脚本,解决方案有两种:一种是直接进行初始化数据,每次执行用例之前都重置下余额(只需大于100即可);第二种方法可以在用例执行前,先查询下余额是否大于100,若大于等于则继续,若小于则做一笔充值100的操作,这样即可解决。两种方式可以看具体情况使用,数据初始化方便,但有时候初始化之后可能会影响到其他自动化测试用例的执行,而第二种方式相对在脚本上需要稍微花点功夫。究竟使用哪种方式还需要具体情况具体分析。总之,在执行自动化测试用例之前做好数据准备,这也是自动化测试的关键步骤。

      原则5:自动化测试用例和手工测试用例不同,不需要每个步骤都写预期结果。

      在手工测试用例的设计过程中,几乎每一个测试步骤都有一个预期结果。但是,在自动化测试用例的设计中并不采用,在自动化测试用例中,只有准备在测试脚本中设置成检查点的步骤才有预期结果,其他所有的步骤只将它看作一个步骤,这样做的好处是一目了然、目的明显、层次分明,以后写测试脚本直接跟着自动化测试用例就行了。因为经过前面的探讨应该已经知道,自动化测试中并不是所有的东西都需要验证的。所以,作者在前面的章节中也提到过,基本上手工测试用例多多少少都要进行一些转换的,就是因为它们之间的格式是不一致的。举一个简单的例子,假设需要设计一个注册页面的自动化测试用例,有10几个表单需要填写,在手工测试用例中,每个表单的填写都一定会有预期结果,因为它的确在检查每一项是对了还是错了,只是用的是你的眼睛在检查而已,所以速度非常的快,甚至你自己潜意识都忽略了其实你已经检查了。但是,在自动化测试中,我们知道如果你要检查,那一定需要写代码,如果每项都检查,那代码量有多大是可想而知的,不是说做不到,只是这样做根本不符合自动化测试的特点。所以,绝大部分时候,这些在自动化测试中可有可无的检查,我们全部不检查,只当做一个业务流程和步骤,是不需要设立预期结果的。

  • QTP模拟鼠标键盘事件

    2012-11-23 18:05:22

    1 鼠标事件
    1.1 使用自带的Click方法
    每个对象都有自带的Click方法,通过其中第三个参数指定具体的鼠标事件(左键、右键、中建)
    例如: Browser("New Page").page("New Page").WebElement("html tag:=Form").Click 0,0,micRightBtn
    注意:Click方法的前两个参数是相对坐标,即相对于对象控件左上角的坐标。
    然而执行脚本时常常发现右键功能无法回放,常常被当做左键处理。这需要通过设置回放级别解决。
     Setting.WebPackage("ReplayType") = 2    '根据鼠标事件回放
     Browser("百度一下,你就知道").Page("百度一下,你就知道").WebEdit("wd").Set "张三"
     Browser("百度一下,你就知道").Page("百度一下,你就知道").WebButton("百度一下").Click 0,0,micRightBtn
     wait 3
     Setting.WebPackage("ReplayType") = 1  '根据键盘事件回放

    1.2 使用自带的FireEvent方法
    Browser("百度一下,你就知道").Page("百度一下,你就知道").WebButton("百度一下").FireEvent "click",0,0,micRightBtn
    具体使用参考QTP的帮助吧,需要提醒一下,右键菜单的弹出对应的是"oncontextmenu"事件,这个帮助里没有提到,当然依赖于开发的代码实现。
    1.3 使用Windows底层的mouse_event
    如果上面的方法仍然不管用,就要采用更底层的方法了。不过这种方式不推荐,因为mouse_event识别的是绝对坐标,你还需要在调用mouse_event前获

    取对象的绝对坐标。需要说明的是,如果没有使用MOUSEEVENTF_ABSOLUTE,函数默认的是相对于鼠标当前位置的点,用0,0表示,会被认为是当前鼠标

    所在的点。
    Extern.Declare micVoid, "mouse_event", "user32.dll", "mouse_event", micByte,micByte,micDWord,micULong
    Extern.mouse_event MOUSEEVENTF_RIGHTDOWN,0,0,0
    1.4 使用mercury.devicereplay
      Set devReplay = CreateObject("mercury.devicereplay")
      devReplay.MouseClick absx+4,absy+4,2
    2 键盘事件
    2.1 SendKeys
    最常用的模拟键盘操作的事件就是SendKeys了,具体说明一样参考QTP的帮助。
    需要说明的是QTP帮助中的例子,需要做一些调整,QTP中执行不需要显示指定Wscript执行shell命令,否则会报错。正确的例子如下:
     Set WshShell = CreateObject("WScript.Shell")
     WshShell.SendKeys "{DOWN}" 
     WshShell.SendKeys "{CAPSLOCK}"
     wait 3
     WshShell.SendKeys "{CAPSLOCK}"
    当然我们也可以先定义一个function,然后每次都调用这个function。
      Public Function sendKeys(stringWord)
      Dim WSH
      On Error Resume Next
      Set WSH = CreateObject("WScript.Shell")
      WSH.SendKeys stringWord
      Set WSH = Nothing
     End Function
     
     sendKeys ("{CAPSLOCK}") '这里注意括号中的写法
     wait 3
     sendKeys ("{CAPSLOCK}") '这里注意括号中的??

    2.2 Mercury.DeviceReplay
      Set devReplay = CreateObject("mercury.devicereplay")
      devReplay.SendString("a")
    2.3 使用Windows底层的keybd_event
    Extern.Declare micVoid, "keybd_event", "user32.dll", "keybd_event", micByte,micByte,micDWord,micULong
    Extern.keybd_event 42,0,0,0
    注意一下这里的第一个参数是10进制的。
    SendKeys的使用要方便一点,但是稳定性不如后者
    Function RtClick( Obj )
      absx = Obj.GetROProperty("abs_x")
      absy = Obj.GetROProperty("abs_y")
      Set devReplay = CreateObject("mercury.devicereplay")

        devReplay.MouseClick absx+4,absy+4,2
      set devReplay = nothing
      End Function
  • QTP 常用函数总结

    2012-11-23 18:00:39

    '获取当前日期
    Public Function Get_Date()
     Dim currentDate
     currentDate = Date
     Get_Date = currentDate
    End Function
    '调用
    print Get_Date()

    '获取当前时间
    Public Function Get_Time()
     Dim currentTime
     currentTime = Time
     Get_Time = currentTime
    End Function
    '调用
    print Get_Time

    '随机函数生成
    '输入值:生成值范围 i~j
    '返回值:随机数
    Public Function Get_RandNum(fromNum,toNum)
     If (fromNum<0) Or (toNum<0) Then
        MsgBox "只接受大于零的输入"
     ElseIf fromNum>toNum then
        MsgBox "起始值必须小于结束值"
     Else
        Dim RunTime
        Randomize  '初始化随机生成器,该生成器具有根据系统计时器得到的随机种子
        RunTime = Int((10 * Rnd) + 1) 'Rnd本身的值是由随机种子得到的介于0--1之间的随机数
        Dim MyValue,i
        For i = 1 To RunTime
          Randomize 
          MyValue = Int(((toNum - fromNum + 1) * Rnd) + (fromNum))
        Next
          Get_randNum=MyValue
     End If
    End Function
    '调用
    print Get_RandNum(0,100)

    '值交换函数
    Public Sub swap(byref a,byref b)
     Dim c
     c = a
     a = b
     b = c
    End Sub
    '调用
    Dim a,b
    a=3
    b=6
    swap a,b
    print "a="&a
    print "b="&b

    '是质数返回true,否则返回false
    Function IsPrimeNumber(num)
     Dim i,flag
     flag = true
     If num = 1 Then
      flag = False
     ElseIf num < 1 Then
      MsgBox "只能接受大于0的数"
      flag = False
     Else
      For i = 2 To (num - 1)
       If ((num Mod i) = 0) Then
        flag = False
        Exit For
       End If
      Next
     End If
     IsPrimeNumber = flag
    End Function
    '调用
     print IsPrimeNumber(7)

    '读指定文本文件指定行内容
    Function ReadLine(pathway, rowcount)
     Dim fso,myfile,i,flag
     flag = 1
     Set fso=CreateObject("scripting.FileSystemObject")
     If fso.FileExists(pathway) then
      Set myfile = fso.openTextFile(pathway,1,false)
     Else
      flag = 0
     End If
     
     For i=1 to rowcount-1
      If Not myfile.AtEndOfLine Then
       myfile.SkipLine
      End If
     Next
     
     If flag = 1 then
      If Not myfile.AtEndOfLine Then
       ReadLine = myfile.ReadLine
      Else
       ReadLine = "文本越界"
      End If
      myfile.close
     Else
      ReadLine = "文件不存在"
     End If
    End Function
    '调用
    print ReadLine("E:\zhang\QTP\vbs.txt", 3)


    '随机生成字符串,需要用到上边的随机数函数
    Function MakeString(inputlength)
     Dim I,x,B,A
     If IsNumeric(inputlength) Then
     For I = 1 To inputlength
      A = Array("0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z")
      Randomize
      x=Get_RandNum(0,35)
      B = A(x)
      makestring =makestring +B
     Next
      MakeString = makestring
     else
      msgbox ("只接受数字输入")
     End If
    End Function
    '调用
    print MakeString(5)


    '启动资源管理器
    Sub ZYGLQ()
     Dim WshShell
     set WshShell = CreateObject("Wscript.Shell")
     WshShell.SendKeys "^+{ESC}"
     Set WshShell = nothing
    End Sub

    '启动运行
    Sub Run()
     Dim WshShell
     set WshShell = CreateObject("Wscript.Shell")
     WshShell.SendKeys "^{ESC}R"
     Set WshShell = nothing
    End Sub

    '发送电子邮件
    Function SendMail(SendTo, Subject, Body, Attachment)
     Dim ol,mail
        Set l=CreateObject("Outlook.Application")
        Set Mail=ol.CreateItem(0)
        Mail.to=SendTo
        Mail.Subject=Subject
        Mail.Body=Body
        If (Attachment <> "") Then
            Mail.Attachments.Add(Attachment)
        End If
        Mail.Send
        ol.Quit
        Set Mail = Nothing
        Set l = Nothing
    End Function

    '去掉字符串中的重复项
    Function NoRepeat(Inp,Sp)
    Dim aa,flag,words,length,i,j,k,sp1,sp2,cc
     aa = Inp
     Do
      flag = False
      words = Split(aa,Sp)
      length = UBound(words)
      For i = 0 To (length -1)
       sp1 = words(i)
       For j = (i+1) To length
        sp2 = words(j)
        If sp1 = sp2 Then
         flag = True
         aa = ""
         For k = 0 To (j-1)
          aa = aa & words(k) & sp
         Next
         For k = (j + 1) To length
          aa = aa & words(k) & sp
         Next
        
         cc = Len(aa)
         aa = Left(aa,(cc - 1))
        End If
       Next
       If flag = True Then
        Exit For
       End if
      Next
     Loop Until flag = false
     NoRepeat = aa
    End Function

    '求字符串长度(中文算2个西文字符)
    Function GetLen(Str)
            Dim singleStr, i, iCount
            iCount = 0
            For i = 1 to len(Str)
                    singleStr = mid(Str,i,1)
                    If asc(singleStr) < 0 Then
                            iCount = iCount + 2
                    Else
                            iCount = iCount + 1
                    End If  
            Next
            GetLen = iCount
    End Function

    '运行指定程序
    Sub RunApp(command)
     Dim WshShell
     set WshShell = CreateObject("Wscript.Shell")
     WshShell.Exec command
    End Sub

    '求下一天是几号的函数
    Function Nextday(ByVal inputday)
        Dim temp, num, OPYear, OPMonth, OPDay, ret, flag
        temp = Split(CStr(inputday), "-")
        num = UBound(temp) + 1
        PYear = temp(0)
        PMonth = temp(1)
        PDay = temp(2)
        flag = 0

        If PMonth = 1 Or PMonth = 3 Or PMonth = 5 Or PMonth = 7 Or PMonth = 8 Or PMonth = 10 Or PMonth = 12 Then
            If OPDay > 31 Or OPDay < 1 Then
                flag = 1
            End If
        ElseIf PMonth = 4 Or PMonth = 6 Or PMonth = 9 Or PMonth = 11 Then
            If OPDay > 30 Or OPDay < 1 Then
                flag = 1
            End If
        Else
            If ISLeapYear(OPYear) Then
                If OPDay > 29 Or OPDay < 1 Then
                    flag = 1
                End If
            Else
                If OPDay > 28 Or OPDay < 1 Then
                    flag = 1
                End If
            End If
        End If

        If flag = 1 Or num <> 3 Then
            MsgBox "输入参数不对劲", , "Nextday函数提示"
        Else
            If PMonth = 1 Or PMonth = 3 Or PMonth = 5 Or PMonth = 7 Or PMonth = 8 Or PMonth = 10 Or PMonth = 12 Then 'big month
                If PDay = 31 Then
                    PDay = 1
                    If PMonth = 12 Then
                        PMonth = 1
                        PYear = OPYear + 1
                    Else
                        PMonth = OPMonth + 1
                        PYear = OPYear
                    End If
                Else
                    PDay = OPDay + 1
                End If
            ElseIf PMonth = 4 Or PMonth = 6 Or PMonth = 9 Or PMonth = 11 Then                                          'small month
                If PDay = 30 Then
                    PDay = 1
                    If PMonth = 12 Then
                        PMonth = 1
                        PYear = OPYear + 1
                    Else
                        PMonth = OPMonth + 1
                        PYear = OPYear
                    End If
                Else
                    PDay = OPDay + 1
                End If
            Else                                                                                                           'February
                If ISLeapYear(OPYear) Then
                    If PDay = 29 Then
                        PDay = 1
                        If PMonth = 12 Then
                            PMonth = 1
                            PYear = OPYear + 1
                        Else
                            PMonth = OPMonth + 1
                            PYear = OPYear
                        End If
                    Else
                        PDay = OPDay + 1
                    End If
                Else
                    If PDay = 28 Then
                        PDay = 1
                        If PMonth = 12 Then
                            PMonth = 1
                            PYear = OPYear + 1
                        Else
                            PMonth = OPMonth + 1
                            PYear = OPYear
                        End If
                    Else
                        PDay = OPDay + 1
                    End If
                End If
            End If
            ret = OPYear & "-" & OPMonth & "-" & OPDay
            Nextday = ret
        End If
    End Function

    '是否闰年
    Function ISLeapYear(ByVal inYear)
        If ((inYear Mod 4 = 0 And inYear Mod 100 <> 0) Or inYear Mod 400 = 0) Then
            ISLeapYear = True
        Else
            ISLeapYear = False
        End If
    End Function

    '计算两个日期之间相隔几天
    Function Days(ByVal SourceData, ByVal DesData)
        Dim flag, temp1, temp2, OPYear1, OPYear2, OPMonth1, OPMonth2, OPDay1, OPDay2, i, tempDay
        temp1 = Split(SourceData, "-")
        temp2 = Split(DesData, "-")
        If ((UBound(temp1) + 1) <> 3) Or ((UBound(temp2) + 1) <> 3) Then
            MsgBox "输入参数不对劲", , "Days函数提示"
        End If
        OPYear1 = temp1(0)
        OPMonth1 = temp1(1)
        OPDay1 = temp1(2)
        OPYear2 = temp2(0)
        OPMonth2 = temp2(1)
        OPDay2 = temp2(2)
        If CInt(OPYear1) <> CInt(OPYear2) Then
            If CInt(OPYear1) > CInt(OPYear2) Then
                flag = "big"
            ElseIf CInt(OPYear1) < CInt(OPYear2) Then
                flag = "small"
            End If
        Else
            If CInt(OPMonth1) <> CInt(OPMonth2) Then
                If CInt(OPMonth1) > CInt(OPMonth2) Then
                    flag = "big"
                ElseIf CInt(OPMonth1) < CInt(OPMonth2) Then
                    flag = "small"
                End If
            Else
                If CInt(OPDay1) <> CInt(OPDay2) Then
                    If CInt(OPDay1) > CInt(OPDay2) Then
                        flag = "big"
                    ElseIf CInt(OPDay1) < CInt(OPDay2) Then
                        flag = "small"
                    End If
                Else
                    flag = "="
                End If
            End If
        End If

        If (flag = "big") Then
            i = 1
            tempDay = DesData
            Do
                tempDay = Nextday(tempDay)
                i = i + 1
            Loop Until tempDay = SourceData
            i = i - 1
        ElseIf (flag = "small") Then
            i = 1
            tempDay = SourceData
            Do
                tempDay = Nextday(tempDay)
                i = i + 1
            Loop Until tempDay = DesData
            i = i - 1
        Else
            i = 0
        End If

        Days = i
    End Function

    '检查身份证号是否正确
    Function Identification(Text1)
    xian = Text1
    If (Not IsNumeric(Left(Text1, 15)) And Not IsNumeric(Left(Text1, 18))) Or Text1 = "" Then
      Identification = False
      Exit Function
    End If
    lenx = Len(Trim(Text1))
    If lenx = 15 Or lenx = 18 Then
        If lenx = 15 Then
            yy = "19" & Mid(xian, 7, 2)
            mm = Mid(xian, 9, 2)
            dd = Mid(xian, 11, 2)
            aa = Right(xian, 1)
        End If
        If lenx = 18 Then
            yy = Mid(xian, 7, 4)
            mm = Mid(xian, 11, 2)
            dd = Mid(xian, 13, 2)
            aa = Right(xian, 1)
        End If
        If CInt(mm) > 12 Or CInt(dd) > 31 Then
           Identification = False
           Exit Function
        Else
         Identification = True
         Exit Function
        End If
    Else
      Identification = False
      Exit Function
    End If
    End Function

    '检查是否存在数字
    Function checkString (myString)
     checkString = False
     Dim myChr
     For myChr = 48 to 57
      If InStr(myString,Chr(myChr)) > 0 Then
       checkString = True
       Exit Function
      End If
     Next
    End Function

    '查询Access数据库字符出现次数
    Function Access_GetCount(DBlocation,TableName,Value)
     set con=createobject("adodb.connection")
     con.open "DRIVER={Microsoft Access Driver (*.mdb)};DBQ=" & DBlocation
     set record = createobject("adodb.recordset")
     sql="select * from " & TableName
     
     record.open sql,con
     DO
      if(record("name")=Value)then
       num=num+1
      end If
      record.MoveNext
     loop until record.eof=True
     
     record.close
     set record=Nothing
     con.close
     set con=Nothing
     
     If num = 0 Then
      Access_GetCount = 0
     Else
      Access_GetCount = num
     End If
    End Function

    '按ASCII码值冒泡排序
    Function BubbleSort(VString,Spl,Func)
     Dim Str,StrLength,i,j
     Str = Split(VString,Spl)
     StrLength = UBound(Str) + 1
     For i = 1 To (StrLength-1)
      For j = (i+1) To StrLength
       If Func = 1 then
        If Asc(Str(i-1)) < Asc(Str(j-1)) Then
         Call Swap(Str(i-1),Str(j-1))
        End If
       Else
        If Asc(Str(i-1)) > Asc(Str(j-1)) Then
         Call Swap(Str(i-1),Str(j-1))
        End If
       End If
      Next
     Next
     j = ""
     For i = 1 To StrLength
      j = j & Str(i-1) & Spl
     Next
     j = Left(j,(StrLength * 2 -1))
     BubbleSort = j
    End Function


    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    '''以下为仅QuickTest适用函数'''''''''''''''''''''''''''''''''''''''''
    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

    '让QTP运行时保持最小化
    Public Sub QTP_Small()
     Dim objQTPWin
     Set bjQTPWin = GetObject("" , "QuickTest.Application")
     objQTPWin.WindowState = "Minimized"
     Set bjQTPWin = Nothing
    End Sub

    '恢复QTP窗口
    Public Sub QTP_Big()
     Dim objQTPWin
     Set bjQTPWin = GetObject("" , "QuickTest.Application")
     objQTPWin.WindowState = "Restored"
     Set bjQTPWin = Nothing
    End Sub

    '写文件函数(追加)
    '输入值:写入内容
    Public Function QTP_WriteFile(pathway,words)
        Dim fileSystemObj,fileSpec,logFile,way
        Set fileSystemObj = CreateObject("Scripting.FileSystemObject")
        fileSpec = pathway
        Set logFile = fileSystemObj.OpenTextFile(fileSpec, 8, true)
        logFile.WriteLine (CStr(words))
        logFile.Close
        Set logFile = Nothing
    End Function

    '写文件函数(改写)
    '输入值:写入内容
    Public Function QTP_WriteFile_Change(pathway,words)
        Dim fileSystemObj,fileSpec,logFile,way
        Set fileSystemObj = CreateObject("Scripting.FileSystemObject")
        fileSpec = pathway
        Set logFile = fileSystemObj.OpenTextFile(fileSpec, 2, true)
        logFile.WriteLine (CStr(words))
        logFile.Close
        Set logFile = Nothing
    End Function

    '读Excel文件元素
    Public Function QTP_Read_Excel(pathway,sheetname,x,y)
     Dim srcData,srcDoc,ret
     set srcData = CreateObject("Excel.Application")
     srcData.Visible = True
     set srcDoc = srcData.Workbooks.Open(pathway)
     srcDoc.Worksheets(sheetname).Activate
     ret = srcDoc.Worksheets(sheetname).Cells(x,y).value
     srcData.Workbooks.Close
     Window("text:=Microsoft Excel").Close
     QTP_Read_Excel = ret
    End Function

    '写Excel文件元素并保存退出
    Public Function QTP_Write_Excel(pathway,sheetname,x,y,content)
     Dim srcData,srcDoc,sp1,sp2,num,use,a1,a2,a3
     set srcData = CreateObject("Excel.Application")
     srcData.Visible = True
     set srcDoc = srcData.Workbooks.Open(pathway)
     srcDoc.Worksheets(sheetname).Activate
     srcDoc.Worksheets(sheetname).Cells(x,y).value = content
     
    ' sp1 = Split(pathway,".")
    ' sp2 = Split(sp1(0),"\")
    ' num = UBound(sp2)
    ' use = sp2(num)

    ' Set a1 = Description.Create()
    ' a1("text").value="Microsoft Excel - " + use + ".xls"
    ' a1("window id").value="0"

    ' Set a3 = Description.Create()
    ' a3("Class Name").value="WinObject"
    ' a3("text").value= use + ".xls"

    ' Window(a1).WinObject(a3).Type micCtrlDwn + "s" + micCtrlUp

     Dim WshShell
     Set WshShell=CreateObject("Wscript.Shell")
     WshShell.SendKeys "^s"
     wait(1)
     
     srcData.Workbooks.Close
     Set srcDoc = nothing
     
     Window("text:=Microsoft Excel").Close
    End Function

    '定时停留弹出框函数
    Sub QTP_Msgbox(Value,waitTime,Title)
     Dim WshShell
        Set WshShell = CreateObject("WScript.Shell")
        WshShell.Popup Value, waitTime, Title
        Set WshShell = nothing
    End Sub

    '改变Excel的单元格颜色
    Public Function QTP_Change_Color(pathway,sheetname,x,y,color)
     Dim srcData,srcDoc,sp1,sp2,num,use,a1,a2,a3
     set srcData = CreateObject("Excel.Application")
     srcData.Visible = True
     set srcDoc = srcData.Workbooks.Open(pathway)
     srcDoc.Worksheets(sheetname).Activate
     If color = "red" Then
      srcDoc.Worksheets(sheetname).Cells(x,y).Interior.color=vbred
     ElseIf color = "green" Then
      srcDoc.Worksheets(sheetname).Cells(x,y).Interior.color=vbgreen
     Else
      MsgBox "输入的颜色参数不正确,只接收""red""和""green"""
     End If

     Dim WshShell
     Set WshShell=CreateObject("Wscript.Shell")
     WshShell.SendKeys "^s"
     wait(1)
     
     srcData.Workbooks.Close
     Set srcDoc = nothing
     Window("text:=Microsoft Excel").Close
    End Function

    '捕获当前屏幕(截图)
    Public Function QTP_Capture(pathway)
      Dim datestamp
      Dim filename
      datestamp = Now()
      filename = Environment("TestName")&"_"&datestamp&".png"
      filename = Replace(filename,"/","")
      filename = Replace(filename,":","")
      filename = pathway + "\" + ""&filename
      Desktop.CaptureBitmap filename
      'Reporter.ReportEvent micFail,"image","<img src='" & filename & "'>"
    End Function

    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    '''''QuickTestPlus 帮助文件对于Excel库函数  仅QTP适用''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    Dim ExcelApp 'As Excel.Application
    Dim excelSheet 'As Excel.worksheet
    Dim excelBook 'As Excel.workbook
    Dim fso 'As Scripting.FileSystemObject

    Function CreateExcel() 'As Excel.Application
        Dim excelSheet 'As Excel.worksheet
        Set ExcelApp = CreateObject("Excel.Application") 'Create a new excel Object
        ExcelApp.Workbooks.Add
        ExcelApp.Visible = True
        Set CreateExcel = ExcelApp
    End Function

    Sub CloseExcel(ExcelApp)
        Set excelSheet = ExcelApp.ActiveSheet
        Set excelBook = ExcelApp.ActiveWorkbook
        Set fso = CreateObject("Scripting.FileSystemObject")
        On Error Resume Next
        fso.CreateFolder "C:\Temp"
        fso.DeleteFile "C:\Temp\ExcelExamples.xls"
        excelBook.SaveAs "C:\Temp\ExcelExamples.xls"
        ExcelApp.Quit
        Set ExcelApp = Nothing
        Set fso = Nothing
        Err = 0
        On Error GoTo 0
    End Sub

    Function SaveWorkbook(ExcelApp, workbookIdentifier, path) 'As String
        Dim workbook 'As Excel.workbook
        On Error Resume Next
        Set workbook = ExcelApp.Workbooks(workbookIdentifier)
        On Error GoTo 0
        If Not workbook Is Nothing Then
            If path = "" Or path = workbook.FullName Or path = workbook.Name Then
                workbook.Save
            Else
                Set fso = CreateObject("Scripting.FileSystemObject")
                If InStr(path, ".") = 0 Then
                    path = path & ".xls"
                End If
                On Error Resume Next
                fso.DeleteFile path
                Set fso = Nothing
                Err = 0
                On Error GoTo 0
                workbook.SaveAs path
            End If
            SaveWorkbook = 1
        Else
            SaveWorkbook = 0
        End If
    End Function

    Sub SetCellValue(excelSheet, row, column, value)
        On Error Resume Next
        excelSheet.Cells(row, column) = value
        On Error GoTo 0
    End Sub

    Function GetCellValue(excelSheet, row, column)
        value = 0
        Err = 0
        On Error Resume Next
        tempValue = excelSheet.Cells(row, column)
        If Err = 0 Then
            value = tempValue
            Err = 0
        End If
        On Error GoTo 0
        GetCellValue = value
    End Function

    Function GetSheet(ExcelApp, sheetIdentifier) 'As Excel.worksheet
        On Error Resume Next
        Set GetSheet = ExcelApp.Worksheets.Item(sheetIdentifier)
        On Error GoTo 0
    End Function

    Function InsertNewWorksheet(ExcelApp, workbookIdentifier, sheetName) 'As Excel.worksheet
        Dim workbook 'As Excel.workbook
        Dim worksheet 'As Excel.worksheet
        'In case that the workbookIdentifier is empty we will work on the active workbook
        If workbookIdentifier = "" Then
            Set workbook = ExcelApp.ActiveWorkbook
        Else
            On Error Resume Next
            Err = 0
            Set workbook = ExcelApp.Workbooks(workbookIdentifier)
            If Err <> 0 Then
                Set InsertNewWorksheet = Nothing
                Err = 0
                Exit Function
            End If
            On Error GoTo 0
        End If
        sheetCount = workbook.Sheets.Count
        workbook.Sheets.Add , sheetCount
        Set worksheet = workbook.Sheets(sheetCount + 1)
        If sheetName <> "" Then
            worksheet.Name = sheetName
        End If
        Set InsertNewWorksheet = worksheet
    End Function

    Function CreateNewWorkbook(ExcelApp)
        Set NewWorkbook = ExcelApp.Workbooks.Add()
        Set CreateNewWorkbook = NewWorkbook
    End Function

    Function OpenWorkbook(ExcelApp, path)
        On Error Resume Next
        Set NewWorkbook = ExcelApp.Workbooks.Open(path)
        Set penWorkbook = NewWorkbook
        On Error GoTo 0
    End Function


    Sub ActivateWorkbook(ExcelApp, workbookIdentifier)
        On Error Resume Next
        ExcelApp.Workbooks(workbookIdentifier).Activate
        On Error GoTo 0
    End Sub

    Sub CloseWorkbook(ExcelApp, workbookIdentifier)
        On Error Resume Next
        ExcelApp.Workbooks(workbookIdentifier).Close
        On Error GoTo 0
    End Sub

    Function CompareSheets(sheet1, sheet2, startColumn, numberOfColumns, startRow, numberOfRows, trimed) 'As Boolean
        Dim returnVal 'As Boolean
        returnVal = True
        If sheet1 Is Nothing Or sheet2 Is Nothing Then
            CompareSheets = False
            Exit Function
        End If
        For r = startRow to (startRow + (numberOfRows - 1))
            For c = startColumn to (startColumn + (numberOfColumns - 1))
                Value1 = sheet1.Cells(r, c)
                Value2 = sheet2.Cells(r, c)
                If trimed Then
                    Value1 = Trim(Value1)
                    Value2 = Trim(Value2)
                End If
                If Value1 <> Value2 Then
                    Dim cell 'As Excel.Range
                    sheet2.Cells(r, c) = "Compare conflict - Value was '" & Value2 & "', Expected value is '" & Value1 & "'."
                    Set cell = sheet2.Cells(r, c)
                    cell.Font.Color = vbRed
                    returnVal = False
                End If
            Next
        Next
        CompareSheets = returnVal
    End Function

    '写入word文件
    Sub QTP_WriteWord(pathway,content)
     Dim oWord,oRange,oDoc
     Set Word = CreateObject("Word.Application")
     oWord.documents.open pathway,forwriting, True
     Set Doc = oWord.ActiveDocument
     Set Range = oDoc.content
     oRange.insertafter content
     oWord.ActiveDocument.Save
    ' Dim WshShell
    ' Set WshShell=CreateObject("Wscript.Shell")
    ' WshShell.SendKeys "^s"
    ' wait(1)
        oWord.Application.Quit True
     Set Range = Nothing
     Set Doc = Nothing
     Set Word = Nothing
    End Sub
  • QTP无法打开IE

    2012-11-23 17:58:20

    问题描述:
    1,在QTP打开的情况下,ie经常性的打不开。。
    但是进程中有印象,而且一个ie进程耗去50%的cpu
    2,录制脚本时,内容为空。
    原因:
    QTP在IE中录制脚本是依靠一个叫BHOManager Class的动态链接库来完成的。当这个控件没有被加载,或者被禁用时,就会出现上述症状。
    解决方法:
    启用该控件。打开IE,在菜单中选择[工具]/[Internet选项]进入Internet配置界面。选择[程序]/[管理加载项],查看目前加载的ActiveX 的情况。当看到存在BHOManager Class并且其状态是“禁用”时,点击“启用”开启这个功能,并保存后退出即可解决问题。

     

    当在管理加载项里找不到BHOManger Class这个加载项时,如果你安装了QTP,那么在C:\WINDOWS\system32下会存在一个叫BHOManager.dll的动态链接库,或者可以直接在计算机里搜索BHOManager.dll,然后查看其路径。加载这个dll,加载方法为:点击[开始]/[运行],输入cmd,然后定位到dll所在目录,键入regsvr32 BHOManager.dll命令,即可注册此dll。

  • QTP快捷键

    2012-11-23 09:58:07

    在编写QTP代码时遇到多行注释,查询下快捷键多行注释为:ctrl+M 取消多行注释:ctrl+shift+M, 进一步把快捷键总结了,以下文字为转载而来, 其中QTP快捷键部分原来文字有与我使用的QTP10不符合的,都一一改正并验证过。vb部分原样转载而来。

    QTP快捷键

    文件菜单
    新建 > 测试= CTRL + N
    新建 > 业务组件CTRL + SHIFT + N
    新建 > 函数库ALT + SHIFT + N
    新建 > 应用程序区域CTRL +Alt + N
    打开 > 测试CTRL + O
    打开 > 业务组件CTRL + SHIFT + O
    打开 > 应用程序区域CTRL + ALT + O

    打开 >函数库ALT + SHIFT + N
    保存CTRL + S
    将测试导出到 Zip 文件CTRL + ALT + S
    从 Zip 文件导入测试CTRL + ALT + I
    打印CTRL + P
    编辑菜单
    剪切CTRL + X (仅限 EV)
    复制CTRL + C
    粘贴CTRL + V
    删除DEL
    撤消CTRL + Z (仅限 EV)
    重复CTRL + Y (仅限 EV)
    重命名操作F2
    查找CTRL + F (仅限 EV)
    替换CTRL + H (仅限 EV)
    转至CTRL + G (仅限 EV)
    书签CTRL + B (仅限 EV)
    完成字CTRL + 空格键(仅限 EV)
    参数信息CTRL + SHIFT + 空格键
    (仅限 EV)
    将“With”应用到脚本CTRL + W(仅限 EV)
    删除“With”语句CTRL + SHIFT + W (仅限 EV)
    插入菜单
    检查点 > 标准检查点F12
    输出值 > 标准输出值CTRL + F12
    步骤 > 步骤生成器F7
    新建步骤F8 或 INS (仅限 KV)
    块后的新步骤SHIFT + F8 (仅限 KV)
    注意: KV = 关键字视图
    EV = 专家视图

    应用程序区域菜单
    录制F3
    运行F5
    停止F4
    模拟录制ALT + SHIFT + F3
    低级录制CTRL + SHIFT + F3
    步骤菜单
    对象属性CTRL + ENTER
    值配置选项在输入值上按 CTRL + F11
    (仅限 KV)
    输出选项在输出值上按 CTRL + F11
    (仅限 KV)
    调试菜单
    暂停PAUSE
    单步执行F11
    单步跳过F10
    单步退出SHIFT + F11
    插入/ 删除断点F9
    清除所有断点CTRL + SHIFT + F9
    数据表选项
    编辑 > 剪切CTRL + X
    编辑 > 复制CTRL + C
    编辑 > 粘贴CTRL + V
    编辑 > 清除 > 内容CTRL + DEL
    编辑 > 插入CTRL + I
    编辑 > 删除CTRL + K
    编辑 > 向右填充CTRL + R
    编辑 > 向下填充CTRL + D
    编辑 > 查找CTRL + F
    编辑 > 替换CTRL + H
    数据 > 重新计算F9
    插入多行值编辑单元格时按 CTRL + F2
    激活上一个/ 下一个数据表CTRL + PAGEUP/
    CTRL + PAGEDOWN
    常规选项
    查看关键字视图/ 专家视图CTRL + TAB
    打开步骤或数据表单元格的上下文
    菜单
    SHIFT + F10 右键

     

     

    下边的代码是完全转载过来,留作后用,没做验证

    VB快捷键

    命令

    快捷键

    说明

    编辑.分行

    Enter Shift + Enter

    插入一个新行。

    编辑.折叠到定义

    Ctrl + MCtrl + O

    自动确定在代码中创建区域(如过程)的逻辑边界,然后隐藏它们。

    编辑.注释选定内容

    Ctrl + KCtrl + C

    使用编程语言的正确注释语法将代码的当前行标记为注释。

    编辑.删除水平空白

    Ctrl + KCtrl + \

    折叠选定内容中的空白,如果没有选定内容,则删除与光标相邻的空白。

    编辑.编排文档格式

    Ctrl + KCtrl + D

    选项对话框文本编辑器部分中的语言的格式设置窗格中的指定,应用该语言的缩进和空格格式设置。

    编辑.格式化选定内容

    Ctrl + KCtrl + F

    根据周围的代码行,正确缩进选定的代码行。

    编辑.注释选定内容

    Ctrl + MCtrl + H

    隐藏选定文本。信号图标标记隐藏文本在文件中的位置。

    编辑.插入制表符

    Tab

    将文本行缩进指定数量的空格,如 5 个。仅在 .NET Framework 设计器中可用。

    编辑.剪切行

    Ctrl + Y

    将选择的所有行(或当前行,如果未选择任何行)剪切到剪贴板。

    编辑.删除行

    Ctrl + Shift + Y

    删除所有选定行或当前行(如果没有选定行)。

    编辑.上开新行

    Ctrl + Enter

    在插入点之上插入一个空行。

    编辑.下开新行

    Ctrl + Shift + Enter

    在插入点之下插入一个空行。

    编辑.行转置

    Shift + Alt + T

    将包含插入点的行移动到下一行之下。

    编辑.改写模式

    Insert

    改写文档中已有的字符,而不是插入字符。仅在文本编辑器中可用。

    编辑.停止隐藏当前区域

    Ctrl + MCtrl + U

    移除当前选定区域的大纲显示信息。

    编辑.停止大纲显示

    Ctrl + MCtrl + P

    从整个文档中移除所有大纲显示信息。

    编辑.交换定位点

    Ctrl + RCtrl + P

    交换当前选定内容的定位点与结束点。

    编辑.左缩进

    Shift + Tab

    将选定行左移一个制表位。仅在 .NET Framework 设计器中可用。

    编辑.切换所有大纲显示

    Ctrl + MCtrl + L

    在隐藏和显示状态之间切换所有以前被标记为隐藏的文本部分。

    编辑.切换书签

    Ctrl + KCtrl + K

    在当前行处设置或移除书签。

    编辑.切换大纲显示展开

    Ctrl + MCtrl + M

    在隐藏和显示状态之间切换当前选定的隐藏文本部分。

    编辑.切换任务列表快捷方式

    Ctrl + KCtrl + H

    在当前行处设置或移除快捷方式。

    编辑.取消注释选定内容

    Ctrl + KCtrl + U

    从代码的当前行中移除注释语法。

    编辑.查看空白

    Ctrl + RCtrl + W

    显示或隐藏空格和制表符标记。

    编辑.字转置

    Ctrl + Shift + T

    对调插入点两边的单词。

    视图.显示引用

    Alt + F12

    执行区分大小写的全字符号搜索并在查找符号结果窗口中显示结果。

Open Toolbar