自动化测试

指引

进入 DevOps 平台 > 我的项目 > 项目详情 > 测试管理 > 测试用例 > 自动化测试,创建一个或选择一个已有的测试空间,进入空间
自动化测试 - 图1

功能指引:
自动化测试 - 图2

Erda 提供了【测试空间】>【场景集合】>【场景】三级管理能力。
自动化测试 - 图3

自动化测试使用流程图
自动化测试 - 图4

测试空间

一个项目下可以创建多个测试空间,测试空间之间无任何关联,不互相影响,是完全隔离的空间。 很多项目只需要一个默认测试空间即可,使用多个测试空间有以下几种情况:

  1. 一个项目下有多个子项目,子项目间没有产品上的联动,它们的自动化用例可以完全独立在自己空间
  2. 一个项目要同时支持多个版本,那可以一个版本一个空间,当进入新版本迭代时,可以通过复制老版本的空间以创建新版本的空间,并在新版本空间上进行功能变动后的调整

注意:

  1. 只有项目所有者和项目经理才有权限创建测试空间
  2. 空间复制需要较长时间,复制过程中时,原空间无法操作

场景集合

场景集合 是一个完整闭环的自动化测试流程,这个完整的流程由多个场景组成,场景之间有简单的依赖(包括执行依赖和数据依赖) 场景集合或者说自动化测试流程有以下几个例子:

  1. 登录流程
  2. 购物流程
  3. 退货流程

而一般来说流程中可能有正向的场景(比如登录成功、下单成功等)也有逆向或者预期失败的场景(比如密码错误次数过多登录失败、退货成功后不能退货),这些场景可以自由的在流程中添加和编排,你可以详细阅读 场景 以了解。

场景集导入导出

场景集导出

除了在界面上查看场景集合以及场景集包含的内容,平台还支持完整场景集合的导出,当前支持导出的文件种类包含:

  • Excel 文件

导出场景集合的地方位于 组织 > DevOps 平台 > 项目 > 自动化测试 > 场景集,点击扩展按钮里的 导出场景集 即可。 自动化测试 - 图5 导出是异步进行的,因为有时会有较大的文件,在这里可以打开导入导出记录列表, 可以下载导出文件,查看 7 天内的记录结果。导出详情查看导入导出记录表。 文件里的内容包含以下:

  • 场景集
  • 场景用例
  • 场景入参
  • 场景出参
  • 场景步骤

场景集导入

有时可能会做项目的迁移或者测试空间的迁移,希望以前写的场景集合能够自动导入不用再写一遍,这时可以用上面场景集的导出,然后再将场景集文件导入到新建的空间下。 当前支持导出的文件种类包含:

  • Excel 文件

导入场景集合的地方位于 组织 > DevOps 平台 > 项目 > 自动化测试 > 场景集 > 更多操作,点击扩展按钮里的 导出,再从文件夹里选择相应的 Excel 文件,最后再点击确定。 自动化测试 - 图6 导入同样是异步进行的,在导入导出记录表里可以看到当前的导入进度如何,不出意外的话,导入完成后即可在该空间下看到相应的场景集,如果在空间下已经存在同名的场景集,将自动为将场景集的名称后面加上(序号)。导入详情查看导入导出记录表

场景集导入导出记录表

由于场景集的导入导出是异步进行的,所以需要一张记录表显示当前的进度。 导入导出表位于 组织 > DevOps 平台 > 项目 > 自动化测试 > 场景集 > 更多操作,点击导入导出记录可查看。 自动化测试 - 图7 通过状态可查看当前的进度,点击结果的操作按钮可以下载导入或导出的文件,左上角的类型可以来区分是导入还是导出。

场景

