头像
淇迹时刻
-- : -- : --
切换主题色
-- : -- : --

pytest 的基础语法

最后更新于:

第 1 章:pytest 的基础语法

📖 知识点:断言 (assert)


🎯 当前作用

pytest 直接使用 Python 内置的 assert 语句来验证测试结果是否符合预期。它的作用是检查某个条件是否为真,如果为假则测试失败并报告详细的信息。这是编写任何测试用例最核心的语句。


🤔 使用场景

  • 验证计算结果:测试一个函数返回值是否等于期望值(如加法、排序等)。
  • 检查布尔条件:验证某个状态是否为 TrueFalse(如用户登录状态、开关是否开启)。
  • 检查集合成员关系:判断某个元素是否在列表、字典、字符串中(如检查 API 返回的字段是否包含某个 key)。
  • 比较对象:比较两个对象是否相等、大于、小于等(如比较两个字典是否一致)。

💻 案例演示

场景:我们有一个计算折扣价的函数 apply_discount(price, discount),需要验证它是否能正确计算折扣后的价格。

1. 编写被测函数和测试用例
 1# test_discount.py
 2
 3def apply_discount(price, discount):
 4    """计算折后价格
 5    price: 原价
 6    discount: 折扣率,如 0.8 表示八折
 7    """
 8    return price * discount
 9
10def test_discount():
11    # 基本断言:等于
12    assert apply_discount(100, 0.8) == 80   # 八折后应为80元
13    
14    # 不等于断言
15    assert apply_discount(50, 0.5) != 30    # 五折后25元,不等于30
16    
17    # 布尔断言:折后价格应小于原价
18    result = apply_discount(200, 0.9)
19    assert result < 200                      # 九折后180 < 200
20    
21    # 成员关系断言:折扣后的价格是否在某个范围内
22    assert result in [180, 181, 179]         # 180 在这个列表中
23    
24def test_type():
25    # 测试返回类型是否为浮点数
26    result = apply_discount(100, 0.8)
27    assert isinstance(result, float)
2. 故意让一个断言失败,体验 pytest 的失败报告

修改上面的 test_discount 函数,增加一个错误断言:

1def test_discount():
2    # ... 之前的断言保持不变 ...
3    
4    # 故意写一个错误的断言
5    assert apply_discount(100, 0.8) == 79   # 实际是80,这里断言等于79会失败
3. 运行测试并观察输出
1pytest test_discount.py -v

失败的输出会类似这样(pytest 会智能地展示断言表达式中的值):

 1=================================== FAILURES ===================================
 2_______________________________ test_discount ________________________________
 3
 4    def test_discount():
 5        # ... 之前的断言保持不变 ...
 6        
 7        # 故意写一个错误的断言
 8>       assert apply_discount(100, 0.8) == 79
 9E       assert 80.0 == 79
10E        +  where 80.0 = apply_discount(100, 0.8)
11
12test_discount.py:15: AssertionError
13========================= 1 failed, 1 passed in 0.05s ==========================

💡 说明

  • pytest 会显示失败的那一行,并给出 实际值期望值 的对比。
  • 它还会展示函数调用的中间结果(apply_discount(100, 0.8) 实际返回了 80.0),这能极大地帮助定位问题。
4. 常用断言写法速查
断言类型示例代码
相等assert a == b
不等assert a != b
真/假assert x is Trueassert not x
大于/小于assert a > bassert c <= d
包含assert item in collection
类型检查assert isinstance(obj, MyClass)
近似相等(浮点数)assert abs(0.1 + 0.2 - 0.3) < 1e-9

💡 提示:对于浮点数,直接 assert 0.1 + 0.2 == 0.3 可能会失败(浮点精度问题),建议使用近似比较或 pytest.approx 函数(后续会介绍)。


📚 本章小结

  • 断言是测试的核心:每个测试函数至少应包含一个 assert 语句。
  • 失败即停止:当一个 assert 失败时,该测试函数会立即终止,但其他测试函数会继续运行。
  • pytest 的智能报告:它会自动显示断言表达式中的各个部分的值,减少调试时间。
  • 可读性优先:建议使用清晰的断言表达式,必要时可以添加失败消息:assert result == expected, f"期望{expected},实际{result}"
最新文章