《精通QTP——自动化测试技术领航》—第1章1.9节操作模块(Actions)

本节书摘来自异步社区《精通QTP——自动化测试技术领航》一书中的第1章1.9节操作模块(Actions),作者余杰 , 赵旭斌,更多章节内容可以访问云栖社区“异步社区”公众号查看。

1.9 操作模块(Actions)
精通QTP——自动化测试技术领航
阶段要点

Action的3种类型。

关于Action操作的一些小技巧。

Call Action的3种方式和Split Action。

1.9.1 使用Actions来控制好业务流
已经学习到“操作模块-Actions”章节了,从本书的第一章开始到现在,本人多次强调了自动化测试的成功之道很大一部分取决于如何维护,要在还没有正式测试立项之前就考虑到维护的问题。当然,为了更好地做好维护脚本的工作,我们是有比较好的经验可学习的,就比如之前反复强调的“脚本模块化、细分化”,这些自动化测试规则并不是本人的原创,它们都是测试前辈们总结出的经验,所以非常值得我们借鉴,而且这些优秀的思想绝对不只是QTP一个自动化测试工具能享有它,它面向的是自动化测试,而不是工具!

在之前的章节中虽然多次提到了“脚本模块化和细分化”,但是究竟如何去做呢?我们并不知道!因此,在本章节就和读者开始基于“脚本模块化和细分化”进行探讨。因为本书是一本QTP方面的技术书籍,因此,始终围绕QTP这个自动化测试工具。所以,本章节的内容就是论述关于QTP的“脚本模块化和细分化”。怎么做?如何做?

从QTP 10.0开始,有一个功能可以方便地管理和驱动所开发的测试脚本,这个功能完全就是针对“脚本模块化和细分化”这个伟大的思想而开发的,先来认识下这位朋友,如图1-225所示。

读者在看了这个小窗口后是不是有种似曾相识的感觉呢?在上一个章节“Datatable”中其实已经见到过它了,QTP 10.0默认情况是显示这个小窗口的,如果不小心关掉了,只要依次点击QTP上方菜单栏→View→Test Flow,就可以重新显示了,这个小窗口还可以被拖动成一个浮动窗口任意摆放位置,也可以进行自动隐藏(点击右上角x键左边的按钮),在这里就不多作介绍了。你们还记得下面这张图吗?如图1-226所示。


8bd7cbbca2f3a25ed8eeccecb4d7aa319d7d6a8f

当时在介绍控制Action的Datatable迭代次数时,就是在此处设置的。这里还有很多比较实用的功能会介绍到。接下来,先布置好一个自动化测试业务流,如图1-227所示。

如图1-227所示,这就是一个业务的Test Flow(测试流程),我们可以看到它是非常有序的。让我们来介绍一下这个测试流:作者的设计思想是将所有功能模块化,即产出一个个独立的功能子脚本。然后组合成一个个不同的业务脚本,在图1-227中可以看到,QTP_TestFlow是当前脚本的名称,MainAction是这个脚本的一个Action(如果有多个Action,与这个Action在同一个树形结构下),在这里只需要有一个Action即可。它是一个主控Action,用来收纳所有业务所需要的子脚本,这些业务子脚本就存在于图中MainAction的结构树下,它们属于MainAction的子结构,这个非常好理解。MainAction在运行时会依次根据当前排列的顺序执行它们,至于这个顺序是怎么来的?是在主控脚本中设置或直接写代码引用的,这个在后面的小节中会讲到,这里暂时略过。然后我们可以看到,子脚本的名字也是比较有特色的,从名字上就能很直观地反映该脚本大致是干什么的。这个当然不可能是QTP自动生成的,很明显是本人有意更名的。接下来看看到底是如何改名的。只需要将鼠标光标移动到某个Action上,点击右键,然后在弹出的菜单中选择Action Properties就可以了,如图1-228所示。

点击以后,可以进入图1-229所示的界面。


85a87837f3920cf094f586ee145bca79f29ffe7f

