虽然我们不能控制灾难, 但是我们可以左右灾难的后果! 坚持生的勇气! 那就是希望!

发布新日志

  • BPT测试延伸--效率优化

    2008-08-09 10:32:52

        之前讨论过QTP和QC结合的新测试方式,BusinessProcessTest。
        这种新型的自动化测试思想的出现进一步划清了测试分析,框架勾践人员和测试实现,执行人员之间的分工。但是,新兴的东西总是有它自身的一个不断改善,优化的过程的。BPT也不列外。
        如果你是个QTP比较熟练,已经尝试过BPT测试的工程师,那么你就会发现,BPT虽然对于没有开发经验的测试执行人员来说是个比较容易上手,实施的自动化测试实现方式。但是,它的弊端也是比较明显的,首先是离不开Component开发人员的修改,完善,实施人员基本上没有多大人员去进行错误的排查和debug。
        不过,这个问题,如果在被测软件稳定的情况下基本可以忽略。
        但是,随之而来的是BPT的效率,一个Test Case如果是由多个Component组成,那么每个Component之间的衔接时间消耗是十分可观的。特别是都某些Component中还由许多Interation组成时。
        QTP不会优化BPT的执行过程,它只会在一个Component需要执行时去跟QC通信,然后下载,初始化,再执行。我测量过每个Component执行结束后到另一个Component被下载再启动执行的时间,一般可以达到5秒以上。这样如果出现n个Component的话,时间就是5(n-1)秒,再乘上Case数量,就是个十分巨大的时间损耗。
        我们会考虑,QTP能否实现多线程模式,在第一个Component执行的同时,后台自动下载下一个Component以提高效率,暂时我还没找到从使用者角度的实现方式。
        但是,从我们的角度,我们可以避开Component的前后衔接,也就是说,换一种思路,BPT结合Function的方式,进行优化。也就是说,我们原本的方式是一个业务Step一个Component,但是现在我们可以尽量减少Component,增大step的粒度,把原本某些Component用Function函数来实现,这样,在考虑业务理解粒度不至于被破坏的情况下,效率就会大大提高了。
        自然,这样会导致单个Component的Parameter数变大,但是只要有清晰的描述,这个代价还是值得的!
  • QTP测试报表table内容的思路附一维数组快速排序算法(VBS)

    2008-06-03 08:40:12

        使用QTP对报表中的webtable内容进行正确性验证。

        基本思路是:

        一:使用getcelldata(i,j)的方法遍历webtable把表格内容存入一个数组中,一般为二维数组

        二:使用数据库连接组件ADODB连接后台数据库,使用数据结果集对象保存select查询结果,也是一个二维数组

        三:此时区分是否需要验证排列顺序,如果需要,直接对两个二维数组进行一对一遍历比较

        四:不需要验证排列顺序,或者顺序无法控制的情况下,我们需要对显示内容和查询预期内容进行比较,这时候牵涉到两个结果集的数据顺序问题,如果采用单对多遍历的情况,效率会十分低。

        这时候我们换一种思路考虑,既然是验证内容,那我们就可以把二维数组的验证转换成排序一维数组比较,实现方式是,采用join方法将二维数组的每一行转换成一个字符串(内容没有变化,只加入拼接符),两个二维数组进行相同转换,成为两个一维的字符串数组。

        然后使用快速排序法对两个一维数组进行一次排序,同样的机制下,如果原本内容相同,那么排序出的内容也应该相同。然后直接进行一维数组一对一比较。

        下面是vbs的快速排序代码,合适数字和字符串数组:

    Public Function QSort(ByRef ReArr, ByVal head, ByVal tail)

    'ReArr 是待排序数组, head和tail是该数组的最小下标和最大下标
    Dim lef, rig
    Dim pivot

    If head < tail Then
     lef=head
     rig=tail
     pivot=ReArr(lef)
     While (lef <> rig)

      While (lef < rig and ReArr(rig) >= pivot)
       rig = rig-1
      Wend
      If lef <rig Then
       ReArr(lef) = ReArr(rig)
       lef = lef+1
      End If

      While (lef < rig and ReArr(lef) <= pivot)
          lef = lef+1
      Wend
      If lef <rig Then
       ReArr(rig) = ReArr(lef)
          rig = rig-1
      End If
      
     Wend

     ReArr(lef) = pivot
     call QSort(ReArr, head, lef-1)
     call QSort(ReArr, lef+1, tail)
     
    End If
    End Function

  • BPT(business process testing) 研究(四)

    2008-05-20 17:36:53

        这次整理一些在整个研究过程中出现的问题。
        一、由于Business Component需要QC和QTP协同工作,所以我们没办法单独用QTP对Component进行调试,除非拷贝代码到本地Test,然后将所有Parameter部分实例化,可以进行调试;或者就是打开QC,用QTP连接QC后打开Component,但这时又涉及到锁定机制,也就是谁先开,谁锁定,后开的只能为只读方式,很麻烦。

        二、调试interation在单独Component下无法实现。

        三、由多个Component组成的Case在QC调用远程PC进行运行时效率低下,每一个Component都会在被运行前实时下载一次。一般一个10个Component的Case会在3-4分钟左右(视Component复杂度定)。

        四、最郁闷的部分,由于是QC总控,QC的Test Lab只返回粗略的结果(pass or fail),细节results部分被存在QC的数据库中,但是当我们想要用QTP打开results进行错误定位时,Results View一直时downloading状态,无法下载。
        这是QC和QTP就BPT测试的一个Bug,暂时还未解决!

        这个问题可以用Report Manager(一个第三方QTP插件)进行人为测试Log记录!

        五、使用QTP对web进行测试时,请务必保证QTP现行打开,不然会有很多对象无法识别。

        六、有时候web应用开发人员不一定会给所有html对象一个清晰明确的定位属性,比如唯一的name,唯一的html tag/id,这个时候我们可以考虑QTP的测试对象属性,即同类对象的index,结合顺序和步进,可以解决某些无法定位问题!

        待续

  • BPT(business process testing) 研究(三)

    2008-04-30 22:19:19

        BPT的主旨是封装,也就是开发概念中的模块化重用,这种思想需要在我们设计Component的人员大脑中存在,我们设计Component框架的时候需要把握的就是尽可能理出同类项。

        就拿一个报表系统的filters的输入界面来说,我们假定该filters是基于web的,也就是html形式的filters,BS架构,一般此类prompts会存在多行输入选择项,例如:

        年龄段:XXXX

        节目类别:XXXX

        节目名称:XXXX

        地区:XXXX

        开始时间:XXXX

        结束时间:XXXX

        等等,在我们设计的时候,我们一般的思路是会将整个filters输入整合框作为一个Component,恩,这种思路没错,但是我们如果进一步划分同质项,我们会发现,每一个输入行可以作为一个同类别的元素,这样我们就可以考虑将一行作为一个Component,正是由于html标签的支持,使得我们可以根据innertext对每一个输入框进行定位,从而进行输入。

        估计有人会说,这样下来一个业务流程,该filters输入部分就需要多达6次component调用,是否化简为繁了。

        这时我们就可以应用到Component的一个特性interation了,我们可以在QC的test plan里面设计案例时候直接在参数输入界面里面添加interation,也就是多组参数,Component可以自动对该多组interation进行循环,类似于单机test的datatable控制,而在我举的这个例子中,就可以只用一次Component,添加6组interation就实现了整个filters的输入了,而且该种设计方法十分灵活,具有可扩展性,能适用于今后filter行数增加减少的情况,而如果整个设计成一个Component,万一filter行数改变,我们的Component也需要跟着改变了。

  • BPT(business process testing) 研究(二)

    2008-04-24 22:30:23

        flight小程序其实没有办法诠释BPT测试中Component重用、复用的精髓,因为定制性不够强。

        而当我们面对报表型工具的测试时,Component的作用就开始显现出来了。

        比如说一个带权限登陆的医院报表系统,表与表直接还存在着进一步细化的关系,我们进行业务流程测试时就需要在底层框架架构时就考虑清楚Component的划分尺度,不能太大,那样容易丧失重用性和灵活性;也不能太小,太小造成的后果就是案例的构造是否繁琐,输入参数复杂。

        一般来说,我们会把登陆单独作为一个Component;然后分析所有子表(显示表)之间的相同点和不同点,划分出几个同类项表,每一个同类项的表格基本格式一致,然后对应每个同类项表格定制一个Component;再需要分析流程路径处理,如果存在共通性,比如以相似方式进入detail表,我们就可以把该路径动作也定制为一个Component表。

        至此我们基本上已经把底层骨架搭好。Component的动态灵活性调整下一次再分析。

        最后就是案例设计了,我们只需要根据方法进行案例的理论设计,然后拖选相应Component(可以重用,用不同输入,不同开关进行控制),组成一个个case,就可以在QC中进行自动化测试了。

  • UltraEdit列添加和行尾添加

    2008-04-24 08:10:45

        由于QTP脚本中涉及到十分长的Sql语句(近30行),所以十分痛苦地觉得一行里写难看到无法容忍,遂找寻QTP脚本中的命令分行连接符。

        QTP脚本就是VB脚本,所以直接使用VB中的行尾加上“ _”(空格+_),就可以将几行连成一个命令了。

        但是另一个问题又来了,30多行的SQL语句,由于是作为整个字符串加入脚本,所以必须在每行SQL的行首添加“ ,在行尾添加”& _,用来连接所有分句为一个完整的SQL语句。

        知道UltraEdit有列功能可以方便地修改所有列,用该功能我解决了行首的问题,但行尾我冒烟了,根本不对称啊,没办法,只好想其他招数。

        想起来文档编辑的常用招数“替换”,于是CTRL+R 调出来替换(Replace)窗口,选中"使用正则表达式".然后可以查找 ^p(或者^n,如果是Unix 文件),用”& _^p(或者”& _^n)进行"全部替换"即可.补充一点,如果是 MAC(Apple) 类型文件,则换行符号为 ^r 。

        至此,大功告成,今后的长命令连接都可以套用该思路进行格式化的优化了。

  • BPT(business process testing) 研究(一)

    2008-04-23 06:59:46

        Mercury从测试工具系列8.2就提供了BPT的测试思想和实现流程,只是我们测试人员还没有深入地对这种新型的测试思想进行过深入的探讨(当然,海龙老师和文广老师已经是先行者了)。

        由于项目需要使用BPT进行自动化测试,测试框架和底层Component建模任务就落到了我和另一个同事身上,开始对BPT进行现学现卖了。

        BPT不能算是一种新型测试方式,它只是一种新的测试思想,它将整个测试参与角色定位为两类人:

        一类是测试工程师,另一类是业务工程师。

        业务工程师不用熟悉脚本,不用去理解Component的构建(当然他也可以参与构建),他们的主要职责是使用已经建模好的所有Component,也就是被测对象的操作步骤零件,进行实际业务流程处理的案例拼接,设计完成充分,有效的案例集。

        就拿附带小程序flight来说,原本我们的登陆步骤起码需要四步骤:

        1.打开程序,出现login窗口

        2.输入用户名

        3.输入密码

        4.点击确认

        而在BPT中,我们可以把整个登陆打包成一个Component,它只需要测试案例设计人员拼接案例时拖拽进案例步骤,而后在实际运行时给予两个输入就可以执行(注意,这里注重的是重用性,也就是说,该登陆Component在今后所有的BPT案例里都可以选择复用,而不用重新录制或者写脚本)。

        BPT的执行一般正确流程是由QC远程调用QTP来运行,参数的输入在QC段点击Component上的输入参数列表就可以实时输入了。

        刚接触时,总想使用business component,但实际上对我们测试工程师来说,该对象的定制性实在太差,它只适用于很简单的对象操作,对于逻辑控制,判断等操作显得力不从心,从我的角度来看,它的存在只是为了业务工程师的Component自行设计。

        我们关注的应该是scrīpted Component,这才是可以充分发挥我们脚本定制的利器,实行的角度和粒度不同,但最后封装完毕呈现给案例设计者的其实都是同样的接口,所以我这边基本上忽略了business component,今后的研究偏重于scrīpted Component,当然,其实只要你后者熟练掌握了,前者也就无师自通了。 

  • QTP自动添加所有存在记录(有点长,请耐心)

    2008-03-28 20:46:32Digest 2

        老写些乱七八糟的感性文字,该静下心来好好写写测试相关的文章了.

        QA大姐头告诉我,接下来我的任务就是配合一个老员工进行一个模块的自动化测试,QTP的,不错,正中下怀,比起LR,我还是更加喜爱QTP.

        文sir当时结束我们QTP课程的时候给我们留了个据说是CPC里面考的QTP题目。

        题目的内容是这样的,实现自动插入flight小程序的数据库中的所有记录(任意数量)。

        这时候我们需要考虑很多问题,登陆不是主要事件,忽略,当你进入order订单界面的时候,我们主要考虑动态变化的元素,主要有3个元素:flyfrom;flyto;以及确定了from和to之后的flights列表.

        根据分析我们可以发现,flyfrom永远是10取1,index从0-9,而flyto则是去掉被选定的from之后剩余的9取1,index从0-8;这两个动态元素比较容易控制.

        难点是flights弹出列表的记录数,这个记录数根据选定的from,to进行对应变化,也就是说有10的10次方种列表,我们无法写出简单的脚本对其进行自动读取.

        改变一下思路,我们事先不知道flights列表的index,那我们就添加额外步骤去确认每一次的index,只要我们控制好循环,就可以完成其遍历所有存在记录的目的.

    以下是自动添加1000条相互不同记录的脚本

    登陆部分(忽略)

    Dialog("Login").WinEdit("Agent Name:").Set "abanban"
    Dialog("Login").WinEdit("Agent Name:").Type  micTab
    Dialog("Login").WinEdit("Password:").SetSecure "47a173562d6104f53d107ca1be4ccb82c48020f1"
    Dialog("Login").WinEdit("Password:").Type  micReturn

    循环插入记录,重点部分,三层循环

    '定义插入记录数,插入计数器

    'InsertCount用来控制指定数量插入不同记录
    InsertCount=1000
    InsertNum=0

    '取往来地点的最大值,固定,Maxfrom是flyfrom,Maxto是flyto
    Maxfrom = Window("Flight Reservation").WinComboBox("Fly From:").GetItemsCount
    Maxto=Maxfrom-1

    '最外层循环,Fly from
    For i=0 to Maxfrom-1

    '第二层循环,Fly to 
     For j=0 to Maxto-1

    '这一段用作取当前往来的所有可选航班,可变,在每一次往来变化中动态获得flightsnum,
    '用来作为do while 循环的退出条件
      Window("Flight Reservation").WinButton("Button").Click
      Window("Flight Reservation").ActiveX("MaskEdBox").Type "1111111111"
      Window("Flight Reservation").WinComboBox("Fly From:").Select i
      Window("Flight Reservation").WinComboBox("Fly To:").Select j
      Window("Flight Reservation").WinButton("FLIGHT").Click

    '取flightsnum,每确认一次from,to取一次

      flightsnum=Window("Flight Reservation").Dialog("Flights Table").WinList("From").GetItemsCount

    '因为该步骤只是取不断变化的flights数量,所有cancel掉

      Window("Flight Reservation").Dialog("Flights Table").WinButton("Cancel").Click

         k=0
    '取flightsnum完成,初始化第三层循环计数器K

    '第三层循环,按照from i, to j, 航班 k遍历,k不断自增到flightsnum-1

      Do While 1  '死循环,无限

       Window("Flight Reservation").WinButton("Button").Click

       Window("Flight Reservation").ActiveX("MaskEdBox").Type "1111111111"
       
       Window("Flight Reservation").WinComboBox("Fly From:").Select i
       Window("Flight Reservation").WinComboBox("Fly To:").Select j
       Window("Flight Reservation").WinButton("FLIGHT").Click
       Window("Flight Reservation").Dialog("Flights Table").WinList("From").Activate k

       Window("Flight Reservation").WinEdit("Name:").Set "aban"
                Window("Flight Reservation").WinEdit("Tickets:").Set RandomNumber(1, 10)

       Window("Flight Reservation").WinButton("Insert Order").Click

       
       Window("Flight Reservation").ActiveX("Threed Panel Control").WaitProperty "text", "Insert Done...", 10000

    '计数器自增
       k=k+1

       InsertNum=InsertNum+1


    '插入记录数到达指定数,退出
       If InsertNum=InsertCount Then
        ExitTest
       End If

    '判断当前动态航班表flights是否遍历结束,结束则跳出第三层循环
       If flightsnum=k Then
        Exit do
       End If
       
         Loop

    '第二层循环,下一个flyto

     Next

    '第一层循环,下一个flyfrom

    Next

     

数据统计

  • 访问量: 42478
  • 日志数: 55
  • 图片数: 1
  • 建立时间: 2007-11-27
  • 更新时间: 2008-08-23

RSS订阅

Open Toolbar