全网最详细,Jmeter性能测试-性能进阶, 数据驱动将融入性能测试(五)


前言

本节或者后面都可能需要用到jmeter的插件,因此需要先引入插件管理工具:plugin-manageI.x…x.jar ,把jar包放入jmeter的lib\ext目录下(由于这里不方便放文件,可以看最底下助理)

放入jar包后,重启jmeter,然后在选项卡的最下面就会有Plugins Manager

请添加图片描述

进入之后,选择Available Plugins,搜索需要的插件然后点右下角的Apply Changes and Restart JMeter即可安装插件

请添加图片描述

DDT数据驱动

性能测试因为是使用多用户并发,请求的时间也要几分钟到几十分钟不等,所以总请求量很大,因此经常需要准备测试数据。最典型的场景,就是使用一批账号不停的进行登录接口的压测,此时就需要用到DDT的概念。

1、CSV数据文件
通过在csv文件中提前写入测试数据,循环读取csv文件并提取其中数据以达到数据驱动。

(在用csv准备数据时,能用csv数据文件设置时,坚决不同${__CSVRead(,)}函数,这是个鸡肋)

添加配置元件->CSV数据文件设置

请添加图片描述

参数的含义大家可以去网上查查,这里列举几个重要的。

变量名称:

  • 就是csv的列,每一列都是一个参数。
  • 多个参数时,固定用逗号分隔
  • 如果中间有一列空列或者有一列的数据不想接受时,中间的可以用空格站位。例如:user, ,pwd

线程共享模式:

  • 所有现场(所有线程):当配置原件在线程组外部时,所有线程组共用这些数据。
  • 当前线程组:每个线程组的数据是独立的,每个线程组各自循环自己的数据。
  • 当前线程:每个线程(并发用户数)的数据是独立的,各自循环自己的数据。

2、使用sqllite实现数据驱动
使用sqlite数据库要注意,sqlite不只支持多线程的,所以使用多线程写入数据偶尔会出现错误。因此写数据时需要加上临界控制器,让所有用户串行。

操作步骤

准备测试数据,这个步骤可以有很多方法,使用Python、csv或其他方式生成测试数据都可以。这里是使用JMeter通过查询数据库。 为了方便查看结果,可以使用保存到响应文件配置元件,将结果保存到txt文件中查看。

首先编写查询sqlselect id,username,password,mobile from cb_account where password=“e10adc3949ba59abbe56e057f20f883e” and LENGTH(mobile)=11 limit 100 OFFSET 500;

配置数据库信息和jdbc请求,具体配置方式请看到多协议脚本中的JDBC脚本,记得填写Variable names,因为要去返回结果里面取值。

添加监听器->保存响应到文件(注意顺序),一般只需要勾选/填写下图中的内容,其他都不动。保存成功之后在bin目录可以找到保存的文件(这一步非必须,这里主要是为了看保存的结果,顺便介绍这个配置元件的使用)

请添加图片描述

至此,测试数据已经生成出来了,但要思考一下,这一次生成的数据只有100条,如果要继续生成,要200、300、400条以上的数据,那要怎么操作?

总不可能生成N个txt文件,然后循环去读取吧,因此就会引出下一步操作,往数据库中存入测试数据。。

这里引入一个叫sqlite的数据库,它是一个关系型数据库但同时也是一个内存数据库,它没有复杂的安装,也不需要登录账号,只要你的操作系统是图形界面且带有浏览器,那你的电脑就一定安装了sqlite。

把sqlite的jar包sqlite-jdbc-3.31.1.jar放到jmeter的lib目录里

再添加一个JDBC Connection Configuration配置元件并填写Variable Name for created pool

在地下的数据库配置信息里,Database URL填写jdbc:sqlite:sqltest.db, 后面的这个sqltest.db其实就是文件名称,这里写路径也可以。同样的,如果不写路径,它会根据文件名自动生成一个db文件并存放在bin目录下

