需求背景

对于全量自动化测试而言,目前采用的是 JMeter 进行测试脚本的编写,禅道系统来管理测试用例及 bug 修复等工作流程。对于每次新功能上线,都要将老的功能进行自动化测试,以验证这些功能的稳定性,重要程度也是很突出的。然而大量运行测试用例,手工去禅道系统登记运行结果的方式,则明显的降低了执行效率。因此,制定一些规范和规则,利用 jmeter 本身的扩展性,可以实现自动将 jmeter 的执行结果同步更新到禅道系统内。

运行环境约定

  1. 采用 jmeter 5.4.3 及以上版本运行本文所述测试用例脚本
  2. java 采用 1.8 及以上版本
  3. maven 采用 3.6.3 版本(注意:更高的版本可能导致带有 http 协议的私有仓库中的类库无法被下载)
  4. 运行 jmeter 采用 maven 插件的方式,插件jmeter 的 maven 插件
  5. 所有 jmeter 脚本的名称均用英文字母(单词)或汉语拼音的方式命名,不允许使用中文及其他语言和特殊字符等。

jmeter 代码约定

  1. 所有的 jmeter 脚本都有预配置的用户自定义变量,并且设有默认值,通过配置文件覆盖的方式,以使得 jmeter 脚本能够在开发环境、测试环境、预发环境能够进行测试,而无需改变脚本本身。

  2. 所有的 jmeter 脚本都有一个 CSV 数据文件,该文件与 jmeter 脚本文件名相同,文件类型后缀为 .csv 。

  3. 对于能够使用项目内接口可以实现数据的 CRUD 操作的,不使用数据库直连的方式处理业务预备数据,此种方式为推荐优先使用的方式;而项目无 CRUD 接口的,则通过与研发人员确定 SQL 的方式,使用直连数据库进行处理,此方式不推荐使用,但作为特别的备用解决问题手段。

  4. 所有的 jmeter 脚本至少包含 2 个线程组,其中一个是 setup 线程组,另外一个是业务接口测试线程组。

  5. setup 线程组的功能主要是进行测试数据的准备工作,针对脚本内的测试用例,初始化各种数据。初始化方式,优先采用接口调用的方式进行,次之选用数据库直连的方式。

  6. 业务接口测试线程组,采用 CSV 作为测试用例的输入、输出、预期的管理。增加新的测试用,理论上只增加 CSV 的用例数据即可,可能会对 jmeter 脚本进行微调。业务接口测试线程组,使用 for 循环的方式自动循环 CSV 数据进行各个用例的测试。

  7. 业务接口测试线程组的结构: jmeter线程组结构图 上图解析如下:

    1. 业务接口测试线程组的名称(jmeter 节点类型: 线程组):砍一刀活动

    2. 业务功能点的名称(jmeter 节点类型: IF 控制器,格式: “功能点:"+实际业务功能点的名称): 功能点:砍一刀活动

    3. 接口测试用例的名称(jmeter 节点类型: IF 控制器,格式: “测试用例:"+实际测试用例的名称):用例标题:活动未开始

    4. 测试步骤请求名称(jmeter 节点类型: HTTP 请求,格式: “测试步骤的名称”+"[禅道测试用例的配置信息]”): 领取活动[step:1,case:\${case_id},task:\${task_id}]–\${xh}

      上述测试步骤的格式中 “领取活动”是该测试用例中在禅道系统中测试步骤的名称,[]中的信息为禅道测试用例的配置信息。step:1 表明该测试用例的第 1 个步骤;case:\${case_id} 表明该测试用例在禅道系统中的id;task:\${task_id} 表明该测试用例本次测试所使用的测试单 id。本例中 case_id 和 task_id 这两个变量的数据配置在 CSV 数据文件中。

      对于不属于禅道测试步骤的请求,则步骤名称中没有[]及其内配置信息,此时用例状态同步工具将忽略该步骤的执行结果,不会同步到禅道系统。

  8. 所有 jmeter 脚本都包含一个 查看结果树 节点。用于手工运行某个脚本或调试脚本时肉眼观察。

  9. 所有 jmeter 脚本都包含一个 “禅道后端监听器”,用于自动同步该脚本中运行测试用例的结果。对于在 jmeter 脚本调试期间,可以禁用该监听器。调试完毕后,必须打开。

CSV 数据文件的约定

  1. 每一个 jmeter 脚本必须配置一个同名的 csv 文件,且与 jmeter 脚本文件在同级文件夹。

  2. 每个 csv 文件的首行是字段名称定义行。字段名允许使用中文及英文,不得使用特殊字符。

  3. csv 文件中的每一行数据,都是一个测试用例的某个步骤或该行数据即一个完整的测试用例。

  4. 最小的通用 csv 文件需要,至少定义如下字段:

    xh(序号),case_id(禅道用例id),task_id(测试单id),case_intention(用例意图),case_title(用例标题)

    并根据该脚本要实现的业务测试增加其他需要的字段。

    xh(序号):通常用于观察结果树中运行的结果时,确定当时脚本运行的时候使用的 csv 中的哪一条数据,目的主要是用于脚本的调试。

    case_id(禅道用例 id),task_id(测试单 id):用于定义禅道测试用例 id 及禅道测试单 id,用于“禅道后端监听器”使用该信息自动根据执行结果去更新禅道系统内该测试单下的测试用例的运行信息。