性能测试之测试工具(一)

性能测试工具

对于一个性能测试工具来说,如果能实现以下几个大功能,那么就基本上满足了性能测试工具的功能。

  1. 录制或编写脚本功能
  2. 参数化功能
  3. 关联功能
  4. 场景功能
  5. 报告生成功能

除此以外,在工作的细节上还有更多要求,就要看工具的实施能力了。

有很多性能测试工程师希望工具能做得非常全面,又人性化,而纵观当前的性能工具,真正能够做到傻瓜式录制完脚本,自动设置好参数化、关联、场景、直接产出结果的工具是没有的。不管是云性能测试平台,还是分布式性能测试工具(当然性能测试工具几乎全部具有分布式能力),都需要性能测试人员来定义参数化数据、设置关联、配置场景。

因此,在性能测试过程中,对工具的配置就成为了性能测试工程师的基本能力。我们就来看下在性能测试工具中,如何录制脚本。

性能测试工具的脚本能力

性能测试工具的脚本编写能力分为两类,一个是录制,另一个是手工编写。

现在市场上的性能测试工具虽然支持录制功能,但大部分也只是支持HTTP协议。在我们熟知的工具中,也只有LoadRunner支持更多协议的录制能力。不过幸好,现在我们所面对的应用大部分是HTTP协议的应用。

对手工编写脚本的部分,因为大部分都取决于业务场景,所以很难提供出共性。如果有人提出针对性的场景,我们再做相应的示例就行。

因此今天的文章将着重讲一下测试工具的录制功能。很多人以为性能工具录制功能非常简单,点几下就能生成一个脚本,但是录制完之后,针对脚本的增强完善就做得非常少了。事实上,针对脚本,我们不仅要录制下来,还要了解录制的原理和录制完之后的脚本增强。不然,在场景中还是会遇到各种各样的问题。

性能工具中的录制功能

录制功能从原理上来说,分成两种:

  1. 本地录制:通过截取并解析与服务器的交互协议包,生成脚本文件。比如说LoadRunner调起IE的时候,不用修改IE的代理设置,就可以直接抓取HTTP包,并通过自己的解析器解析成脚本。
  2. 代理录制:通过代理服务器设置,转发客户端和服务器的交互协议包,生成脚本文件。Jmeter中的脚本录制功能就是这样做的。

这两者的不同点主要在于操作上。本地录制相对简单,但有些场景受限,比如说操作只能在某台服务器上,但是这台服务器又不允许安装工具;代理录制操作复杂一些,但可以满足更多的场景。

通过这张图,我们可以简单看到代理录制逻辑:

 

  1. 我们在IP2.2.2.2上的主机上,打开一个代理程序,开81端口,所有到81端口的都转发到1.1.1.180端口。
  2. 3.3.3.3主机要访问1.1.1.180端口,可以通过访问2.2.2.281端口进行转发。

这里需要你注意的是,代理是用来转发数据包的,并不是重定向哦。不管是在本机用代理,还是远程用代理,这个逻辑都是不会变的。

有了这个逻辑之后,你要明白的一点是,客户机不一定要和代理服务器在同一台机器上。

不同的工具录制方式略有不同。今天我们用常见的两个性能测试工具LoadRunnerJmeter做为示例工具。

Jmeter的录制功能:首先打开一个Jmeter,添加一个线程组,再添加一个HTTP(S) Test Script Recorder。界面如下:

 

这里有几个关键点说明一下:

Target Controller:这里指定录制出的脚本要放到哪里去。如果你想把不同的脚本放到不同的线程组中去,在录制的时候就可以拆分开。

Grouping:分组,这个分组功能很实用。但是如何分组就具体的目标相关了,这一点下面我们再细说。

点击start按钮时,会提示创建一个根CA证书。这个证书生成在bin目标中,文件名是:ApacheJmeterTemporaryRootCA.Crt,七天有效期。这个证书将被用来客户端转发HTTPS的请求。与此同时,还有另一个证书在同目录中生成,名字是proxyserver.jks,这是Jmeter自己生成的根证书。

 

前面我们说到了,Jmeter使用代理的方式来录制的。如果服务端用了SSL证书,在代理时也要加SSL证书,那么代理录制的结构就会变成这样。

 

上面的SSL证书就是用来处理上图中蓝色的这一部分。我们点击OK之后,就会出现这个界面。在这个界面中,只有两个配置项。

Prefix:请求名的前缀。

Create new transaction after requestms):一个请求完成之后,如果下一个请求超出了这里设置的时间间隔,就创建一个新的事务。

 

