断言表达式:布尔表达式、复合条件、断言与逻辑运算符

断言表达式,说白了就是你要检查的那个条件。它到底长什么样?能有多复杂?今天我们就来掰扯清楚。

布尔表达式:最基础的断言

布尔表达式,就是结果只有 True 或 False 的表达式。这是断言最核心的原料。

举个例子:

assert result == expected
assert value > 0
assert status_code == 200

这些都是一条简单的布尔表达式。我刚开始写断言时,觉得这太简单了,没什么好说的。直到有一次,我写了个 assert result = expected——注意,我用了单等号!结果变成了赋值操作,永远返回 True,bug 就这么溜过去了。

⚠️ 注意: 断言里一定要用 ==(比较运算符),别写成 =(赋值运算符)。这个坑我踩过,你最好别踩。

复合条件:多个条件一起判断

实际项目中,一个断言往往要检查多个条件。比如验证一个用户信息:

assert user.name == "张三" and user.age > 18 and user.status == "active"

这就是复合条件。它把多个布尔表达式用逻辑运算符连起来,形成一个整体。

我个人习惯把复合条件拆开写,这样报错时能一眼看出是哪个条件失败了:

assert user.name == "张三", f"名字不对,实际是 {user.name}"
assert user.age > 18, f"年龄不够,实际是 {user.age}"
assert user.status == "active", f"状态不对,实际是 {user.status}"

你想想看,如果写成一行,报错信息只会告诉你 AssertionError,你根本不知道是名字、年龄还是状态出了问题。拆开写,每条断言都有自己的错误信息,调试效率高多了。

断言与逻辑运算符

逻辑运算符有三种:and、or、not。它们可以组合出各种复杂的断言条件。

运算符 含义 示例
and 且(所有条件都为真) a > 0 and b < 10
or 或(至少一个条件为真) status == "ok" or retry_count < 3
not 非(取反) not error_flag

我曾经遇到过一个场景:接口返回的数据,要么有 data 字段,要么有 error 字段,但不能两个都有。我当时写的断言是:

assert (response.get("data") is not None) != (response.get("error") is not None)

嗯,这里用了异或的逻辑——两个条件不能同时为真,也不能同时为假。虽然写法有点绕,但确实管用。

💡 小技巧: 复杂逻辑条件建议加括号,明确运算优先级。比如 assert (a > 0) and (b < 10 or c == 5),括号让代码可读性提升一大截。

知识体系结构图

下面这张图,帮你理清断言表达式的核心逻辑:

断言表达式知识结构 断言表达式 布尔表达式 复合条件 逻辑运算符 比较运算 成员判断 多条件组合 拆开断言 and or not 核心:用简单条件组合出强大的断言逻辑

实际项目中的经验

我记得有一次,测试一个支付接口,需要验证:

  • 支付金额必须大于 0
  • 用户余额必须足够
  • 支付状态必须是 "pending" 或 "processing"
  • 不能同时有退款标记

我当时写了一个复合断言:

assert amount > 0, f"金额必须大于0,实际是 {amount}"
assert balance >= amount, f"余额不足,余额 {balance},需要 {amount}"
assert status in ("pending", "processing"), f"状态异常:{status}"
assert not refund_flag, "不能有退款标记"

你看,每个条件都拆开了,而且都带了明确的错误信息。这样一旦断言失败,我立刻知道是哪个环节出了问题。

🔑 核心要点:
  • 布尔表达式是断言的基础,结果只有 True/False
  • 复合条件用 and/or/not 组合多个条件
  • 复杂断言建议拆开写,每条带错误信息
  • 逻辑运算符注意优先级,多用括号

说白了,断言表达式就是把你脑子里的检查逻辑,翻译成代码能理解的条件。写得好,bug 无处遁形;写得不好,断言形同虚设。

可可精品资料库