Jmeter是一款性能测试工具,因轻量级、开源、社区接受度高、容易入门等优点,也被测试人员广泛用于做接口测试。在使用Jmeter做较大规模、复杂场景的接口测试时,往往会遇到一些困难。阅读本文你将了解:
- 在工作时间紧张情况下,如何做好自动化测试?
- 如何设计一套完整的、结构优化的jmeter接口自动化测试方案?
- 如何设计复杂的Jmeter接口测试用例?
- 如何提升编写Jmeter自动化脚本的能力?
项目背景
被测系统是泰康云TDS平台,该平台整合敏捷开发与DevOps研发管理工具,提供产品规划、项目管理、代码托管、代码检查、持续集成和持续发布、制品管理等能力,简化研发协作过程,帮助研发团队完成软件生命周期管理。本篇内容以TDS平台测试为背景,介绍测试人员如何设计接口自动化测试。
遇到的问题
本文从我们工作中常遇到的问题入手,展开问题,详细解答。
问题一:被测项目迭代频繁,测试用例设计、维护、执行已经占用了测试工程师大部分工作时间,没有时间搞自动化怎么办?
问题二:为什么选jmeter做接口自动化测试?
问题三:多人协同测试情况下,自动化脚本结构如何设计?
问题四:单接口测试用例设计、执行、断言比较简单,但是涉及多接口、异步等复杂场景该如何设计用例?
问题五:接口测试用例如何断言?只断言被测接口返回值就可以了吗?
问题六:Jmeter与流水线集成,除了jmeter+ant+jenkins,还有更优的方案吗?
问题七:如何度量接口自动化结果?接口用例成功率达到100%就够了吗?
问题八:测试脚本执行过程中遇到的稳定性、执行效率等问题如何解决?
实践分享
问题一:没有时间搞自动化测试?
下面将从敏捷项目迭代特点和自动化测试时间规划这两个方面,介绍我们是如何确认自动化测试目标、安排自动化测试时间的。
1>分析敏捷项目迭代特点,确认自动化测试目标
下图展示了在敏捷开发模式中,随着项目迭代进行,新功能特性与已有功能特性的数量变化。每个迭代新特性的测试工作量变化不大,但是已有特性的回归测试任务量却是累计增加的。
因此我们自动化接口测试的目标是针对已有特性做自动化回归测试,提升回归测试效率。而对当前迭代的新特性以手工测试为主,自动化测试为辅。
-
针对当前迭代新特性,手工测试为主,自动化测试为辅。原因分析:
当前迭代中的新功能是逐渐成长起来的。功能可能不稳定,需要修改优化,对新功能立即开发自动化测试脚本投入成本大;
当前迭代中的新功能,借助沟通,通过手动形式直接验证更有效;
每天发好几个版本,增加什么就测试什么,手工测试灵活性高。
-
针对上一个迭代已有特性,采用自动化回归测试。原因分析:
上一个迭代已有功能相对稳定,自动化脚本开发和调试都没有障碍,脚本开发效率更高;
自动化测试发现缺陷的能力比手动测试弱,用于回归测试更符合自动化测试的特点。
2>为自动化测试腾出时间
方法:
- 在迭代初期,通过思维导图梳理测试点,而不一定要写详尽的测试用例,从而节省时间编写上一个迭代特性的自动化测试脚本和脚本维护;
- 在迭代测试过程中,利用探索式测试风格,持续开展测试学习、设计、执行、结果分析,提高测试效率,积累测试经验,节省测试时间。
问题二:为什么要用Jmeter做自动化接口测试?
用Jmeter做接口测试工具有以下优势:
- 支持测试脚本录制,badboy、blazemeter等;
- 支持多平台部署,易于与流水线集成;
- 开源免费,提供丰富组件及第三方插件库;
- 支持多线程组并行,提高接口测试效率;
- 一学多用,接口测试->性能测试。
问题三:多人协同测试,自动化脚本结构如何设计?
Jmeter元件组合是非常灵活的,为了提升用例维护效率、方便多人协作,我们参考相关资料及项目实践经验,总结了如下图脚本结构:
以下为主要脚本结构及对应Jmeter元件说明:
测试计划:项目根节点
jmeter相关元件说明:
TestPlan:控制测试用例执行方式:并行/串行
全局参数配置:
jmeter相关元件说明:
User Defined Variables:存放测试环境(dev/test)配置信息
JDBC Connection Configuration:存放数据库连接配置
HTTP Request Defaults:配置http接口默认参数,全局生效,eg:请求timeout=10000ms
当前脚本通用模块库:存放所有测试相关采样器,由用例模块通过模块控制器调用
包含健康检查相关、webShell相关、数据准备模块、变量初始化模块、数据断言模块、登录模块、团队管理模块、流水线模块、制品管理模块等业务模块
jmeter相关元件:
Transaction Controller
HTTP Request Sampler
JDBC Request Sampler
WebSocket request-response Sampler
WebSocket Open Connection Sampler
Response Assertion
JSON Assertion
BeanShell Assertion
历史组件/模块设计参考
接口测试模板
用例模块:存放接口测试用例,通过模块控制器调用当前脚本通用模块库
包含:项目管理、部署组管理、svn管理、团队管理、流水线管理、代码库管理、制品管理等相关测试用例集合
jmeter相关元件
Test Fragment:作为用例分割符
Thread Group:用例组,存放一组相关测试用例
Transaction Controller:事务控制器
Module Controller:调用当前脚本通用模块库
User Defined Variables:存放用例相关测试数据
BeanShell Sampler:实现用例编号自增,参数传递等
测试结果展示
View Results Tree
Summary Report
问题四:复杂场景如何设计用例?
复杂场景用例设计之前,先分享下从功能角度出发,我们是如何设计用例的。如下图所示:
除此之外,结合项目实际情况,还需要考虑其他非功能场景:
- 异常测试,eg:幂等(重复提交、超时重试)、接口事务、分布式场景、环境异常、大数据量等;
- 性能测试,eg:响应时间、吞吐量、资源利用率等;
- 安全测试,eg:敏感信息是否加密、接口权限控制、sql注入等。
下面以实际项目中的两个场景为例,来分享我们是如何应对复杂测试场景的。
1、多接口实例:流水线执行场景测试,涉及6个接口
方法:
步骤1、分析相关接口调用顺序、阶段。
前置准备
新建项目接口、项目关联代码库接口、新建部署组接口
用例执行
新建流水线接口、流水线执行接口
后置处理
项目删除接口
步骤2、测试数据梳理:
需要在运行前初始化的数据,包含:
环境配置信息,eg:ip、端口、数据库配置等
测试场景共享数据,eg:代码库信息
单接口测试数据
运行时动态生成的数据,包含:
某个接口的返回数据,其他接口需要使用,eg:项目id、部署组id、流水线id等
需要调用相关函数或工具动态生成的数据,eg:uuid、时间戳等
步骤3、梳理测试用例,编写相关脚本,脚本图示如下:
2、异步实例:流水线配置定时任务后,验证定时任务是否按照配置时间成功触发
难点分析:流水线配置定时任务不会立即执行,定时任务触发需要等待websocket推送消息
方法:
步骤1:新建流水线配置定时任务执行时间为当前时间+1min
使用beanshell采样器实现
Calendar calendar = Calendar.getInstance();//获取当前时间
calendar.set(Calendar.MINUTE,calendar.get(Calendar.MINUTE)+1);
步骤2:通过WebSocket request-response Sampler监听定时任务推送的消息,完成断言。脚本图示如下:
问题五:接口测试用例如何断言?
对于接口的正确性验证,只验证被测接口返回body很明显是不够的,这里总结了如下断言方法:
-
基础断言:
响应断言
正则匹配
响应码匹配
jackson + beanshell断言
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
//获取接口返回body--实际结果
String json_response = prev.getResponseDataAsString();
ObjectMapper mapper = new ObjectMapper();
JsonNode rootNode = mapper.readTree(json_response);
JsonNode dataNode = rootNode.path("data");
JsonNode totalNode = dataNode.path("total");
String actual = totalNode.toString();
//接口返回的总条数--期望结果
String except = vars.getObject("program_source_data").size().toString();
if(actual.toString().equals(except)){
Failure = false;
}else{
Failure = true;
FailureMessage = "期待数量:"+except+" VS 实际数量:"+actual+"不一致";
}
- 相关接口辅助验证:
- 数据库匹配,JDBC Request + BeanShell断言,示例如下:
// JDBC Request 采样器 获取返回结果 -> triggers_count
SELECT
count(*)
FROM
qrtz_triggers a
WHERE
a.JOB_NAME LIKE '%${search_key}%' ORDER BY JOB_NAME desc;
// BeanShell断言
String except = vars.get("except_count");//期望结果
String actual = vars.get("triggers_count_1");//数据库查询到的总条数
if(actual.equals(except)){
Failure = false;
}else{
Failure = true;
FailureMessage = "期待数量:"+except+" VS 实际数量:"+actual+"不一致";
}
问题六:jmeter+ant+jenkins如何改进?
jmeter+ant+jenkins是一种常用的流水线集成方法,但在集成过程中存在环境配置繁琐的问题,比如:
-
需要安装jdk、ant、jmeter环境,版本变更还需要重新卸载安装
-
jmeter依赖第三方jar包,每次都需要手动打包上传服务器
-
jmeter配置文件变更,需要去服务器手动修改
-
jenkins中不同流水线依赖jmeter版本不一致时,需要手工安装多个jmeter版本
针对以上问题,我们采用的替代方案是 jmeter-maven-plugin + mvnw ,运行环境只需要安装jdk就可以了,将maven、jmeter版本以及第三方jar包管理,都托管到gitlab一个代码库中进行集中管理。
进行接口测试只需要git clone代码,然后执行 mvnw clean verify就可以触发测试执行。代码库配置如下图:
工具依赖
问题七:如何度量接口自动化结果?
1、jmeter原生报告优化
jmeter CLI运行方式产生的测试报告统计信息偏向性能指标,无法满足jmeter接口测试需求。因此使用dom4j解析jmeter生成的xml结果文件,使用ExtentReports5生成html报告,报告示例如下:
2、使用jacoco统计接口测试代码级覆盖率报告
接口测试用例成功率即使达到100%,仍然会存在漏测。因此使用jacoco来统计代码覆盖率,分析接口测试未覆盖的代码,进行测试用例补充完善。
关键步骤说明:
步骤1:被测服务打桩
java -javaagent:jacocoagent.jar=includes=*,output=tcpserver,port=9002,address= * -jar 被测服务.jar
步骤2:调用jmeter脚本执行测试
./mvnw clean verify --settings=settings.xml
步骤3:dump覆盖率报告
java -jar jacococli.jar dump --address 被测服务IP --port 9002 --destfile ./jacoco1.exec
步骤4:生成覆盖率报告
java -jar jacococli.jar report ./jacoco1.exec --classfiles BOOT-INF/classes --sourcefiles /src/main/java --encoding utf-8 --html jacoReport
报告展示如下图 :
问题八:如何提升用例执行稳定性和效率?
当测试case数量持续增加时,需要考虑执行稳定性和效率。
总结如下:
预置数据代替创建过程
由于操作越多稳定性越低,使用预置数据而非实时生成的数据,速度更快,稳定性更高。
隔离
使用不同账号等进行隔离。通过隔离,用例执行失败的脏数据就不会影响其他用例;
自动化脚本测试数据与功能测试数据隔离。
jmeter配置优化
设置全局采样器超时等待,eg:timeout=12000ms , 超时自动失败;
针对性能较差的接口配置jmeter定时器 , 防止被测服务压力过大;
设置JMeterProcessJVMSettings,增大内存。
防御式编程
编写测试代码时 , 不能假设数据已存在或者没有脏数据残留,所以预先的判断和清理很重要,比如检查到数据缺失就实时修复、用例运行之前考虑清除临时数据。
不足之处,欢迎指正。
最后: 可以在公众号:伤心的辣条 ! 免费领取一份216页软件测试工程师面试宝典文档资料。以及相对应的视频学习教程免费分享!,其中包括了有基础知识、Linux必备、Shell、互联网程序原理、Mysql数据库、抓包工具专题、接口测试工具、测试进阶-Python编程、Web自动化测试、APP自动化测试、接口自动化测试、测试高级持续集成、测试架构开发测试框架、性能测试、安全测试等。
如果我的博客对你有帮助、如果你喜欢我的博客内容,请 “点赞” “评论” “收藏” 一键三连哦!喜欢软件测试的小伙伴们,可以加入我们的测试技术交流扣扣群:914172719(里面有各种软件测试资源和技术讨论)
好文推荐
转行面试,跳槽面试,软件测试人员都必须知道的这几种面试技巧!
面试经:一线城市搬砖!又面软件测试岗,5000就知足了…
面试官:工作三年,还来面初级测试?恐怕你的软件测试工程师的头衔要加双引号…
什么样的人适合从事软件测试工作?
那个准点下班的人,比我先升职了…
测试岗反复跳槽,跳着跳着就跳没了…