一、JMeter接口功能测试
1、概述
接口功能测试主要是测试系统中各个接口基本功能是否能够正常运行提交的数据(正向数据+逆向数据),模拟用户的多样性操作,检测程序的响应是否合情合理(符合预期)。
2、功能测试实现步骤
- 设计测试用例
- 准备测试数据:按照测试用例设计测试数据。
- 搭建功能测试框架(CSV)
- 运行测试计划,查看结果树,验证比对测试结果是否符合预期
3、设计测试用例
(1)测试用例的设计规则
设计测试用例时,我们首先将用户的操作进行分类,分类原则为正向+逆向,其详细原则如下如所示:
-
- 覆盖所有的必选参数(正向)
- 组合可选参数(正向_覆盖率问题,考虑人力和时间成本)
- 参数边界值(逆向_比如年龄边界)
- 如果参数的取值范围是枚举变量,需要覆盖所有枚学值
- 空数据(逆向-不录入数据)
- 包含特殊的字符(+-*/....)
- 越界的数据(比如长度过长或过短)
- 错误的数据(逆向_比如错误的手机号、身份证号....)
(2)测试用例实现模板
一般来说,接口与功能测试测试用例的设计模板要包含标题描述、请求地址、请求方式、请求数据、预期响应等,具体格式如下图:
4、准备测试数据
测试数据是按照测试用例中请求数据的要求设计的一条条具体的用于测试的数据,其详细格式如下:
5、搭建测试框架进行测试
(1)搭建测试框架(创建测试计划、线程组、HTTP请求),设置线程组的循环次数为35(几条数据就设置几),如下图所示:
(2)线程组----右键----添加----配置元件----添加CSV Data Set Config,设置文件名,文件编码,变量名等信息。
(3)打开之前创建的HTTP请求,调用CSV中的变量名称。
(4)运行测试计划,查看结果树,验证比对响应信息是否符合预期,如下图所示:
二、JMeter接口自动化测试
1、概述
接口自动化测试就是由程序生成测试数据且让程序代替人工判断响应结果(程序代替人工)来进行测试,具有安全、高效、功能强大的特点,主要是用于接口功能测试已经通过后,每次版本迭代后进行验证性测试,确保本次迭代并未对其他接口产生影响。
2、接口自动化测试的原则
- 自动化测试是对功能测试的补充,并不是测试程序所有功能,而是测试程序的一些主要功能和一些经常被复用的功能。主要用于测试程序版本迭代后之前版本的接口功能是否可用。
- 自动化测试测试数据一般只考虑正向数据,因为自动化测试只是对功能测试的补充,且通过JMeter生成多样性的测试数据比较困难。
- 自动化测试完成后,数据库数据必须恢复到测试之前的状态,这样可以重复对系统进行自动化测试,测试脚本和流转数据不变。
- 线程组之间不要有关联不要有业务逻辑,这样可以单独测试某一个功能,出现问题时便于分析问题所在。
3、实现流程
- 搭建框架:(抽取http请求默认值、http信息头管理器、结果树)
- 设计创建SetUp 和TearDown线程组:一般SetUp创建数据,TearDown删除数据
- 使用SetUp生成测试数据:借助于counter 函数,数据格式:自定义前缀__调用计数器函数
- 跨线程传值:将SetUp线程中生成的测试数据传递给TearDown,setUp 使用setProperty 导出数据(通过正则表达式提取器获取数据id),tearDown 使用property函数引入数据。
- 普通线程结合SetUp 和TearDown使用,执行顺序为SetUp 、普通线程组、TearDown,其中多个普通线程组可能并发执行,在测试计划中勾选独立运行每个线程组可按顺序执行。
- 直连数据库,操作数据库数据。
- 使用断言组件让程序代替人工判断响应结果
- 运行测试计划,查看测试结果树。
4、操作数据库的流程
- Jmeter本身不具备数据连接功能,整合第三方实现
- 配置数据库连接信息:变量名+数据库路径+第三方的启动入口+账号密码
- 使用JDBC Request操作数据库数据,并将查询的结果赋值给变量。SQL语句有类型: select statement| update statementvariable names。
- 将数据传递给http请求:结果的赋值规则-----变量名#,结果个数;变量名_N,第N个结果;可以通过debug sampler查看底层赋值规则。
5、具体实现
(1)搭建框架:(抽取http请求默认值、http信息头管理器、结果树),创建SetUp线程组和添加数据的HTTP请求,添加数据时可借助counter函数实现,如下图所示:
(2)添加请求右键----添加----断言----响应断言,添加断言的信息,并运行测试计划,如下图所示:
(3)添加请求右键----添加正则表达式提取器,并设置变量名、正则表达式、模板、匹配数字等信息,如下图所示:
(4)利用setProperty和property函数实现跨线程传值,创建TearDown线程组和删除的HTTP请求,并在请求中使用property函数调用输入的全局变量id,通过 id进行删除如下图所示:
(5)HTTP请求02右键----添加----断言----响应断言,添加响应断言,并运行测试计划,查看测试结果树,验证是否断言成功,如下图所示:
(6)新建普通线程组,添加修改请求,根据dep_id修改提交数据中的信息,并断言、运行测试进行验证,如下所示:
(6)添加普通线程组,添加查询请求,根据dep_id进行查询(查询请求要注意分页,否则找不到断言信息会断言失败),并断言、运行测试进行验证,如下所示:
(7)直连数据库:测试计划中添加数据库驱动路径,创建JDBC connection configuration,设置数据库连接信息,如下图所示:
(8)新建JDBC线程组,在线程组下创建JDBC Request,选择查询类型,输入查询语句和查询结果保存的变量,如下图所示:
(9)在JDBC请求下新建HTTP请求,根据JDBC获取的dep_id值进行查询,运行测试,查看结果是否符合预期,如下图所示:
(10)在测试计划中勾选“独立运行每个线程组”,运行测试计划,查看测试结果和数据库数据(自动化测试前后数据库数据不发生改变)。
三、JMeter接口性能测试
1、性能压力测试概述
性能测试主要是为了模拟多种场景测试程序的响应时间,出错率等性能指标,可以测试测试程序的执行效率,执行效率直接关系到用体验。
2、性能测试的原则
- 参数化:参数化尽量避免采用从外部读取参数,使用固定参数+函数形式(如: ${__counter(TRUE,)})---出于性能考虑;
- 察看结果树:必须清除单个接口内察看结果树(如不去掉,非常占用测试机自身性能)。只需在测试计划下添加一个察看结果树;
- 报告:性能报告可根据实际需求选择,建议保留添加聚合报告
- 线程组:增删改查每一个功能点,都需要建立单独线程组,而避免在同一个线程组内添加多个HTTP请求完成增删改查(---使参数化对单个请求做压测和并发)
- 分布式:如并发数量大,采用分布式测试
- 新增/删除:新增和删除接口建议不要采用时间模式来压侧,直接使用线程数和循环。
四、性能测试之需求一:区间测试
1、需求
模拟10秒内开启30个虚拟用户,每个用户循环访问服务器资源10次,要求平均响应时间在30ms内且错误率为0。
2、实现步骤
(1)搭建测试框架(线程组、请求默认值、信息头管理、HTTP请求),设置线程数为30,Pamp-Up为10,循环次数为10.如下图所示:
(2)运行测试计划,查看测试结果,如下图所示:
五、性能测试之需求二:高并发测试
1、需求与分析
需求:模拟100个用户同时访问服务器资源,要求平均响应时间在30ms内,且错误率为0。
分析:100用户:使用线程数指定;同时访问:使用集合点。
2、实现步骤
(1)搭建测试框架(线程组、请求默认值、信息头管理、HTTP请求),设置线程数为100,Pamp-Up为1,循环次数为1.如下图所示:
(2)线程组右键,添加同步定时器,设置模拟用户组的数量为100,超时时间为0,如下图所示:
(3)运行测试计划,查看测试结果,如下图所示:
六、性能测试之需求三:高频率测试
1、需求与分析
需求:模2个用户都以20QPS的频率访问服务器资源,持续10秒,要求平均响应时间在30ms内且错误率为0
分析:2个用户:线程数指定;循环次数:QPS*持续时间;
2、实现步骤
(1)搭建测试框架(线程组、请求默认值、信息头管理、HTTP请求),设置线程数为2,Pamp-Up为1,循环次数为200.如下图所示:
(2)线程组右键,添加常量吞吐量定时器,设置目标吞吐量为1200(20*60转换为分钟),如下图所示:
(3)运行测试计划,查看测试结果,如下图所示:
七、总结
1、功能测试
(1)概述:
用户操作具有多样性,主要是测试接口的基本功能实现(正向+逆向)
(2)步骤:
- 搭框架(CSV Data Set Config)
- 测试用例:URL提交方式+提交的数据(预设数据)+预期响应结果---》抽象、非具体数据
- 参数化覆盖测试用例----测试数据---》具体的数据
- 测试,将测试结果与测试用例的预期结果进行比对
2、自动化测试
(1)概述:
程序代替人工生成测试数据以及判断响应结果,高效安全
(2)实现原则:
- 只测试重要的以及被重复调用的功能
- 只测试正向数据
- 测试完毕数据恢复为测试之前的状态
- 不同线程组之间尽量不要产生关联
3、性能测试
(1)概述:性能测试是直接关联到用户体验的,主要用于测试程序的响应时间、错误率或服务器的运行状态
(2)测试分类
- 区间测试:时间区间内多用户访问
- 高并发测试:同一时间点多个用户访问
- 高频率测试:某个时间区间内用户以固定频率频繁访问服务器