一、工具介绍

本工具是基于JMETER组件对常见的一些测试场景进行一些简单的封装,并以脚本与数据分离的形式进行编写,目的在于低耦合、高效率、低维护、高可用等;工具能对入参进行参数化设置,以Excel行作为测试用例单位,在编写第一个用例时入参用需要参数化的字段改用@+字段名的形式,后面的用例直接copy该用例,后面行仅需要修改对应入参的值即可(例子:具体操作看下文);工具具备上下游接口报文内容引用的能力;脚本运行完毕后自动生产测试报告,根据测试报告的结果判断当前测试是否发现缺陷;本工具具有一定的扩展性,但是扩展的前提是基于对Jmeter和Java的理解进行实施。

二、项目初始化

1、创建项目文件夹

在项目/迭代开始初期,我们需求对当前项目/迭代下接口测试需求进行规划,以合理的设计方式对文件进行归类管理,到有需求时才能快速找到,具体初始化操作步骤如下:
1)进入工具apache-jmeter-encapsulation-5.1.1的TestCase目录下创建项目文件夹,该项目下的脚本在测试计划的变量中需要修改PROJECT_NAME的值,如下图
image.png
image.png

2)项目目录下必须包含如下文件夹

接口测试笔记(三)-- 封装工具使用基础篇 - 图3ExcelCase:存放测试用例的CSV文件,Jmeter的控件:CSV数据文件设置会根据相对路径找到脚本所依赖的测试用例逐行运行
Script:存放测试脚本的目录
TestReport:脚本运行完以后生成测试报告的目录
ReportData:TestReport的下级目录,存放脚本运行时的关键结果数据,用于生产HTML报告使用
ReportHTML:TestReport的下级目录,脚本跑完以后根据关键结果数据生成HTML报告直观了解测试结果

3)脚本重命名
Script目录里面的jmx脚本并非固定的,我们可以通过Jmeter的另存为功能或者直接对文件进行重命名
image.png
4)重名名用例文件
ExcelCase目录里面的CSV文件可以视为测试用例的集合,一个项目/迭代完整的接口测试会由多个集合来完成,每个用例集合对应一个jmx脚本来执行,当我们修改了CSV名称的时候,对应的jmx脚本需要在测试计划—用户定义的变量-TEST_PLAN中修改成CSV重命名的值(注:CSV文件的名称要与jmx文件名称一致),如图示
image.png
image.png

2、工具的使用

完成项目初始化以后就开始进入接口脚本实现,我们先打开测试脚本,根据需求对脚本相应参数进行修改,具体如下步骤
1)打开脚本,文件—>打开—>(或者直接点击打开文件夹图标)选择脚本目录(./TestCase/(project name)/Script/xxx.jmx)如图:
image.png
2)修改系统默认变量

  • 测试计划中的用户定义的变量,TEST_PLAN维护与jmx脚本一致的名称,如脚本名称为【商城接口测试编写模板.jmx】则值维护为【商城接口测试编写模板】
  • 测试计划中的用户定义的变量,PROJECT_NAME维护与项目文件夹一致的名称
  • 在第二个线程组(主功能线程)中,组件名称[全局变量]有两个变量分别控制当前测试脚本的测试环境和运行测率,如图

image.png

三、接口用例编写

1、CSV表格列名解析

系统自带的基础列名如下:

  • 运行模式:根据全局变量所定义的运行策略进行分组或单用例运行,如[level:${RunModel}>0&&${RunModel}<3]表示只运行该列值下为1、2的用例行
  • 用例名称:用于识别当前行所测试的点,方便在测试报告中找出失败用例所对应的值
  • 请求方式:暂时只支持post和get两种方式注意只识别小写
  • content-type:接口请求头所需要带入的入参,如果不填则给默认值application/json
  • 接口名称:与RAP2/Sawgger同步方便在测试报告中快速知道那个接口/那个模块有问题
  • 测试路径:根据RAP2/Sawgger给出的接口路径填入
  • 入参:即调用接口输入的参数,如果是From Data格式或者Params列的用&将多个参数串联写入,如果是Json格式则直接填入json(注:由于Jmeter机制问题,如果是JSON格式数据在运行脚本前需要对JSON格式的逗号“,”替换为“#”,当运行脚本时脚本会自动将#号转换)
  • 手机号码:根据该手机号码做权限控制,如果当前测试场景需要进行权限受控则在对应用例行的该列输入受控权限的登录账号
  • HTTP响应码:验证报文的响应码,默认情况下响应码为200时通过验证
  • 预期结果:根据用例特性进行报文断言,如果带有”[包含]”字样则验证报文中是否包含填写的预期结果,否则校验报文内容是否全等于预期结果
  • 提取响应数据的值:表示在当前用例运行完以后根据所填写的内容对报文进行匹配并提取,同下个用例使用(详细操作见下文)
  • 引用前置条件提取到的值:表示引用上个用例所提取出来的值,并作为变量给当前的用例入参进行赋值操作

    2、参数化应用

    通常我们对单个接口的测试都需要进行不同的入参输入,校验不同的出参结果,基于脚本与数据分离的思路,那么我们可以直接复用第一个接口用例,并对该用例的入参进行参数化,不同入参的用例行在对应的字段列中填写不同入参,实践如下:
    1)对CSV用例文档中的入参列字段productId进行参数化,如图:参数化前2-1
    image.png
    图:参数化前2-1
    2)利用占位符思路先对文本对象productId的值进行展位处理productId=@productId,建议使用符号@+字段名,如图:参数化后2-2
    image.png

