Python -- 断言的介绍及使用(3)
简介:
pytest.fail()
是 Pytest 测试框架中一个非常有用的函数,用于强制使当前测试用例失败,并可以附带一条自定义的失败信息。
pytest.raises()
也是 Pytest 框架中一个极其重要且常用的功能,专门用于测试代码是否会按预期抛出特定的异常。
pytest.fail() 函数
与 assert
断言的区别
虽然 assert
是最常用的断言方式,但 pytest.fail()
有其独特的使用场景:
assert
:- 信息: Pytest 会智能地分析
assert
语句,并在失败时提供非常详细的上下文信息,包括:- 涉及的变量的值。
- 表达式的计算过程(对于复杂表达式)。
- 例如,
assert a == b
失败时,会显示a
和b
的具体值。
- 优点: 自动化程度高,调试信息极其丰富,通常不需要手动添加太多解释。
- 缺点: 信息是基于表达式自动生成的,有时可能不够“人性化”或无法表达复杂的业务逻辑原因。
- 信息: Pytest 会智能地分析
pytest.fail()
:- 信息: 完全依赖于你传入的字符串参数。你需要自己编写清晰、描述性的失败消息。
- 优点: 灵活性极高。你可以用自然语言详细解释“为什么”在这里失败,可以包含复杂的上下文、日志片段、预期行为描述等。信息完全由你控制。
- 缺点: 信息质量完全取决于使用者。如果消息写得不清楚,调试会很困难。不会自动显示变量值(除非你手动在字符串中包含它们,如
f"Value was {x}, expected {y}"
)。
使用1:
常用于条件分支中,可以自定义错误提示语。
import pytest
def test_1():
a = 1
b = 2
c = 3
if a / b == c:
print("yes!")
else:
pytest.fail(
f"\n"
f"表达式: {a}/{b} 不等于 {c} \n"
f"被除数: {a} \n"
f"除数: {b}\n"
f"结果: {c}"
)
对比 Assert
断言:
def test_2():
a = 1
b = 2
c = 3
assert a / b == c
在简单的断言中,Assert
断言更直观;但如果需要极其详细、自定义的失败报告,果断使用 pytest.fail()
!
使用2:
问题:如果异常代码被 try except
捕获了,那么这个异常不会被pytest识别,用例会测试通过!
def test_3():
try:
1 / 0 == 1
except Exception as e:
print("无事发生!!!")
使用 pytest.fail()
来使用例失败
def test_4():
try:
1 / 0 == 1
except Exception as e:
pytest.fail(f"发生了异常!{e}")
pytest.raises() 函数
官方推荐的异常断言方法,期望在接下来的代码块中,会抛出一个特定类型的异常。如果这个异常确实被抛出,测试就通过;否则,测试失败。
使用:
使用 pytest.raises() 来识别异常,发生了异常且匹配的话,测试通过。
def test_5():
with pytest.raises(ZeroDivisionError):
1 / 0 == 1 # 测试通过,因为抛出了 ZeroDivisionError
反之,测试不通过。
def test_6():
with pytest.raises(Exception):
1 / 1 == 1 # 测试不通过,因为没发生Exception
评论区