场景 是自动化测试管理的最小单元,可以对应到功能测试的一条用例。如字面意思,是自动化测试的一个场景,以下将按几种场景集合分别举例:

  1. 登录流程:
    • 正常登录场景
    • 异常登录场景
    • 密码错误次数过多场景
    • 登录成功后校验登录态场景
  2. 购物流程:
    • 商品查看场景(能够正确查询/或者下架商品无法查询)
    • 下单场景(无货时购买失败、优惠计算正确、库存扣减成功等逻辑)
  3. 退货流程:
    • 订单关闭退货失败的场景
    • 退货成功场景(成功后,后续状态流转正确、通知正确等逻辑)

场景的设计理念是短小、尽量内聚,在同一个场景集合下场景们有一定的关联,一定的执行依赖,一定的数据依赖。

创建场景

进入测试管理-测试用例目录,选择自动化测试,进入对应的测试空间,选择一个场景集,选择”添加场景”
自动化测试 - 图8

添加场景入参

添加场景完成后,在场景集中选中添加的场景,点击右侧场景入参区域的“添加“按钮即可完成场景入参添加
自动化测试 - 图9

添加场景步骤

添加场景完成后,在场景集中选中添加的场景,点击右侧场景步骤区域的“接口“、”配置单“、等待其中任一按钮即可完成场景步骤添加
自动化测试 - 图10

步骤类型

场景步骤类型分为:接口、配置单、等待

1、接口 点击”接口“按钮后,即可填写接口步骤信息。其中市场原型可以选择API管理中定义的接口,也可以不选择市场原型,直接输入URL
自动化测试 - 图11

2、配置单 点击”配置单“按钮后,即可选择对应的配置单,具体的配置单配置详见配置单
自动化测试 - 图12

3、等待 点击”等待“按钮后,即可添加等待的步骤,时间可输入

步骤编排

场景步骤的执行顺序支持编排,执行方式支持串行执行以及并行执行。执行顺序的编排可以通过步骤前面的拖拽按钮进行拖拽操作,执行方式可以通过点击”添加并行接口“按钮进行编辑,支持重新修改为串行执行,详见下图:
自动化测试 - 图13

请求参数

接口步骤的请求参数主要包含:Params、Headers以及Body。其中参数的值可选:固定值、本场景入参、 前置接口入参、全局变量入参以及mock参数。参数的值支持选择和过滤,选择后自动生成参数表达式 本场景入参表达式:

  1. ${{ params.xxxx }}

前置接口入参表达式:

  1. ${{ outputs.12345.xxxx }}

全局变量入参表达式:

  1. ${{ configs.autotest.xxxx }}

mock参数表达式:

  1. ${{ random.integer }}

其他类型的mock参数写法参考:mock参数
自动化测试 - 图14

循环策略

自动化测试 - 图15

循环策略的配置意思是当条件没成立就会一直循环执行,当循环次数达到了最大循环次数就会退出

  • 循环结束条件,可以配置例如 task_status == 'Success' 当前步骤执行状态为失败(断言失败), 步骤 40025 的出参 code 是否等于 401
  • 最大循环次数(N),代表循环条件没有成立的时候最大的循环次数
  • 衰退比例(decline_ratio),衰退最大值(decline_limit_sec),起始间隔(interval_sec) 3 个参数遵循一个计算公式 下次执行前等待时间 = min(起始间隔 * (衰退比例)的(最大循环次数)的次方, 衰退最大值), 通过公式计算得到的就是每次循环的间隔时间

例子

不配置结束条件,循环 100 次,每次间隔 10 秒

  1. 最大循环次数: 100
  2. 起始间隔: 10

如果没有配置结束条件的时候,默认结束条件使用的是 task_status == 'Success',由于 task_status 是当前接口的断言的结果,所以可以理解为把所有断言都为 true 作为结束条件

循环 10000 次,每次循环间隔 10 秒

  1. 结束条件: 'false' == 'true'
  2. 最大循环次数: 10000
  3. 起始间隔: 10

当前步骤执行状态为失败(断言失败)时重试

  1. 结束条件: task_status == 'Success'
  2. 最大循环次数: 10000

