测试场景用于将多个接口请求与实际可能发生的一些特殊情况(如条件判断、循环)有序的组合在一起,来模拟一个真实业务流程,组成自动化测试单元。
打开 Apifox 后点击左侧菜单栏中的“自动化测试”,点击搜索栏右侧的 +
号,选择所归属的目录与设置优先级后完成创建。
若希望调整测试场景的所在目录,可以在创建测试场景时点击“目录”中的“新建目录”按钮或选择已有目录并进行调整。
创建测试场景后可以在其中添加测试步骤。测试步骤中支持添加多条接口,并且还可以在步骤中设置测试条件等附加操作。
进入测试场景后,点击“添加步骤”并添加接口。
你可以选择「从接口导入」和「从接口用例导入」。
你可以从当前项目导入接口作为测试场景中的步骤。导入接口时存在两种模式:分别是”手动同步“和”自动同步“模式,详细说明请参考《从接口文档/用例同步数据》。
手动同步
在该模式下,当项目内的接口文档有数据变化时,并不会影响测试步骤内的接口。测试人员点击“手动同步”按钮后,测试步骤内的接口数据才会与接口文档数据同步。当测试步骤内的接口数据有变化时,即使点击了“手动同步”按钮,测试步骤内的数据也并不会同步至接口文档,反而会再次抓取接口文档内的数据并与之同步。
自动同步
在该模式下,当项目内的接口文档有数据变化时,测试步骤内的接口也会同步更新。
如果你需要在一个测试场景中测试其它项目的接口,可以参考《从其它项目导入接口/用例至测试步骤》。
你可以选择从当前项目或其它项目导入接口用例。导入接口用例时存在两种模式:分别是”复制“和”引用“模式。
复制
将接口用例以“复制”方式导入,接口用例里的参数也会一同复制至测试步骤中,并且和原项目内的接口用例数据相互独立,各自改动后互不影响,可选择手动同步。
引用
将接口用例以“引用”方式导入,那么会直接使用原项目内的接口用例进行请求。
在一个业务流程中,可能存在需要调项目之外的接口的情况,例如需要调用第三方的支付接口。你可以在测试步骤中添加自定义请求,自定义请求可以是任何 HTTP 请求,包括常见的 GET
、POST
、PUT
、DELETE
等请求。
你可以在测试场景中新增流程控制条件(循环、判断、等待、分组)等。进一步满足了更复杂的测试场景/流程配置的使用,最终借助自动化测试功能解决复杂场景的测试工作。详细说明请参考此文档。
你可以将当前项目内的其它测试场景中的测试步骤或流程控制条件复制导入到当前测试场景中。
你可以在测试场景中引用其它测试场景,将其作为一个测试步骤。以下是该功能的使用场景:
警告
为了防止无限循环和出现不能正常停止运行测试场景的情况,引用其它测试场景功能不可引用原测试场景本身。
现假设在一个自动化测试计划中,需提取 A 接口
返回数据中的 petid
值并作为 B 接口
的请求参数。下文将通过两个方法,分别演示如何完成接口间的参数传递和连接过程。
在 B 接口
中定义参数值时点击“魔法棒” icon,选择“读取前置步骤的运行结果”选项。
选择从 A 接口
的响应数据 Body
中提取信息,指定“提取部分”数据。可以在 A 接口的请求响应中看到目标 petid
参数值位于 data
列中。
在 B 接口
的 JSONPath
表达式中填写 data.petid
后点击“插入”。你可以查看 JSONPath 语法了解更多复杂的数据提取方法。
为了确保能够正确提取到对应的参数,你可以点击“跳转” icon 预览前置步骤中的预期返回以及是否提取到了正确的数据。
点击“运行”测试场景。
你可以在测试报告中查看参数的传递情况。可以看到 A 接口
输出的 petid
参数值为 24,而 B 接口
的实际请求值同样为 24,参数传递成功。
提示
实际运行测试场景后,A 接口才能生成数据,B 接口才能真正地得到返回后的数据。在单独调试测试步骤的过程中后置步骤中的接口无法取得前置步骤所生成的返回值。
你也可以在遵循语法规则的前提下,直接填写指令来引用前置步骤的返回数据。
例如现在需要提取 A 接口
返回数据中的 petid
值:
那么可以在 B 接口
中的参数值中填写 {{$.10.response.body.data.petid}}
指令。关于该指令的对照可参考下图:
信息
数字 10
指的是测试步骤 ID。
response.body
指的是从响应 Body 中获取数据。
data.petid
指的是从返回 JSON 文件中提取 data 列中的 petid。
如果指令无误,填写后将会出现“前置步骤”的预览情况。
分类 | 功能点 | 语法示例 |
---|---|---|
请求 |
URL |
{{$.<步骤 id>.request.url}} |
path 参数 |
{{$.<步骤 id>.request.pathParam.<字段名>}} |
|
query |
{{$.<步骤 id>.request.query.<字段名>}} |
|
header |
{{$.<步骤 id>.request.header.<字段名>}} |
|
body(form) |
{{$.<步骤 id>.request.body.<字段名>}} |
|
body(json) |
{{$.<步骤 id>.request.body.<字段路径>}} |
|
响应 |
body |
{{$.<步骤 id>.response.body.<字段路径>}} |
header |
{{$.<步骤 id>.response.header.< 字段名>}} |
|
cookie |
{{$.<步骤 id>.response.cookie.< 字段名>}} |
|
循环 |
element(ForEach 循环中的数组内元素) |
{{$.<循环步骤 id>.element.<字段路径>}} |
index |
{{$.<循环步骤 id>.index}} |