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

原创 2015年11月19日 11:36:19

这个部分解释了如何使用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对象函数。


版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

Web性能测试自动化方案

常见的性能测试是这样的: 有人开发了百度知道,然后,想知道单机的最大并发处理量是多少。这就需要性能测试了。然后,我们常见的性能测试方法是: 1.apache的ab; 2.JMeter; 3.l...

Ⅰ.2.6.8 如何测试QTable (Qt 3)

一个QTable由那些可以使用QTable::item函数返回的item组成的。 例如,为了测试一个text中包含“Kiwi”的cell是在第五行第四列(使用基于0的索引),可以使用下面的代码: ...

麦琪的礼物

麦琪的礼物 教案示例一   作者:番达 文章来源:网络共享 更新时间:2006-1-5 【字体:小 大】   教案示例一   第一课时     (一)明确目标     1.理清故事情节     2.掌...

Ⅰ.2.6.5 如何测试QAction、QMenu、以及QMenuBar(Qt 4)

如果我们想检查一个菜单项的属性,可以使用Squish IDE插入验证点,或者手写代码。这里我们介绍如何写代码。 QMenus(QWidgets 也是如此)有一份QAction 对象列表。我们可以获取这...

Ⅰ.19 如何实现自动化批量测试

这个部分将会阐释设置自动化测试运行的必要步骤,以及如何处理结果。 由创建一个处理Squish的测试结果的脚本开始(以XML格式输出),这个结果产生一个HTML文件,它包含的结果可以用web浏览区打开...

Ⅰ.4 如何使用测试语句

这个部分讨论Squish提供的用以执行测试的API,测试完会得到相应的结果。验证点也用这个测试API,更多的关于验证点的说明将在在17章中介绍。 比较两个值并将比较的结果写入测试日志,使用test.c...

Ⅰ.2.6.7 如何测试QListView (Qt 3)

这个部分介绍了如何验证一个Qt 3 list view widget(事实上是个tree widget)包含了我们所期望的items。 一种方法是遍历list view中的所有items,检查它们的每...

第Ⅰ部分 Squish教程

这篇Squish用户指南解释了所有Squish最常用的特性,提供了一些如何最好的使用Squish的示例。 该篇指南主要致力于Squish的脚本支持,不同的脚本语言支持,这里我们只给出Python的示例...

使用Squish自动化测试Qt APP心得

Squish可以自动化测试基于Qt的应用程序,经过一段时间学习,遇到一个很棘手的问题,就是Squish并不能检测QML中的MouseArea元素,每个可接受鼠标点击事件的item上都覆盖一个Mouse...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)