Ⅰ.2.8 如何做自动压力测试(Automatic Stress Testing)

来源:互联网 发布:rf流体软件 编辑:程序博客网 时间:2024/06/06 20:25

这个部分解释了如何使用Squish为应用程序实现完全的自动化压力测试。

这里实现的压力测试的类型叫做“Monkey Testing”。这个名字来源于这样的想法:如果你有一屋子的猴子和打字机,不限制时间和替代品,它们将最终打出所有的伟大的文学著作。

Qt 和 JavaScript

基于JavaScript 测试套件,目前Squish提供支持Qt 工具包的 monkey testing。所有的monkey testing 代码都是用JavaScript写的,尽管不知道为什么不能使用其他的Squish支持的脚本语言。而且,鉴于Squish在访问工具包API方面的优秀表现,应该能为那些使用了任何支持Squish工具包的AUT创建一个monkey test,例如,通过适配JavaScript monkey test(如果想可以讲它转换成其他的脚本语言)实现。

在压力测试中,有聪明的猴子和沉默的猴子。聪明的猴子的价值体现在加载和压力测试,它们将会发现一个重要的bug的数量,但是在开发方面也很昂贵。它们常常也需要一定数量的关于应用程序的知识,他能做的和他不能做的。另一方面,沉默的猴子不难开发,也能做一些基本的测试,但是他们会找到一些bug,然而,沉默的猴子发现的bug通常挂起以及崩溃了,就是说,它们是你最想发现的bug。沉默的猴子也不需要知道很多关于应用程序的任何内容,所有很容易创建它们。

只有Monkey 测试是不够的

即使monkey测试有助于测试设置,永远不要把monkey测试当做唯一的测试form,也不应该代替任何类型的验收测试。

该教程中用到的monkey 测试使用了一个不完全的dumb monkey。这意味着即使monkey不需要知道任何应用程序的信息,一般它是知道一些应用程序的信息的,如按钮、输入区域,以及check box是什么,以及如何与它们交互。因此monkey将不只是简单的随便点击GUI,而是选择一些用户可访问的widget并与之交互。

2.8.1 启动Monkey

monkey 测试AUT的最容易的方法是按照下面的要求修改 example/suite_monkeytest_js测试套件的tst_runmonkey测试案例:

1. 确保待测应用程序注册到squishserver了。

2. 打开测试套件 example/suite_monkeytest_js。(该例由Squish提供)

3. 打开tst_runmonkey测试案例和test.js脚本。定位到main 函数的第一行代码(以var monkey=new Monkey(...)开头的),将名字’addressbook‘改成待测应用程序的名字。

4. 如果应用程序是基于Qt 3而非Qt 4的,将‘new Qt4Toolkit’改成‘Qt3Toolkit’。

5. 点击Squish IDE的工具条运行测试套件。

当Monkey测试运行起来后,应该能看到应用程序已经启动,会看到随机用户操作,随机的点击按钮,输入随机的文本到输入区域,随机打开一个对话框,等等。monkey将只与这些对用户(被激活了)可见的widgets交互。monkey执行每个单一的动作都被记录在测试log中。

记录Monkey的操作

写到测试log中的消息都是普通的脚本语句。你同样也可以将它们写入log文件中,之后该log文件本身可以用作测试脚本。(用于复制monkey执行的操作以防显示缺陷)可以通过修改tst_runmonkey/test.js 文件实现。

例如,将下面的语句:

<span style="font-size:14px;"><span style="font-size:14px;">monkey.logStatement = function(s) {test.log(s);} </span></span>

替换成:

monkey.logStatement = function(s){</span>test.log(s);</span>File.open("logfile.txt", "a").write(s +"\n");}
这些新代码将会确保不只所有的monkey 的行为被记录在Squish IDE的测试log中,而且也将每个行为添加在名为logfile.txt的文件中。这个文件存储在测试案例所在的目录下(如,examples/suite_monkeytest_js/tst_runmonkey)。为了将logfile.txt转换成一个Squish可以运行的测试,将‘function main() {'添加到第一行和将'}'添加到最后一行。当然了,要删掉任何不相关的行使测试运行的更快——参见2.8.2中是如何做的。