某个步骤或当前步骤的出参 xxx 不为 401 时候重试

  1. 结束条件: '${{ outputs.步骤的id.xxx }}' == '401'
  2. 最大循环次数: 10000

多条件组合判断

  1. 结束条件: '1' == '2' && '1' == '3' || '1' == '3' || '${{ outputs.步骤的id.xxx }}' == '401'
  2. 最大循环次数: 10000
出参

步骤支持添加出参。出参的作用:作为断言参数、添加到场景出参、传递给下一个步骤。出参的表达式写法请参考:出参表达式
自动化测试 - 图16

断言

步骤支持添加断言,可以通过选择对应的接口步骤、选中”Tests“TAB页后添加出参以及断言来完成断言的添加,具体断言的添加方式见断言说明
自动化测试 - 图17

添加场景出参

场景支持将步骤的出参添加到场景的出参中传递出去,供后面的场景作为入参使用,添加步骤如下图
自动化测试 - 图18

执行明细

自动化测试支持查看单个场景的执行明细, 包含:执行详情、执行历史、步骤接口以及步骤日志
自动化测试 - 图19

引用场景

场景集支持引用其他场景集,可以实现跨场景集的参数续传。执行该场景集时,被引用的场景集也会被全部执行。可以进入测试管理-测试用例目录,选择一个场景集后,点击”引用场景集“按钮完成操作
自动化测试 - 图20

数据银行

进入 DevOps 平台 > 我的项目 > 项目详情 > 测试管理 > 数据银行

数据源

目前平台支持添加 MySQL、Redis 以及 Custom 服务三种数据源。
自动化测试 - 图21

配置单

配置单配置的是执行脚本,例如MySQL脚本、Redis脚本、shell脚本
配置单支持配置入参

配置单管理

进入数据银行页面后,选择”配置单“TAB页,该页面可以进行配置单目录的增删改查、配置单的增删改查操作
自动化测试 - 图22

配置信息

选择具体的配置单后,可以对配置单的流水线进行修改,可以修改的信息包含:入参配置、节点信息
自动化测试 - 图23
示例MYSQL配置单:
点击配置信息-流水线的”编辑“按钮后,选中MYSQL配置单节点,可以对该配置单的任务名称、版本、执行条件、任务参数(datasource/database/sql)、运行资源(cpu/mem)以及循环策略进行配置
自动化测试 - 图24

执行明细

配置单支持查看每个配置单的执行明细,明细包含:构建详情、执行记录。点击配置单节点右上方的”…“按钮可以查看配置单的执行日志
自动化测试 - 图25

执行计划

进入 DevOps 平台 > 我的项目 > 项目详情 > 测试管理 > 执行计划

新建执行计划

进入执行计划目录后,选择”自动化测试“TAB页,点击右上方的”新建计划“按钮即可完成执行计划的新建
自动化测试 - 图26

进入执行计划详情页,执行计划支持场景级的添加、删除以及执行集顺序的编排
自动化测试 - 图27

执行

执行计划支持手动触发执行,执行时支持选择不同的环境,具体的环境配置参考参数配置

执行明细

执行完成后,平台支持执行明细的查看,主要包含:执行详情、执行步骤以及执行历史,其中执行步骤支持点击查看具体的执行结果和日志
自动化测试 - 图28

参数配置

进入 DevOps 平台 > 我的项目 > 项目详情 > 测试管理 > 参数配置

添加配置

进入参数配置页面后,选择”自动化测试“TAB页,点击右上角的”添加配置“按钮,即可进入参数配置的页面
自动化测试 - 图29

配置主要分为三类:环境域名、header以及global

环境域名
  1. 当接口步骤中定义了域名,则选择该环境执行时,仍使用接口步骤中定义的域名
  2. 当接口步骤中未定义域名,则选择该环境执行时,默认使用当前配置的环境域名执行