然后到主机上设置代理。注意:这里的代理设置,是在需要访问的客户机上。这个客户机,不一定是压力机所在的机器。这里的localhost,也应该设置的是代理服务所在的主机IP

 

如果你要设置为HTTPS,还需要做如下两步。第一步是,浏览器代理要把Secure Web ProxyHTTPS)选择上,同事填上相应的代理IP和端口,下图是macOS上的图示。

 

但你会发现,这时仍然录制不了HTTPS应用,访问时会出现如下提示:

 

这时就要在客户端机器上导入上面提到的ApacheJmeterTemporaryRootCA.Crt。我们打开证书管理软件,在macOS上是KeychainAccessWindows上是certmgr.msc

这里以macOS为例。首先打开KeychainAccess

 

点击图片中的Import Items。选择ApacheJmeterTemporaryRootCA.Crt,导入之后选择证书。会看到如下提示:

 

因为这个证书不在系统信任的默认列表里,所以会提示证书不可信。

另外这里我可以再多说一句,你注意的是,全球的可信任的根证书都是默认添加到系统中的,如果你在访问网站时,提示你要安装什么证书,一定要明确知道证书是从哪来的,不要随意安装未知来源的证书。目前国内的HTTP[S覆盖度不高,仍然有大量的HTTP网页,这是需要推进的网络安全之一。

然后我们双击证书。

 

改为Always Trust即可。提示如下:

 

这时,HTTPHTTPS都会被录制下来。然后在客户机上打开浏览器,访问你的页面,这样就录制到脚本了。

再说Grouping的设置有如下几种,如果需要将脚本分开,先确定需要如何拆分。示例如下:

 

第一个选项是Do not group samples,也就是不分组。这是很多人使用的默认选项,这就相当于没有事务的概念了,每个请求都会单独统计TPS和响应时间信息。

 

第二个选项是Add separators between groups,在组间添加分隔,就是为了好看!

 

第三个选项是,Put each group in a new controller,每个组放一个新的控制器。这是一个Simple Controller,它的作用也只有一个:就为了好看!

因为脚本太长了,看起来不方便,所以分个组,看着清晰一些。话说回来,你们见过在Jmeter中有很长脚本的吗?是不是很多人都没见过?

 

第四个选项是,Put each group in a new transaction controller,将每个组放入一个新的事务控制器中。

 

Transaction ControllerSimple Controller的区别就是Transaction Controller会作为事务统计脚本执行的时间,而Simple Controller不会。

第五个选项是Store 1 st sampler for each group only,只存储每个组的第一个样本。并从HTML文件获取所有的内涵资源和自动重定向将开启。也就是说,虽说只记录了一个Sampler,但是资源也会下载,重定向也会开启。

我们把这个过程抓出来看一下,因为Jmeter没有把这个过程显示出来。所以这里用Chrome Developer Tool抓一下看看。举例来说,我们在浏览器里只输入了一个https://www.jd.com。抓出如下结果。

 

在上面的图中,你可以看到,www.jd.com,第一个就是307 Interal Redirect。接着请求Document,然后下面是静态资源。在录制时,选择Store 1 st sampler for each group only后,只会录制到第一个请求,而后面这些在回放脚本时也都会访问。

jmeter的代理录制中,还有一个界面如下:

 

 

中文界面中通常将之翻译为包含模式、排除模式。通常这里都会写上正则表达式,比如说常用的一些:

 

通过上面的内容,我们已经把Jmeter录制的原理和操作的过程都详细地描述了一遍,关于Jmeter的录制功能就介绍到这里。

承上启下的话

为什么Jmeter这样的功能单一,性能又不好的性能测试工具能这么快的占领市场呢?

在我看来,工具能不能用取决于它能不能满足需要。在很多的性能测试场景中,Jmeter已经够用了。因为性能压力工具只需要两条曲线:TPS和响应时间(如果有错或者错误很多,再看一下错误率曲线)。这些功能,Jmeter都可以提供。

现在的性能项目中,我们要的压力其实并没有很大,并且大部分都是HTTPTCP之类的常见协议,脚本所使用的资源并不多。一般能达到万级TPS的都很少很少,所以弄几个机器,Jmeter也就够用了,再加上免费开源,何乐而不为?

LR的失败之处就是价格高,更新慢。

LR中的录制功能

我们都知道LR其实可以录制很多协议,这也是它前期扩展市场的很重要的因素。应该说,在录制这个功能点上,所有的性能测试工具都不如LR。并且LR在其他功能上都是强大的,就是有很多你不需要的,不常用的功能,它都具备。

很多人都知道,LR种的Vuser Generator 只支持Windows。是因为它一开始基于WinInet做的,就是Windows Internet API。后来可能是觉得WinInet太恶心了,就换成了Windows socket。而Windows socketUNIX socket还是有一些小区别。所以就一直在Windows上了。

而且现在Load Generator已经支持UNIX了,再加上Port Mapping的功能,在Unix平台上也可以操作。

常规录制,打开Vuser Generator,点击Start Record,出现如下界面:

 

在这个图中,首先的选择是:

 

这里用IE或者应用程序都可以,只要支持我们选择HTTP协议就行。

Recording into action这里默认的action,请你一定要注意的是initactionend这三个都是action,并没有什么区别。控制initend只执行一遍和action会重复执行多次的功能也不在它们自己身上,而是在run logic里。这一点我在后续的文章中再细说。

点击Options之后,跳出界面如下:

 

在这个界面中,有很多可以调的内容。这里举几个重要的点。

 

这个功能点之所以重要,是因为这两个选项录制出来的脚本有很大差别。

其实这一点和Store 1 st sampler for each group only是一样的含义。

如果选择了HTML-based script,就是一个页面一个请求了,而在回放和压力时,这个页面的所有资源都会请求。如果选择了URL-based script,就是每个资源一个请求。这个选项有好处是,便于控制和查找问题。如果不想要某个资源,直接注释掉就好了。

其次,我们需要注意关联功能。

 

你可以在这里事先设置好关联的规则,比如说这样的:

 

你可以设置左边界为:JSESSIONID=,左边界为冒号,然后在你录制的时候,如果规则匹配到就会自动创建关联。

点击OK之后就开始录制了。出现一个工具条,如下所示:

 

在这个功能条上具有的功能是:暂停、停止、新建Action,创建集合点、创建事务的起点和终端、加备注、加文检查点。

一般在业务流比较长的脚本中,性能测试工程师都会通过新建Action把操作区分开,也会在录制过程中创建好必要的事务。

 

注意哦,URL-based script的时候,有一个concurrent group,这个并发组是同时发出请求的。在Jmeter中有一个Parallel Downloads,这两者功能一样。

上面就是LR中常规录制的功能。录制前,看下readme,看LR支持什么浏览器。在12.6readme中,已经声明支持win10+IE了。但是我们再使用的过程中还是遇到各种各样的问题,比如调不出浏览器、录制不出脚本、卡死的问题。

还有一些应用只支持Chrome,而有时,有些应用只是能在某些特定的机器上执行,而那些机器又不能装Vuser Generator。在这样的情况下,我们只能使用Port Mapping的功能。是的,在LR中,Port  Mapping就是代理录制的方式。

首先打开Vuser Generator,点击开始录制,配置成如下界面:

 

注意,这里一定要选择的是LR安装目录bin种的wplus_init_wsock.exe,他是基于windows socket的。然后点击Option – Port Mapping,如下图所示:

 

从图中可以看到它的代理功能很全面,不仅支持不同的Service ID ,也支持SSL。这时访问的逻辑是这样的。

 

设置完成,返回之后我们就可以开始录制了。会打开一个代理程序。截图如下:

 

这时本地也会开一个92端口。

 

注意,如果是远程访问,注意不要被防火墙拦截了。接着单开浏览器输入要录制脚本的地址,就可以打开录制页面了。同时,录制工具挑中也会显示出有事件产生。

注意:输入的地址是:http://10.211.55.3:92/ ,可以看到打开的是http://10.211.55.22:91/的界面。

 

 

回放时,画红框的地址是会报错的。所以要将ipport换成39.105.21.22.91才能回放。替换后就能回放成功了。如果不成功再根据日志判断要做什么的脚本增强。

LRPort Mapping还可以支持FTPSocketPOP等协议。这个功能点也不复杂,操作起来也简单,只要想明白访问链路就可以了。LR的录制常用功能基本就这些了

总结

录制功能并不是性能测试工具必备的功能。对性能测试工具来说,关键功能是能实现模拟批量的真实请求逻辑。至于脚本式如何实现的,怎么做都是可以的。所以我们可以用其它工具,如BadBoyfiddler、甚至是wireshark抓到交互请求,再放到jmeter中实现脚本,也是完全可以的。

当然没有脚本就无从实现压力,所以脚本的实现是性能测试工程师必备的基础技术,理解原理也是必须的。

思考题

说一下代理录制的逻辑?以及访问网页时,为什么第一个请求至关重要?

posted @ 2021-06-27 19:18  大圣原来姓毛  阅读(302)  评论(0编辑  收藏  举报