理解和掌握 Apifox 前后置操作——“断言”篇

理解和掌握 Apifox 前后置操作——“断言”篇

接口调用成功了,返回了数据,但怎么知道这个数据是对的呢?比如说,你调用了一个获取用户信息的接口,返回状态码是 200,看起来一切正常,但返回的用户名是空的,或者年龄是负数,这显然是有问题的。


这时候你就需要用到断言了。断言就是在接口调用完成后,自动检查返回结果是否符合你的预期。如果符合,测试通过;如果不符合,测试失败,并告诉你哪里出了问题。

理解和掌握 Apifox 前后置操作——“断言”篇

什么是断言


断言本质上是一个判断语句,它会检查接口返回的数据是否满足某个条件。你可以把它理解为一个自动化的检查员,专门负责验证接口返回的内容。


在 Apifox 中,断言属于后置操作的一部分。所谓后置操作,就是在接口请求发送并收到响应之后才执行的操作。这个时机很关键,因为只有拿到了服务器的响应数据,我们才能对这些数据进行验证。


当你打开 Apifox 的接口详情页面,可以看到"后置操作"这个标签页,点击进去就能看到断言的配置界面。界面上会显示当前已经配置的断言规则,每个规则都有一个开关,你可以随时启用或禁用它们。

理解和掌握 Apifox 前后置操作——“断言”篇

断言的基本组成


每个断言都由三个部分组成:断言对象、比较方式预期值

断言的基本组成

断言对象指的是你要检查的内容,可能是响应状态码、响应体中的某个字段、响应头信息等等。Apifox 提供了多种断言对象供你选择,最常用的是 Response JSON,也就是检查返回的 JSON 数据。


比较方式决定了如何进行比较,比如"等于"、"不等于"、"包含"、"大于"等等。不同的断言对象支持的比较方式也不同,比如数字可以比较大小,字符串可以检查是否包含某些内容。


预期值就是你期望得到的结果。当接口返回的实际值与预期值按照指定的比较方式进行比较时,如果结果为真,断言就通过了;如果为假,断言就失败了。

配置第一个断言


让我们从最简单的例子开始。假设你有一个获取用户信息的接口,返回的 JSON 结构大概是这样:

{
  "code": 200,
  "message": "success",
  "data": {
    "id": 1,
    "name": "张三",
    "age": 25
  }
}


首先,你要检查接口是否调用成功。在断言配置界面,选择"Response JSON"作为断言对象,然后在 JSONPath 表达式框中输入 $.code。这个表达式的意思是从响应的 JSON 数据中提取 code 字段的值。


接下来选择比较方式为"等于",然后在预期值中填入 200。这样就配置了一个断言:检查返回的 code 字段是否等于 200。


保存这个断言后,每次调用这个接口时,Apifox 都会自动检查返回的 code 值。如果是 200,断言通过;如果不是,断言失败,你会看到相应的错误提示。

apifox配置第一个断言


JSONPath 表达式的使用


既然断言经常需要从 JSON 数据中提取特定的值,那么掌握 JSONPath 表达式就很重要了。JSONPath 是一种用来查询 JSON 数据的语法,类似于 XPath 用来查询 XML。


最基本的用法是用 $. 开头,然后跟上字段名。比如 $.code 表示根节点下的 code 字段,$.data.name 表示 data 对象下的 name 字段。


如果你要访问数组中的元素,可以使用索引,比如 $.data.items[0].title 表示 data 对象下 items 数组的第一个元素的 title 字段。索引从 0 开始计数,这是编程中的通用规则。


有时候你需要检查数组的长度,可以使用 $.data.items.length 这样的表达式。或者你想检查某个字段是否存在,也可以通过 JSONPath 来实现。


当然不会 JSONPath 也没关系,需要用到的时候问一下 AI 就行了,把 JSON 丢给 AI 然后让 AI 帮你写,也可以通过 Apfiox 提供的 JSONPath 提取工具快速提取。

apifox断言


除了在后置操作中设置断言,也可以在接口的返回响应中直接设置。

apifox JSONPath 表达式的使用

灵活运用比较方式


不同的比较方式适用于不同的验证场景,掌握它们的用法能让你的断言更加精确和灵活。


"等于"是最常用的比较方式,适合验证确定的值。比如检查状态码是否为 200,或者用户 ID 是否为指定值。但有时候你并不关心具体的值,只关心值的类型或范围。


"不等于"用来排除某些不应该出现的值。比如用户年龄不应该为负数,错误信息不应该为空等。这种反向验证有时候比正向验证更实用。


