优化断言管理:探索pytest-assume插件的强大功能

前言

实际编写自动化测试用例时,一个用例中我们通常会写多个断言,当第一个断言失败后,后面的代码就不会执行了,但有时候我们希望第一个断言失败后,后面还可以继续断言,那该如何解决这个需求呢?

pytest-assume 是啥

针对前言中问题,我们使用pytest-assume 插件可以方便解决。

pytest-assume插件可以解决断言失败后继续执行后面断言的问题。

安装 pytest-assume 插件

在命令行中运行以下命令,安装 pytest-assume插件:

复制代码
pip install pytest-assume

pytest-assume如何使用

方法一:

导入pytest,使用pytest.assume()进行断言

方法二:

使用with上下文管理器编写,像这样

python 复制代码
from pytest_assume.plugin import assume
​
def test_add():
  with assume: assert 1 == 2

使用案例

我们写一些测试用例看一下效果

test_demo.py

python 复制代码
import pytest
​
def add(x, y):
    return x + y
​
def test_addition():
    result = add(2, 3)
    assert result == 2  # 第一个断言
    assert result > 0  # 第二个断言
    assert result % 2 == 0   # 第三个断言
​

未使用插件前,应该在第一个断言失败就会停下来,但第二个断言是通过的,由于第一个断言失败导致停止运行。

先看看不用该插件的执行效果:

markdown 复制代码
...
____________________________________________________________ test_addition _____________________________________________________________
​
    def test_addition():
        result = add(2, 3)
>       assert result == 2  # 第一个断言
E       assert 5 == 2
​
test_dir/test_demo.py:8: AssertionError

可以看到用例执行到第一个断言失败,就停止运行了,后面的断言并没有执行。

我们使用方法一:pytest.assume() 对代码进行调整,像这样

scss 复制代码
import pytest
​
def add(x, y):
    return x + y
​
def test_addition():
    result = add(2, 3)
​
    pytest.assume(result == 2)
    pytest.assume(result > 0)
    pytest.assume(result % 2 == 0)
​

再看看使用插件的执行效果:

markdown 复制代码
...
____________________________________________________________ test_addition _____________________________________________________________
​
tp = <class 'pytest_assume.plugin.FailedAssumption'>, value = None, tb = None
​
    def reraise(tp, value, tb=None):
        try:
            if value is None:
                value = tp()
            if value.__traceback__ is not tb:
>               raise value.with_traceback(tb)
E               pytest_assume.plugin.FailedAssumption:
E               2 Failed Assumptions:
E
E               test_dir/test_demo.py:12: AssumptionFailure
E               >>  pytest.assume(result == 2)
E               AssertionError: assert False
E
E               test_dir/test_demo.py:14: AssumptionFailure
E               >>  pytest.assume(result % 2 == 0)
E               AssertionError: assert False
​
../venv/lib/python3.8/site-packages/six.py:718: FailedAssumption

从结果可以看到,第一个断言失败后,没有停止运行,继续执行直到最后一个断言结束,但会统计错误的次数,像结果中的2 Failed Assumptions

使用方法中还提到了方法二:with上下文管理器,我们使用这种方法来改造一下代码,像这样

python 复制代码
from pytest_assume.plugin import assume
​
def add(x, y):
    return x + y
​
def test_addition():
    result = add(2, 3)
    with assume: assert result == 2
    with assume: assert result > 0
    with assume: assert result % 2 == 0

执行之后,你会发现结果是一样的,这里就不详细说了。

运行原理

到这里应该知道如何使用了,我们接下来看看它的运行原理:

  1. 解析测试用例:pytest会解析测试文件中的所有测试用例,并将其标记为测试函数。
  2. 执行测试函数:pytest按照定义的顺序执行测试函数。当遇到使用pytest.assume断言时,它不会立即抛出异常,而是将当前断言的结果存储在内部的断言缓冲区中。
  3. 继续执行:即使前面的断言失败,pytest-assume会继续执行后续的断言和代码,而不会中止整个测试用例的执行。
  4. 收集断言结果:在所有断言执行完毕后,pytest-assume会从断言缓冲区中获取所有断言的结果,并进行汇总。
  5. 报告结果:最终,pytest会根据断言的结果生成测试报告,包括每个断言的状态(通过或失败),以及整个测试用例的状态(通过或失败)。

通过上述步骤,pytest-assume插件实现了对多个断言的执行和收集结果,而不中断整个测试用例。这样,我们可以一次性看到所有断言的结果,方便查看测试用例的完整执行情况。

需要注意的是,pytest-assume仅影响使用pytest.assume断言的代码块。其他未使用pytest.assume的断言将按照pytest默认的行为执行。因此,在编写测试用例时,需要明确使用pytest.assume来标识希望进行多个断言的代码块。

总结起来,pytest-assume插件的原理是将断言结果存储在缓冲区中,并在所有断言执行完毕后进行结果汇总,从而实现对多个断言的执行和报告。这提供了更灵活和全面的测试方式,方便开发人员对被测试代码进行全面的验证和检查。

结论

使用pytest-assume插件,我们可以更方便地组织和管理测试用例,尤其是当一个测试用例需要多个相关断言时。它为我们提供了更灵活的测试方式,让我们能够更全面地检查被测试代码的行为。

相关推荐
h***047719 小时前
SpringBoot(7)-Swagger
java·spring boot·后端
v***913020 小时前
Spring boot创建时常用的依赖
java·spring boot·后端
Cosolar1 天前
银河麒麟 / aarch64 系统:Docker + Docker Compose 完整安装教程
后端·程序员·架构
Wise玩转AI1 天前
Day 27|智能体的 UI 与用户交互层
人工智能·python·ui·ai·chatgpt·ai智能体
星释1 天前
Rust 练习册 100:音乐音阶生成器
开发语言·后端·rust
kaliarch1 天前
2025年IaC生态全景与实践指南:从工具选型到多云治理
后端·云计算·自动化运维
Coder-coco1 天前
个人健康管理|基于springboot+vue+个人健康管理系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·后端·mysql·论文
b***65321 天前
springboot整合mybatis-plus(保姆教学) 及搭建项目
spring boot·后端·mybatis
5***E6851 天前
Spring Boot与MyBatis
spring boot·后端·mybatis
s***46981 天前
【玩转全栈】----Django模板语法、请求与响应
数据库·python·django