图:参数化后2-2
3)在脚本中我们需要对该入参进行赋值,所以在最后一列填写需要参数化的值,如图:添加变量入参2-3
image.png

图:添加变量入参2-3
4)对脚本中的CSV数据文件设置(参数化文件)添加变量名称,前面用英文逗号分隔,如图:添加变量名2-4
image.png图:添加变量名2-4
5)启用组件并,根据注释说明往脚本中加入替换内容,如图:添加替换操作2-5
image.png
图:添加替换操作2-5
6)调试通过后后面就复制第一个接口用例,后面只需要改用例名称、入参和预期结果即可,不管添加多少个入参最终结果都可以按照这种方式进行,如图:多入参测试2-6
image.png图:多入参测试2-6

3、测试接口存在依赖关系的实践

在接口测试中往往我们需要依赖上一个接口报文中的某一个值或多个值作为下个接口中某个入参的绑定值,那么可以在CSV文档的”提取响应数据的值”和”引用前置条件提取到的值”中实现,我们直接通过例子来了解

1)提取响应数据的值

下面的JSON串就是当前报文的响应结果,我们需要根据场景用表达式对这个报文提取值,这个表达式写到需要提取用例中的”提取响应数据的值”列中

  1. {
  2. "code":0,
  3. "msg":"",
  4. result:[
  5. {"productId":1,"title":"商品1"},
  6. {"productId":2,"title":"商品2"},
  7. {"productId":3,"title":"商品3"}
  8. ]
  9. }

场景1:提取productId中的第1个值
表达式:productId,其取值结果为:1
场景2:提取productId中的第2个值
表达式:productId_2,其取值结果为:2
场景3:提取result中的第2个值和第3个productId的值
表达式:productId_2_2,其取值结果为:2,3
场景4:提取result中的第1个值到第3个title的值,并重名名title为name和productId的第1个值
表达式:title(name)_1_3&productId,其取值结果为:商品1,商品2,商品3

根据上去例子我们可以知道表达式的公式为:

  1. 提取json格式:字段名(重命名)_数组下标_数组长度
  2. 当有多个取值时用&连接

注意:如果不做重名名那么就会默认当前获取的字段为全局变量的字段,如果该变量被用例中的某个地方引用过,那么在跑用例的时候数据会被覆盖或者脚本报错,重名名就是为了解决字段名称冲突使用,重名后的名字也必须是唯一的

2)引用前置条件提取到的值

引用的公式变量的公式与提取一样,在CSV需要引用的用例中的”引用前置条件提取到的值”列填写,我们还是通过例子来学习

上游接口的表达式:title(name)_1_3&productId
对应存放的值:商品1,商品2,商品3 & 1

场景1:入参的变量取productId和title的第一个值
入参:{“productId”:@productId,”title”:”@name”}
引用前置条件提取到的值:productId&name
编译结果:{“productId”:1,”title”:”商品1”}
场景2:入参的变量取title的第二个值
入参:{“productId”:123”title”:”@name”}
引用前置条件提取到的值:name_2
编译结果:{“productId”:123,”title”:”商品2”}
场景3:入参的变量取title的第二个值和第三个值(注:该场景仅适用用数组型变量)
入参:{“productId”:43”title”:[@name]}
引用前置条件提取到的值:name_2_2
编译结果:{“productId”:43,”title”:[“商品2”,”商品3”]}

本文介绍得是工具的基础使用,其实工具还具有很大的扩展性,根据不同的验证场景在这个基础上做扩展,一切都围绕低耦合、高效率、低维护、高可用等特点进行

4、附件

apache-jmeter-encapsulation-5.1.1.rar