Header
  1. 用户后续选择该执行环境时,若接口中没有同名的header信息,会自动传该环境配置中的header信息到请求接口中
  2. 用户后续选择该执行环境时,若接口中有同名的header信息,会优先用接口中已定义的header信息传到请求接口中
Global

全局参数配置,引用表达式:

  1. ${{ configs.autotest.xxxx }}

可以在场景入参、接口入参以及配置单配置中使用

断言说明

添加断言的前置条件:设置出参以及出参表达式,用例必须设置断言以进行有效测试,用例如果没有断言,任何情况下该用例都将通过。

出参表达式

场景步骤的出参支持三种类型的参数解析,分为:Status,Header:K/V,Body:JSON(body) ,解析的表达式遵循Linux jq表达式规范,具体参考:https://stedolan.github.io/jq/manual/
举例如下:
假设response结果如下: { “data”:[ { “id”:185, “ss”:”aa1” }, { “id”:186, “ss”:”aa2” }, { “id”:187, “ss”:”aa3” } ] }

  1. 获取data下list中所有ID
    表达式:[.data[] | try .id]
    结果为:[185,186,187]
  2. 获取data下ss=”aa2”的ID
    表达式:.data[] | select(.ss==”aa2”).id
    结果为:186
  3. 获取data下ss=”aa1”的ID,和data下ss=”aa2”的ID,拼接成list[]
    表达式:[(.data[] | select(.ss==”aa1”).id),(.data[] | select(.ss==”aa2”).id)]
    结果为:[185,186]

断言类型

断言支持形式如下:

  • 大于、大于等于、小于、小于等于: 支持整数,小数。
  • 等于、不等于: 支持整数,小数,字符串,对象(数组,Map)。
  • 包含、不包含: 支持字符串和正则匹配。
  • 为空、不为空: 支持判断数组,Map,字符串是否为空。
  • 存在、不存在: 判断出参是否存在。出参为 Response 的 Key。
  • 属于、不属于: 支持正负整数、0、字符串。
    • 数值:请按照标准的数学表达式规范填写。示例如下: 区间支持开区间和闭区间、示例闭区间:[-20,20] 表示集合:{[-200,200],-1,2}
    • 字符串仅支持集合、示例:{“abc”,”bcd”,”200”,”-200”,”已报名”,”报名成功”}

mock参数

mock参数支持的类型如下:

  • string: 所有字符串,如: Abc,
  • integer: 整型,如: 100
  • float: 浮点型,如: 13.14
  • boolean: 布尔型,如: true/false
  • upper: 大写字母,如: ABC
  • lower: 小写字母,如: abc
  • mobile: 11位手机号,如: 18888888888
  • digital_letters: 数字和大小写字母,如: Abc123
  • letters: 大小写字母,如: Abc
  • character: 单个字符,如: a
  • timestamp: 当前时间戳格式:1586917254,单位是s
  • timestamp_hour: 1小时前时间戳格式:1583317290,单位是s
  • timestamp_ns: 当前时间戳ns格式:1586917325230422166,单位是ns
  • timestamp_ns_hour: 1小时前时间戳格式:1586913750801408626,单位是ns
  • date:当前日期、格式:2020-01-01
  • date_day:1天前日期、格式:2020-01-01
  • datetime:当前时间、格式:2020-01-01 15:04:05
  • datetime_hour:1小时前时间、格式:2020-01-01 14:04:05

当前场景下,若有登录接口,登录接口访问成功后,接口返回的Header中如果有Set-Cookie参数,平台会将该参数值自动传到当前场景之后的接口的请求Header-Cookie中
注意:

  1. 仅限同一场景中Cookie续传,不支持跨场景的Cookie续传
  2. 登录接口返回的Header中要有Set-Cookie参数才会续传
  3. 如果同一场景有2个登录接口,向上取最近的登录接口返回的Set-Cookie参数为准