坚持到底!测试到底!

发布新日志

  • 将自已写的一部分测试代码贴出来,希望大家多提意见

    2009-11-29 12:06:28

    公司不能上外网,只有周末回家来这里逛逛,好好整理一下自已的BLOG.
    C/S结构,新增一条记录,验证保存后记录的内容是否正确。代码如下:
    用WR来进行自动化测试

    #数据库连接
    rc=db_connect ("stationnet","DSN=wr_test1;UID=sa;PWD=;APP=WinRunner;WSID=local;DATABASE=stationnet",30);

    #判断数据库连接是否成功
    if (rc !=E_OK)
    pause("cannot fail");

    #验证处方'000019857'在数据库中是否存在
    mm="'000019857'";
    a="select get_amount,unit_price,multiple FROM G_RECIPE  where recipe_no=" & mm;
    db_execute_query("stationnet",a,record_num);
    #pause ("a is  " & a);
    total=0;
    for (i=0;i<record_num;i++)
    {
     value=1;
      for (j=0;j<3;j++)
      {
        val[i,j]=db_get_field_value ("stationnet","#" & i,"#" &j );
       
        value=value*val[i,j]; 
       }
     
     tl_step("station",0,"第"& i & "的金额:" & value);
     total=total + value;
    }
    tl_step("stationnet",0,"总金额为:"&total);

    dw_xm="select item_name,unit_price,amount,total from g_outp_bill_item,g_price_list where  g_outp_bill_item.item_code=g_price_list.item_code and cf_code=" & mm;
    db_execute_query("stationnet",dw_xm,record_num);
    pause ("dw_xm is  " & dw_xm);
    xm_total=0;
    for(i=0;i<record_num;i++)
    {
      for (j=0;j<4;j++)
      {
        xm_item[i,j]=db_get_field_value("stationnet","#" &i,"#" &j);
       
      }
      k=0;
     #pause("xm_item[" &i"] is 项目名称" &xm_item[i,k] &"单价" &xm_item[i,k+1]&"数量" &xm_item[i,k+2]&"金额" &xm_item[i,k+1]);
     tl_step("stationnet",0,"xm_item[" &i"] is 项目名称" &xm_item[i,k] &"单价" &xm_item[i,k+1]&"数量" &xm_item[i,k+2]&"金额" &xm_item[i,k+1]);
     xm_total=xm_total+xm_item[i,k+1];
    }
    #pause("xm_total is :"&xm_total);
    tl_step("stationnet",0,"xm_total is :"&xm_total);
    db_disconnect("stationnet"); 
    db_get_headers("stationnet",field_nu,headers);
    tl_step("station",0,"total" & total);

     

    本文来自我的CSDN博客,http://blog.csdn.net/lwenz/archive/2006/11/03/1365398.aspx

  • 转载:qtp自定义保留对像二

    2009-01-04 16:20:07

    注册自定义QTP保留对象

      将自己的所自定义的保留对象注册到注册表中,这个并不是QTP所包含的保留对象,而是自己设计的保留对象,用VB写的类和函数是可注册的COM对象。操作如下:

      打开注册表,定位注册项:


    图3.1

      添加一个名为“MyObject”的注册项;

      添加两个“REG_SZ”类型的注册项,分别为:

      ProgID:准备创建的COM 对象的ID,在这里就是Dictionary 对象所对应的COM 对 象名“PrjName.ClassName”。这个就是前面提到的VB中的工程名、类名。 UIName:QTP指向保留对象的名字,在这里输入“MyObject”

      添加一个类型为“REG_DWORD”的注册项;

      VisibleMode:设置DWORD 值为2,用于控制自动完成(auto-complete)和代码智能感知(intelligence)。

      使用自定义QTP保留对象

      做完以上设置后,重新启动QTP,然后分为两种使用方式

      在关键字视图中调用

      在Insert菜单中选择Step Generator,然后选择Utility Objects,你可以在Object中看到我们定义的保留对象,如下显示:

    图4.1

      选中后,你可以在Opertion中看到我们定义的方法,你可以选择某个方法使用。

    在专家视图中调用

    图4.2

      便捷的控制自动完成(auto-complete)和代码智能感知功能,我们可以大声的说,QTP的功能我们也可以实现了。

    图4.3

      方便的参数说明提示,使你更容易理解参数说明的意义,使用起来一目了然,你不用了解函数库里面封装的具体内容和死记函数名称,你只需输入”.”,QTP就会自动给出你友好的提示。

    图4.4

      小结

      通过以上图示我们完成了自己封装的DLL函数的自动显示和调用,这样不仅减少了我们设计代码的时间,更大的好处是给开发测试代码人员提示功能,往往一个项目中,公用函数库都是由一个到两个工程师来开发完成的,如果做成VBS或者DLL文件,那我们每次调用的时候都需要加入如下语句来完成库的加载:

    ExecuteFile "F:\xxx.vbs" ‘装载VBS文件
    Extern.Declare micLong, "Beep", "kernel32.dll", "Beep", micLong   ‘装载dll文件
    Extern.Beep 500

      以上两条语句不仅费时,而且点击“.” 后也不能控制自动完成(auto-complete)和代码智能感知,并且开发脚本人员必须特别熟悉库中的函数和过程的具体含义才能使用,库函数多了,开发脚本人员使用某个函数时,都需要进行查找,这样既不方便也不快捷,而且会大大增加了项目的工作量,所以通过我们的研究方法,完全可以按照自定义QTP保留对象来完成函数库的整合,这样开发脚本人员在使用的时候只需要知道我们的保留对象名称即可。

      总之,本文介绍了自定义QTP保留对象和注册COM对象对象的方法,其实QTP所支持的方法不仅仅如此,还有很多东西值得我们探索和研究,在自动化测试的道路上,只要我们大家为了一个共同的目的,提高自动化测试规范和流程,实现代码更高的效率,那我们会创造一个又一个神话!!!

  • 转载:qtp自定义保留对像1

    2009-01-04 16:18:38

    摘要:QTP包含了很多保留对象,其实我们可以将所有使用的方法封装成DLL文件,然后通过COM机制注册到系统中,注册自定义保留对象机制来完成对象的定义。

      关键字:QTP保留对象,COM机制

      大家在使用QTP的过程中经常会用到函数或过程,一般情况下大家将这些函数写到一个文件中如:xxx.vbs中,或者直接封装成DLL文件,通过QTP的函数(ExecuteFile)来载入这些已经声明的函数和过程,然后进行具体调用。这样对于大家的使用并不方便和快捷,所以本人就展开了对于自定义QTP保留对象的研究。

      一、在VB环境下新建一个DLL文件

      1、打开VB6.0环境,新建如下工程

    图1.1

      2、简单设计一个函数和一个过程,代码如下:

    ‘*****************************
    ‘函数功能:比较两个数是否相等‘输入参数:Para1、Para2

    ‘输出参数:弹出提示

    ‘*****************************
    Public Function CompareValue(Para1, Para2)

    If Para1 = Para2 Then

    MsgBox "输入的两个参数相等", vbInformation + vbOKOnly, "提示"

    Else

    MsgBox "输入的两个参数不相等", vbInformation + vbOKOnly, "提示"

    End If

    End Function

    3、设置工程属性

      

      图中1.3

      上图所示:

      红色标注1、表示类名,设置为:ClassName,注册自定义保留对象用到。

      红色标注2、表示工程名,设置为:PrjName,注册自定义保留对象用到。

      4、生成文件:PrjName.dll

      点击文件——>生成 PrjName.dll

      二、 注册DLL文件为标准的COM组件

      如果文件放到F盘下,那运行:regsvr32 f:\PrjName.dll就可以完成注册,撤销注册运行:regsvr32 /u f:\PrjName.dll。注册完成后,注册表HKEY_CLASSES_ROOT中查询PrjName.ClassName如下:

      

      

       你可以点击每一个文件夹查询选项的值。

  • QTP学用函数

    2008-12-18 18:20:44

    收集了一些QTP常用函数,已经过调试。
    Public pm,dd_id
    'arrRange = ReadFile("D:\test.xls","sr")
    'Msgbox UBound (arrRange,1)
    'Msgbox UBound (arrRange,2)
    ' 读取其中一个单元格的数据
    'Msgbox arrRange(1,1)
     
     '将excel里的数据读到数组中。
    ' 输入:
    '             sFileName: Excel文件
    '             sSheetName:表单名称
    ' 返回:
    '             包含Excel数据的数组
    Function ReadFile(sFileName,sSheetName)
           Dim oExcel
           Dim oSheet
           Dim oRange
           Dim arrRange
     
           On Error Resume Next
               ' 创建Excel应用程序对象
                  Set ōExcel = CreateObject("Excel.Application")
                  If err.Number <> 0 Then
                         MsgBox "未能初始化Excel" & vbCrLf & _
                                     "请确保Excel已安装", vbCritical
                         Exit Function
                  End If
           On Error Goto 0
                        
           On Error Resume Next
                         ' 打开Excel文件
                         oExcel.Workbooks.Open(sFileName)
                      If err.Number <> 0 Then
                                MsgBox "未能加载Excel文件" & vbCrLf & _
                                       "请确保Excel文件路径正确或格式正确", vbCritical
                                Exit Function
                         End If
           On Error Goto 0
          
           ' 获取表格的使用范围
           Set ōSheet = oExcel.Worksheets(sSheetName).UsedRange
           ' 获取从A列到Z列,从第1行到第1000行的范围i中的所有值
           Set ōRange = oSheet.Range("A1:Z1000")
           '把Excel数据转换到数组
           arrRange = oRange.Value
           ' 关闭工作簿
        oExcel.DisplayAlerts = false '不显示提示框
           oExcel.WorkBooks.Item(1).Close
          '退出Excel
           oExcel.Quit
         Set ōExcel = Nothing
        ' 返回包含Excel数据的数组
         ReadFile = arrRange
    End Function

    'Company:transn
    'Author:Ellie
    'Product:TPM
    'Date:date()

    '读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
     
     Dim WshShell
     Set WshShell=CreateObject("Wscrīpt.Shell")
     WshShell.SendKeys "^s"
     wait(1)
     
     srcData.Workbooks.Close
     Set srcDoc = nothing
     
     Window("text:=Microsoft Excel").Close
    End Function
    Public Res,Cmd
    'call method:在调用文件中先定义Res,Cmd
    'For example:Dim  Res,Cmd'             DBConnect()
    Public Sub DBConnect()    
     Dim StrCon   
          Set Res = CreateObject("ADODB.Recordset")        
          Set Cmd = CreateObject("ADODB.Command")    
        'Oracle     
          StrCon ="DRIVER={MySQL ODBC 3.51 Driver};SERVER=10.0.0.15;DATABASE=DEV_tpm_watt;PASSWORD=tpm20080808;User ID=tpm_watt;STMT=SET NAMES GBK" 
           Cmd.activeconnection=StrCon    
       Cmd.CommandType =1
       End Sub

    'function:执行SQL语句
    'Input parameter: StrSql
    'For example:Dim sql
    '             sql="select * from admin_groups"
    '             ExecuteSql(StrSql)
    Public Sub  ExecuteSql(StrSql)
     Cmd.CommandText=StrSql
     Set  Res = Cmd.Execute()

    End Sub

    '---------------------------------------------------------
    'function:关闭数据库
    'For example:DBClose()
    '---------------------------------------------------------
    Public Sub DBClose()
     Set Res=nothing
     Set Cmd.activeconnection=nothing
     Set Cmd=nothing
    End Sub

    '-------------------------------------------------------
    '获取IP地址
    function IPAddress
    Dim WS
    Set WS=CreateObject("MSWinsock.Winsock")
    IPAddress=WS.LocalIP
    MsgBox "Local IP=" & IPAddress
    end function

     

     

  • 打开QTP,自动加载编写的脚本。

    2008-11-13 13:48:51

      在启动qtp的时候,每个action可能都要调用一个或者几个EXCEL文件或者VBS写的函数,每次都要重新写这些脚本很麻烦,能否在每次启动的时候自动加载写好的脚本呢,肯定是可以的。方法很简单

    1、新建一个文本文件,将需要加载的脚本放到该文件中,如:

    '********Authorellie_zhang

    environment.LoadFromFile("D:\autotest\数据\环境变量.xml")

    shujuwenjian=environment.Value("Tdir")&"数据\dd_xmshuju.xls"

    filename=environment.Value("Tdir")&"公用函数\qtp_function.vbs"

    executefile filename

    datatable.ImportSheet shujuwenjian,"src","drc"

    2、将该文本文件的名称改为“ActionTemplate.mst”注意扩展名为:.Mst

    3、将该文件ActionTemplate.mst放到qtpdata目录下,如:C:\Program Files\Mercury Interactive\QuickTest Professional\dat

    4OK了,重新打开QTP看看里面有没有上面的脚本。

  • 对象参数化问题

    2008-11-10 18:09:21

       一直困扰我好几天的问题,终于今天得以解决,感觉自已对对像库以及对象参数化的认识又有一个飞跃。其实问题很解单,其解决的方法更简单,只是以前对对象的理解不是很深刻,其中有一些误解,所以造成自已郁闷了几天。

    给自已一个总结:以后有时间或者遇到问题的时候一定要冷静对待,不要一碰到问题就开始盲目的在网上找原因或者是问别人,自已一定要仔细看下QTP下的帮助文档,QTP的帮助文档是最好的助手。不啰嗦那么多了,先把问题以及解决方法描述下,给以后碰到此类似问题的朋友一个启示。

    问题:下图是一表格,表格中订单名称字段里的值可以链接到订单详情页面(url中包含订单ID),其中订单名称可以重复,并且名称如果太长在该表中会显示不全。现在就是要录制点订单名称打开相应的订单,其中需要将订单名称和所对应的URL进行参数化。

     

     

    存在的问题,我按默认方式进行录制,代码如下:

    Browser("Browser").Page("page").Link("asdfsd…").Click

    我对该link对像进行参数化

    Browser("Browser").Page("page").Link("asdfsd…").SetTOProperty "url","http://yahu.com&dd_id=123456"

    Browser("Browser").Page("page").Link("asdfsd…").SetTOProperty "text",dd_mc

    Browser("Browser").Page("page").Link("asdfsd…").Click

     

    运行以上代码会一直提示找不到Link("test")对像,或者是该对像不能不唯一标识。

     

    解决办法

    修改link录制的属性,只录制Linkhtml tag index属性,其它的操作不变。

     

    所有需要参数化的对象,都不要录制他,在他运行的时候只需给他指定的值就行了。呵呵,不知道这种做法会不会误导别人。

     

Open Toolbar