侧边栏壁纸
博主头像
一朵云的博客博主等级

拥抱生活,向阳而生。

  • 累计撰写 108 篇文章
  • 累计创建 28 个标签
  • 累计收到 7 条评论

目 录CONTENT

文章目录

Python -- 断言的介绍及使用(3)

一朵云
2023-12-01 / 0 评论 / 0 点赞 / 319 阅读 / 4506 字

Python -- 断言的介绍及使用(3)

简介:

pytest.fail() 是 Pytest 测试框架中一个非常有用的函数,用于强制使当前测试用例失败,并可以附带一条自定义的失败信息。

pytest.raises() 也是 Pytest 框架中一个极其重要且常用的功能,专门用于测试代码是否会按预期抛出特定的异常

​ 

pytest.fail() 函数

assert 断言的区别

虽然 assert 是最常用的断言方式,但 pytest.fail() 有其独特的使用场景:

  • assert:
    • 信息: Pytest 会智能地分析 assert 语句,并在失败时提供非常详细的上下文信息,包括:
      • 涉及的变量的值。
      • 表达式的计算过程(对于复杂表达式)。
      • 例如,assert a == b 失败时,会显示 ab 的具体值。
    • 优点: 自动化程度高,调试信息极其丰富,通常不需要手动添加太多解释。
    • 缺点: 信息是基于表达式自动生成的,有时可能不够“人性化”或无法表达复杂的业务逻辑原因。
  • 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}"
        )

image-higk.png

​ 

对比 Assert断言:

def test_2():
    a = 1
    b = 2
    c = 3

    assert a / b == c

image-vdak.png

在简单的断言中,Assert 断言更直观;但如果需要极其详细、自定义的失败报告,果断使用 pytest.fail() !

​ 

使用2:

问题:如果异常代码被 try except 捕获了,那么这个异常不会被pytest识别,用例会测试通过!

def test_3():
    try:
        1 / 0 == 1
    except Exception as e:
        print("无事发生!!!")

image-fgcr.png

​ 

使用 pytest.fail() 来使用例失败

def test_4():
    try:
        1 / 0 == 1
    except Exception as e:
        pytest.fail(f"发生了异常!{e}")

image-ticv.png

​ 

pytest.raises() 函数

官方推荐的异常断言方法,期望在接下来的代码块中,会抛出一个特定类型的异常。如果这个异常确实被抛出,测试就通过;否则,测试失败。

​ 

使用:

使用 pytest.raises() 来识别异常,发生了异常且匹配的话,测试通过。

def test_5():
    with pytest.raises(ZeroDivisionError):
        1 / 0 == 1  # 测试通过,因为抛出了 ZeroDivisionError

image-eqvv.png

反之,测试不通过。

def test_6():
    with pytest.raises(Exception):
        1 / 1 == 1  # 测试不通过,因为没发生Exception

image-hssy.png

0

评论区