JDBC Driver class选择org.sqlite.JDBC,剩下的就不用填写了,没有账号密码。

创建表,创建表可以通过jmeter完成,也可以通过Navicat等工具完成。我是使用jmeter去创建表的

请添加图片描述

数据库也创建完了,接下来就可以将数据写入到数据库中。再创建一个jdbc request取样器,编写写入数据的sql脚本

请添加图片描述

然后在这个取样器上再添加一个循环控制器,因为从mysql查询数据出来后后,它的数据格式是这样的,所以需要进行循环,循环的次数就是mb_#的值

请添加图片描述

然后再添加一个计数器。提一句,如果懂Python的话,现在的循环控制器+计数器≈for i in len(obj)

请添加图片描述

然后结合V函数,把变量名传进写入数据的脚本里,注意query type的选项

请添加图片描述

运行之后,去数据库就能看到插入的数据了。至此,测试数据已经有了。

请添加图片描述

将产生的数据融入到性能测试中

这里可能会有人有疑问,为什么要那么麻烦,还要再搞一个数据库,再去存数据。从MySQL上读到数据之后直接用不就好了吗?

这个问题,其实是可以,但仅能用在功能或自动化测试中!因为性能测试中,去请求MySQL,这无疑是额外增加了MySQL的压力,这会影响到性能测试结果。

那为什么会用sqlite?再单独拉一个MySQL出来不行吗?
答案是可以,但不推荐。因为sqlite是一个内存数据库,它的读取速度是肯定比MySQL快的,而且它比MySQL更轻便,数据文件可以跟着脚本走。

然后要使用sqlite的数据做性能测试需要考虑一个问题,每个线程使用的数据是独立的还是共用的?

下面这种场景就是每个线程使用的数据都是独立的,可以使用仅一次控制器去控制读取次数。

先查询sqlite,得到全部用户的手机号

请添加图片描述

把这个取样器放入到仅一次控制器中
在登录时候,引用变量

请添加图片描述

最终得到的结果就是,每个线程都会去查询一次sqlite数据库,然后得到数据后,单独去循环。

请添加图片描述

另一种场景就是所有数据都是共用的,此时就不能用仅一次控制器了。

第一步也是查询手机号,但是要放入setup线程组中

请添加图片描述

添加循环控制器,循环次数是${mb_#}

请添加图片描述

然后在循环控制内部添加一个调试取样器,并使用setProperty函数把参数写入到属性中。

请添加图片描述

最后在登录脚本中,通过P函数引用属性即可

请添加图片描述

请添加图片描述

补充,上面用的是count函数去计数的,但如果运行次数比数据大时会出现取不到值的情况,因为下标越界了。要解决的其实只需要把count函数替换成计数器就好了。

请添加图片描述

下面是我整理的2023年最全的软件测试工程师学习知识架构体系图

一、Python编程入门到精通

请添加图片描述

二、接口自动化项目实战

请添加图片描述

三、Web自动化项目实战

请添加图片描述

四、App自动化项目实战

请添加图片描述

五、一线大厂简历

请添加图片描述

六、测试开发DevOps体系

请添加图片描述

七、常用自动化测试工具

请添加图片描述

八、JMeter性能测试

请添加图片描述

九、总结(尾部小惊喜)

只要你肯努力,就没有什么是无法实现的。每一次奋斗和拼搏,都是为了成就更好的自己。所以,请勇敢向前,迎接挑战,不断超越自己!

相信自己,拼尽全力去追求梦想。道路不会一帆风顺,但只要坚持不懈、乐观向上,就一定能够战胜困难,实现自己的目标。

生命不息,奋斗不止。无论遇到什么挑战和困难,我们都要坚持、坚韧不拔地前行,用勇气和毅力去迎接未来的每一个日出和日落。

猜你喜欢

转载自blog.csdn.net/shuang_waiwai/article/details/130132516