"包含"和"不包含"主要用于字符串检查。比如验证返回的错误信息是否包含关键词,或者检查用户名是否包含非法字符。这类断言在验证搜索结果、错误信息等场景中很有用。


"大于"、"小于"、"大于等于"、"小于等于"主要用于数值比较。比如检查分页接口返回的总数是否大于 0,或者验证商品价格是否在合理范围内。


"正则匹配"是最强大的比较方式,可以用来验证复杂的格式要求。比如检查邮箱格式、手机号格式、日期格式等。不过正则表达式的学习成本相对较高,建议在简单比较方式无法满足需求时再使用。

多个断言的协作


实际项目中,单个断言往往不够用,你需要配置多个断言来全面验证接口的返回结果。Apifox 支持为同一个接口配置多个断言,它们会按顺序执行。


继续用前面获取用户信息的例子。除了检查 code 字段,你还需要验证用户数据的完整性。可以添加一个断言检查 $.data.name 不为空,再添加一个断言检查 $.data.age 大于 0。


这样,一次接口调用就会执行三个断言:状态码检查、用户名检查和年龄检查。如果任何一个断言失败,你都能看到具体是哪个断言出了问题,这样就能快速定位问题所在。


有时候你可能需要临时禁用某个断言,比如在调试阶段或者某个验证条件暂时无法满足时。每个断言旁边都有一个开关,你可以单独控制每个断言的启用状态,这样就不需要删除整个断言配置。

断言失败时的处理


当断言失败时,Apifox 会在测试结果中明确显示哪个断言失败了,实际值是什么,预期值是什么。这些信息对于问题排查非常重要。


比如你设置了一个断言检查 $.data.age 等于 25,但接口实际返回的是 72,那么测试结果会显示:.$.data.age 等于 25 | AssertionError: expected '72' to deeply equal '25'。这样你就能立即知道是数据问题还是断言配置问题。

apifox断言失败时的处理


有些情况下,断言失败可能是因为 JSONPath 表达式无法找到指定的字段。比如你用 $.data.name 去取值,但返回的 JSON 中 data 对象里没有 name 字段,这时候断言也会失败。这种情况下,你需要检查接口文档和实际返回数据是否一致。


当你在开发阶段发现断言失败时,不要急着修改断言,而应该先确认失败的原因。是接口实现有问题,还是测试数据不对,还是断言配置不当?只有找到根本原因,才能有针对性地解决问题。

断言在不同场景中的应用


不同类型的接口需要不同的断言策略。对于查询类接口,主要关注返回数据的正确性和完整性;对于增删改类接口,除了检查操作结果,还要验证数据是否真的发生了变化。


分页接口通常需要验证分页参数、总数、当前页数据等多个方面。你可能需要检查 $.data.total 是否大于等于当前页的数据条数,检查 $.data.pageSize 是否等于请求中的分页大小参数。


搜索接口的断言会更复杂一些,因为搜索结果具有一定的不确定性。你可能无法预测具体的搜索结果,但可以验证结果的格式和基本属性。比如检查返回的每个搜索结果都包含标题字段,或者验证搜索结果数量不超过设定的上限。


错误场景的断言同样重要。当你故意传入错误的参数时,接口应该返回相应的错误信息。这时候你需要验证错误码、错误信息等内容,确保接口能够正确处理异常情况。

断言的调试技巧


在配置断言的过程中,难免会遇到各种问题。掌握一些调试技巧能帮你快速解决这些问题。


最有效的调试方法是利用 Apifox 的实时预览功能。当你输入 JSONPath 表达式时,右侧会显示提取到的值。如果显示的值不是你期望的,说明表达式有问题,需要调整。


如果 JSONPath 表达式返回空值或者报错,可能是因为路径不正确。这时候可以先用简单的表达式测试,比如先用 $.code 看能否取到值,然后逐步增加路径的复杂度。


有时候接口返回的数据结构可能与文档不一致,或者包含了意外的嵌套层级。这时候可以先查看完整的响应数据,了解实际的数据结构,然后相应地调整 JSONPath 表达式。


对于复杂的断言,建议先在简单的测试数据上验证,确保逻辑正确后再应用到实际的接口上。这样可以排除数据本身的干扰,专注于断言逻辑的正确性。


掌握了断言的配置和使用,你就能够让接口测试变得更加自动化和可靠。断言不仅能帮你发现问题,还能让你对接口的质量更有信心。随着经验的积累,你会发现断言是接口测试中不可或缺的重要工具。

订阅
qrcode

订阅

随时随地获取 Apifox 最新动态