一、前言
上一篇 接口自动化 -- 基于JMeter的实战攻略(1) 已经描述了我们接口自动化测试文档要怎么编写了,本系列的第二、三篇,就展开说说怎么让 JMeter 读接口测试用例文档内容,并执行起来吧!
二、准备
想跑接口,必然需要服务端来响应接口,这里我基于springboot框架简单的写了几个接口,并非实际项目,专门为这篇文章而写的(至于怎么写,其实不是我们的主要关注点,所以我就不展开说明了。至于怎么用,看下接口文档就知道怎么用了)。
server jar 包资源:
https://cdn.yiduoyun.space/JMeter%E5%AE%9E%E6%88%98%E7%B3%BB%E5%88%97/jmeter-server.jar
下载好的jar包资源,打开cmd进入对应文件路径,输入 java -jar jmeter-server.jar 回车执行即可。
MySql数据库:
模拟库存,仅用于后续jmeter的接口返回值需要做数据库校验的场景(jmeter-server.jar并没有实际操作数据库,说白了,我懒。)
CREATE TABLE `product` (
`id` INT NOT NULL,
`product_name` VARCHAR ( 255 ) DEFAULT NULL,
`price` INT DEFAULT NULL COMMENT '单位:分',
`number` INT DEFAULT NULL,
PRIMARY KEY ( `id` )
) ENGINE = INNODB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci;
INSERT INTO `test`.`product`(`id`, `product_name`, `price`, `number`) VALUES (1, '牛奶', 300, 2);
INSERT INTO `test`.`product`(`id`, `product_name`, `price`, `number`) VALUES (2, '咖啡', 700, 4);
三、新建jmeter脚本
1、搭建模板框架
说明:
-
基于RestFul接口风格,get 和 delete 参数请求格式相同,post 和 put 参数请求格式相同,所以可以分别归为一组。
-
post、put 接口参数请求基本分为 json提交 和 表单提交,两者参数请求格式不一致,所以用if判断分为两组。
-
有些接口仅通过响应参数来判断测试结果是不够严谨的,往往还要再基于数据库数据进行一次校验,所以这里再加个if判断要不要sql校验。
-
若没有加上“临界部分控制器”,就算你线程组中勾选“Same user on each iteration”,即每次迭代指定同一个用户,察看结果树的结果顺序还是有概率会乱的。“临界部分控制器”说白了就是加锁,让他们一个线程一个线程跑,不加的话,多个线程同时跑,谁先跑完谁就会先出现在察看结果树中,不利于出测试报告。
2、CSV数据文件设置
变量名称输入框内容:
interfaceNo,interfaceIP,interfacePort,interfaceAddress,caseNo,caseName,interfaceType,headers,testData,associatedData,expectedResults,actualResults,ifVerifySql,executeSql,expectedSqlResults,actualSqlResults,caseStatus,expecteMan,executionTime,remarks
按顺序依次对应接口测试文档中的列名为:
接口编号,域名/IP,端口,接口地址,用例编号,用例名称,接口类型,headers,测试数据,关联数据,预期结果,实际结果,是否验证sql,执行sql,预期sql结果,实际sql结果,用例状态,执行人,执行时间,备注
3、线程组
线程组中的线程数对应测试用例的行数,每次执行计划前都要检查,避免少了漏执行。
勾选 Same user on each iteration 是为了避免各线程中的用户变量串了。
4、临界部分控制器
该控制器是通过加锁的方式,实现线程按顺序依次执行,避免察看结果树中的结果乱序(也避免写出的测试报告乱序)
5、如果(if)控制器
(1)、如果(If)控制器(get、delete)
${__jexl3("${interfaceType}" == "GET" or "${interfaceType}" == "DELETE",)}
(2)、如果(If)控制器(post、put)
${__jexl3("${interfaceType}" == "POST" or "${interfaceType}" == "PUT",)}
①、如果是json-data请求
${__groovy(vars.get("headers").contains("application/json"),)}
②、如果是from-data请求
${__groovy(vars.get("headers").contains("application/x-www-form-urlencoded"),)}
(3)、如果(If)控制器(是否校验sql)
${__jexl3(props.get("flag") == true && "${ifVerifySql}" == "TRUE",)}
props.get("flag") == true 这个表达式的用意:
flag 变量是我预留的变量,用于记录接口测试用例的状态。
如果接口响应结果与预期结果比较不符,那么 flag 变量的值就为 false ,为 false 表示测试不通过,那该用例也就没必要进行 sql 校验了。
6、用户定义的变量
testCaseStatus 是我用来记录取样器请求是否需要输出到csv测试报告的变量。(目前知道有它就行,后续用到就知道它的具体作用了!)
7、JDBC连接配置
jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai
改配置仅供参考,具体要看自己的数据库配置。
8、调试取样器
如其名,专门用来调试的,后续请求中,我们会用到很多自定义jmeter变量,用这个调试取样器可以很方便看到变量的值。(不用时就禁用)
9、察看结果树
这家伙老熟人了,就不介绍了。
总结
至此,读取csv文档中的测试用例,并执行的jmeter脚本模板便完成了,由于文章篇幅问题,模板中的内容将在下一篇补充。
评论区