Ⅰ.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对象函数。


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

Linux测试标准------stress压力测试

一、stress:linux压力测试软件使用指南。 -q --quiet 不显示运行信息 -n --dry-run 显示已经完成的指令执行情况 -t secs --...

APP 压力测试脚本举例

应用有些功能需要压力测试,对应的就是某些按钮需要N多次的点击来进行压力测试: 有了adb shell getevent 获得点击屏幕位置坐标的方法 就可以写个脚本,让其代替你一直点啊点的这等...

压力测试工具集

工具 相关网址LoadRunner http://www.mercuryinteractive.com/products/loadrunner/SilkPerformer http://www.seg...

压力测试shell脚本

一般情况下,用ab进行压测时,只执行一次的话,结果不是很准,所以我们就要手动的执行几次。这个操作很麻烦,这里写了个shell脚本,对apache的ab做了封装,只要传入指定的测试次数,自动进行,测试完...

python多线程http压力测试脚本

#coding=utf-8import sys import time import thread import httplib, urllib import random import uuid i...

loadrunner简单使用——HTTP,WebService,Socket压力测试脚本编写

先说明一下,本人是开发,对测试不是特别熟悉,但因工作的需要,也做过一些性能测试方面的东西。比较久之前很简单的用过,最近又用到了,熟悉一下。现做一个总结。  使用loadrunner进行压力测试主要分...
  • zljjava
  • zljjava
  • 2012年12月24日 01:29
  • 14123

Ⅰ.20 如何创建和访问应用程序的绑定

这一部分讨论Squish的一个先进并且强大的特性——如何创建提供应用程序绑定的包装套。 自动动态绑定: 从Squish4.0开始,已经加强了对Squish绑定的支持。对于Java和基于Qt的应用程序,...
  • dzh0622
  • dzh0622
  • 2015年12月16日 10:54
  • 373

Ⅰ.2.6.4 如何测试 Table Widgets,以及使用外部数据文件(Qt 4)

这个部分,我们将了解如何测试 csvtable 程序。这个程序使用了 QTableWidget 来展现一个 .csv(以逗号间隔开值)文件的内容,它提供了基本的处理数据的功能——插入行、删除行、编辑格...
  • dzh0622
  • dzh0622
  • 2015年11月18日 13:58
  • 307

负载测试(Load testing)、压力测试(Stress Test,应称为强度测试)和性能测试

Quotes: http://www.cnblogs.com/liupeizhi/archive/2011/01/24/1943070.html 负载测试(Load testing)、压力测试(Str...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Ⅰ.2.8 如何做自动压力测试(Automatic Stress Testing)
举报原因:
原因补充:

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