一旦monkey启动起来了,它将永远运行,直到点击Squish control bar的Stop toolbar 按钮,或者monkey崩溃或者monkey进入到一种停止响应用户命令的状态。如果monkey崩溃了,monkey使应用程序崩溃或者monkey停止响应,monkey将会停止并将一条相应的信息写到log文件中。你需要允许monkey运行一段时间——尤其是如果你的AUT成熟并且强大。(如果你想手动停止monkey,点击Stop按钮可能变得很棘手,因为monkey一直在抓取鼠标——尝试将鼠标拉到AUT的窗口外并按下Esc来停止测试。)

如何monkey设法打断应用程序,下一步就是处理产生的log文件找到原因。

2.8.2 处理Monkey log

monkey测试运行之后,必须检查和解释log 文件以发现问题出现的原因。通常,第一步是在已有的应用程序的测试套件下创建一个新的测试案例,从monkey log文件(或从logfile.txt文件)拷贝脚本语句粘贴到测试脚本的 main 函数中,然后执行该测试。如果一切

如预期那样,将会重现问题。

如果再次运行测试,如果未重现问题,有可能意味着在monkey测试运行期间已存在的一些外部因素没有运行。这可能是因为问题只在某一个时间点发生(如早上而不是下午),或者只在某种硬件环境下发生(如当磁盘空间少于10MB时),或者在monkey测试期间如果网络可用但是现在不可用(或者反之亦然),或者一些其他相似的外部因素。

排除暂时的外部因素

为了重现外部因素的数量,我们强烈建议你有一种干净的环境(可以重新创建),然后在这里做所有的monkey测试。虚拟软件——如,Xen,VirtualBox或VMware——这些都是不错的选择。

假设你成功重现了问题,下一步就是最小化脚本使最小量的工作来重现问题。这个缩小的脚本与原monkey测试脚本比有许多优点:

· 最小化脚本执行更快,因为它有更少(通常远远少于)的脚本语句。因为比原始monkey测试脚本花费更少的时间,这也意味着作为一个测试案例更方便运行以检查bug是否修复。

· 最小化的脚本使更容易的发现重复的问题。有时候两份不同的monkey测试会以不同的方式产生同样的崩溃现象。在去除所有不相关的部分后,哪个行为导致了问题的发生变得显而易见,如果在两份最小化的monkey测试中

· 最小化的脚本经常给AUT的开发者激发出一些好的灵感,如当尝试修复问题时要定位到源代码的哪个位置。 因此一个最小化的测试案例可以经常减少所需的时间来修复问题,因为开发者不得不集中精力在test中的语句上,而不是把精力放在原始monkey测试的整个代码语句上。

一种粗糙但有效的缩小monkey测试脚本的方法很容易执行,并且不会太耗时,内容如下。注释掉脚本的前半部分,运行。如果问题仍然存在,那么你可以删掉脚本的前半部分;否则,去电前半部分脚本的注释并且注释掉脚本的后半部分,然后运行它。如果问题仍然存在,那么你就可以删除掉脚本的后半部分;否则它有可能会在边界,因此注释掉第一个和最后一个四分之的部分,然后再次尝试运行中间的脚本。一旦删除了一般,对剩下的一般做相同的操作:注释掉前半部分,如果未产生问题,去掉注释并且尝试注释掉后半部分,以此类推。尽管听起来写了很多,这个操作不得不重复许多次(一般地有2-5次的删除),直到找到那些引起问题的语句。

2.8.3 Monkey是如何工作的

monkey 测试的主要逻辑囊括在Monkey 类中(定义在monkey.js中)。为了实例化该类的对象,将应用程序名字和'toolkit object'传给该类。创建好一个monkey对象后,run 函数的基本工作过程如下:

1. 收集一系列感兴趣的对象,即,monkey可以交互的buttons(包括toolbar buttons)、input fields、lists、tables trees等对象。

2. 从列表中选择一个随机的对象。该对象必须处于已经准备好了的状态(可见和已经激活)。

3. 对选择的对象执行一个脚本语句,对于按钮比较适合调用一个clickButton 函数,对于input fields适合调用可随机产生文本的type 函数,等等。

4. 使用用户提供的logStatement 函数将产生的脚本语句写入日志,然后执行语句。

特性工具包的步骤(收集一系列感兴趣的对象,从列表中选择一个对象,产生一个脚本语句)已经被分解成了‘toolkit objects’。你可以在脚本文件 qtsupport.js中找到Qt 3或者Qt 4应用程序的示例代码。因此,为了让monkey识别出新的对象(以便更多的对象可以被添加到感兴趣的对象列表中),需要调试合适的toolkit对象函数。


0 0
原创粉丝点击