侧边栏壁纸
博主头像
一朵云的博客博主等级

拥抱生活,向阳而生。

  • 累计撰写 67 篇文章
  • 累计创建 25 个标签
  • 累计收到 7 条评论

目 录CONTENT

文章目录

接口自动化 -- 基于JMeter的实战攻略(2)

一朵云
2022-05-15 / 0 评论 / 0 点赞 / 1026 阅读 / 7418 字

一、前言

  上一篇 接口自动化 -- 基于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 回车执行即可。

接口文档地址:
https://console-docs.apipost.cn/preview/40d39bd75ff83aea/33534bca09371fd6?target_id=49e70804-1776-4d5b-a905-b22cac7dd438#d84ecb9c-4ae7-45b3-bbea-0f8152827505

测试用例文档地址:
https://cdn.yiduoyun.space/JMeter%E5%AE%9E%E6%88%98%E7%B3%BB%E5%88%97/%E6%8E%A5%E5%8F%A3%E6%B5%8B%E8%AF%95%E7%94%A8%E4%BE%8B%E6%A8%A1%E6%9D%BF%28%E6%96%B0%29.csv

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、搭建模板框架

image.png

说明:

  • 基于RestFul接口风格,get 和 delete 参数请求格式相同,post 和 put 参数请求格式相同,所以可以分别归为一组。

  • post、put 接口参数请求基本分为 json提交 和 表单提交,两者参数请求格式不一致,所以用if判断分为两组。

  • 有些接口仅通过响应参数来判断测试结果是不够严谨的,往往还要再基于数据库数据进行一次校验,所以这里再加个if判断要不要sql校验。

  • 若没有加上“临界部分控制器”,就算你线程组中勾选“Same user on each iteration”,即每次迭代指定同一个用户,察看结果树的结果顺序还是有概率会乱的。“临界部分控制器”说白了就是加锁,让他们一个线程一个线程跑,不加的话,多个线程同时跑,谁先跑完谁就会先出现在察看结果树中,不利于出测试报告。

2、CSV数据文件设置

image.png

变量名称输入框内容:

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、线程组

image.png

线程组中的线程数对应测试用例的行数,每次执行计划前都要检查,避免少了漏执行。
勾选 Same user on each iteration 是为了避免各线程中的用户变量串了。

4、临界部分控制器

image.png

该控制器是通过加锁的方式,实现线程按顺序依次执行,避免察看结果树中的结果乱序(也避免写出的测试报告乱序)

5、如果(if)控制器

(1)、如果(If)控制器(get、delete)

image.png

${__jexl3("${interfaceType}" == "GET" or "${interfaceType}" == "DELETE",)}

(2)、如果(If)控制器(post、put)

image.png

${__jexl3("${interfaceType}" == "POST" or "${interfaceType}" == "PUT",)}
①、如果是json-data请求

image.png

${__groovy(vars.get("headers").contains("application/json"),)}
②、如果是from-data请求

image.png

${__groovy(vars.get("headers").contains("application/x-www-form-urlencoded"),)}

(3)、如果(If)控制器(是否校验sql)

image.png

${__jexl3(props.get("flag") == true && "${ifVerifySql}" == "TRUE",)}

props.get("flag") == true 这个表达式的用意:
flag 变量是我预留的变量,用于记录接口测试用例的状态。
如果接口响应结果与预期结果比较不符,那么 flag 变量的值就为 false ,为 false 表示测试不通过,那该用例也就没必要进行 sql 校验了。

6、用户定义的变量

image.png

testCaseStatus 是我用来记录取样器请求是否需要输出到csv测试报告的变量。(目前知道有它就行,后续用到就知道它的具体作用了!)

7、JDBC连接配置

image.png

jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai

改配置仅供参考,具体要看自己的数据库配置。

8、调试取样器

image.png

如其名,专门用来调试的,后续请求中,我们会用到很多自定义jmeter变量,用这个调试取样器可以很方便看到变量的值。(不用时就禁用)

9、察看结果树

这家伙老熟人了,就不介绍了。

总结

  至此,读取csv文档中的测试用例,并执行的jmeter脚本模板便完成了,由于文章篇幅问题,模板中的内容将在下一篇补充。

0

评论区