这个窗口下共有5个Tab,更名的操作就是在默认的第一个General Tab中进行的。不过本人无论如何都无法给这个Action改名的,为什么?因为这个Action是从外部调用过来的,也只有外部调用过来的Action才会有5个Tab,多出了一个External Action。在这里就不对这些Tab里的功能多做介绍了,读者如有兴趣可以自行研究。那么,我们来改一个非外部的Action Name试试,同样是右键单击MainAction,然后在弹出的菜单中选择Action Properties,进入Action Properties设置窗口,如图1-230所示。

将Name改成Main(图略),最后点击确定,Test Flow就会随之变化了,如图1-231所示。


0872af014eaf14569b84c4eb21b65517114af5fe

在这里除了更改Action Name之外,还有一个小知识点也比较重要,重新看下图1-230,在Action Properties的左下方有一个Reusable action控件,只有勾选上以后,脚本才能被共享和调用,所以准备成为“被调用的外部脚本”的子脚本务必勾选上。其实就是在这个窗口设置的,往往读者都不知道外部脚本调用失败就是因为这个小控件引起的。就是外部子脚本被调用以后显示的名字比较奇怪,似乎不只是ActionName。的确是这样的,在被调用后,子脚本会自动显示为Action Name [Test Name],因为这样会显得非常的直观!

右键单击Action的Name,除了更改名称之外,其他的一些操作也比较实用,如Object Repository-通过Action打开相对应的对象库,Run from Action-只运行指定Action,Run to Action-从第一个Action运行到指定Action等。

最后,列举并总结了关于Action的一些概念,这些知识有助于开展后面小节的学习,Action共分3种类型。

非重用型:只能被存储它的Test调用,且只能被调用一次。
重用型:可以多次被存储它的Test或别的Test调用。
外部型:一个存储在别的Test中的可重用型Action,只能在调用它的Test中“只读”。
1.9.2 Call Action的3种方式
在前面所讲的内容中,已经看到了一个现象,那就是一个主脚本同时调用多个子脚本。从这小节开始,就让我们一起动手做一做。在QTP中,对于Action的操作一共分4种,其中3种是一个Call的行为,还有一种是切分。在这里,先来介绍所有Call的行为。先介绍第一个“Call to Existing Action”,在上一个小节里做的实验也是基于这个Call完成的。先来看一下它的位置,如图1-232所示。

如图1-232所示,在QTP的快捷栏中,点击“小三角”就能看到个选项,它们分别是。

Call to New Action。
Call to Copy of Action。
Call to Existing Action。
1.Call to Existing Action
当前运用到的是第3个选项(在后面介绍其他2个选项时将不再重复GPRS定位),点击这个选项,如图1-233所示。

如图1-233所示,点击后会弹出这个窗口。在此,基本操作就不介绍了,相信广大读者一定可以很快运用,主要就是讲解Action下拉框,假设一个脚本有两个或以上的Action,可以在这里任意选择其中一个Action,每次只能选择一个。现在选中一个事先准备好的外部脚本,如图1-234所示。


f966b72870a8ac7c3613055221a6d8f8ed7b679a

如图1-234所示,已经选中了脚本,并且选择了Action(其实是别无选择,只有这么一个Action),这里又要注意一个地方,那就是最下方的两个选项。

At the end of the test。
After the current step。
如果选择了前者,在点击了OK以后,被调用的脚本Action是当前Test的一个Action;若选择后者,被调用的Action则属于当前Action的一个步骤,即成为了当前Action的一个子Action。所以,在这里需要选择的是后者,最后点击OK,看看接下来会发生什么样的状况,如图1-235所示。

如图1-235所示,当点击OK以后,QTP会弹出一个窗口,这窗口干什么用的?说简单点就是点击Yes设置成相对路径,点击No设置成绝对路径。尝试着点击Yes,如图1-236所示。


4b10df9a1190ce053a67007917f553c9ebf228b9

我们可以看到,在点击Yes以后,这个被调用的外部脚本被设置了相对路径,在文本框里只显示脚本名称,不显示具体路径,最后再次点击OK,如图1-237所示。

fe591f9d40f213f97e24632181cc2cd5015c1e80

如图1-237所示,整个过程完毕,在代码区域自动生成了一行代码:

RunAction "LanuchBaidu [LaunchProgram]", oneIteration
这句代码代表的就是我们的操作,其实等读者以后熟悉以后,直接写代码就可以了。最后跟了一个参数“oneIteration”,意味进行一次迭代,这是默认的,一般情况下,没必要去改它,除非有一些特殊需求,在这里就不多作阐述了。与此同时,也可以看到左侧的Test Flow窗口中也有变化,在Action1下面已经嵌入了调用的Action。最后,Call Action的操作还会带来一个关键的变化,如图1-238所示。

通过图1-238可以看到,QTP的Datatable中多了一个Sheet。没错,在调用了Action以后,QTP会自动添加该Action的Sheet。

第一个Action搞定了,接下来你完全可以搞定N个Action。在这里还要分享一个小经验,为什么推崇由主控脚本控制不同Action?还有一个最根本的原因就是,比如子脚本 A 发生了变化,它又被 100 个脚本调用过,如果不是使用Call外部Action的方式,那么就要修改100个脚本,但是现在已经完全解决了这个问题,只需要修改子脚本A,所有调用它的主控脚本都会随之改变,极大地提高了效率,缩小了自动化测试的维护成本!读者可以自行实验,亲身感受一番。

2.Call to New Action
在有了前面这个实例的基础后,其实其他两个选项在操作上都是大同小异的,区别就在于它们的性质不同。Call to New Action,别看这个名字挺复杂的,其实它就是New a Action,可以基于Test新建很多1级Action,也可以基于1级Action新建很多2级、3级Action,同样的,在新建任何Action以后,QTP的Datatable会自动生成一个Sheet,如果将Action的名称改掉,该Sheet也随之发生改变,就是这么简单!

3.Call to Copy of Action
Call to Copy of Action其实和Call to Existing Action非常相似,它们之间区别在于,它只是把外部Action的对象库、代码等复制了过来(当然,同样也会在Datatable中增加Sheet),但是它失去了“改子脚本变化主控脚本的功能”,其实原理也很简单,读者一试便知,在Call to Copy of Action的时候,QTP是不会提示是否设置相对路径的。另外,Copy过来的Action可以编辑,而Call Existing Action过来的脚本是只读状态。

最后,无论是以上任意一种方式,可以通过图1-239中的位置进行脚本间的切换和修改(属于Call Existing Action的脚本除外)。

1.9.3 Action的切分
QTP提供了Split Action这个功能,它是挺实用的,可以提高工作效率。下面了解这个功能,一起来切分图1-240中的脚本实例。

Purpose(目的):将当前脚本切分为两个脚本:和。

Step 1,选择要开始切分的位置,在此点击第2行代码句首,只有这样Split Action按钮才生效。

Step 2,点击Split Action,点击后的效果如图1-241所示。

Step 3,在这里可以选择要将Action切分成互相独立的(Independent of each other)还是嵌套形式的(Nested),默认选择的是前者,然后分别给两个Action命名,分别是和,最后点击OK,点击后的效果如图1-242所示。

如图1-242所示,我们看到Action已经被切分成两半了,左侧的Test Flow窗口里分别显示了切分后的Action,而这个Action里也绝对不会有的代码,再看看Datatable的情况,如图1-243所示。


a4b863c415ff2e365eb4a288ae0a1e9c7f608917


a4d1edf60ead3b1ec501c055cf0091c5570b484f

结果很明显,Datatable的Sheet也被成功切分为了两半!实验宣告成功!这里需要注意,每次做切分操作只能切分成2份,无法再切分得更多了,如果有需求的话只能多做几次Split Action操作。

1.9.4 总结
总体来说,QTP Action的知识点并不算是特别多,但是Action是一直要用的一个功能。另外,作者个人觉得,Action的难点在于Test Flow的组织和排列,这其中牵扯很多实际项目中的测试逻辑。关于这方面的经验,只能通过不断的历练去积累,不是一本书能够概括的。

知识点巩固和举一反三练习

一、尝试脚本A中调用不可重用的脚本B。看看结果会如何!

本文仅用于学习和交流目的,不代表异步社区观点。非商业转载请注明作译者、出处,并保留本文的原始链接。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值