【问题标题】:Better way to cleanup after running a bunch of tests with pytest用 pytest 运行一堆测试后更好的清理方法
【发布时间】:2019-10-09 16:41:55
【问题描述】:

我想在两个不同的 pytest 运行中一个接一个地运行两个不同的测试,然后绑定一个清理功能以始终在第二次测试后运行。但是,只运行清理函数也应该具有灵活性。

我使用pytest缓存实现了第一次和第二次测试之间的交互。第一个测试做一些事情并将必要的数据写入 pytest 缓存。使用不同的 pytest 命令运行的第二个测试从该缓存中读取并执行其他操作。我通过在几个 pytest 钩子中设置属性和获取属性来使用测试类的自变量作为缓存。

在这种情况下,我将清理显示为测试,但我不想将其称为test_,因为它不是测试并且不应向用户显示结果。

# filename test_cases.py
class TestCase1:
    @pytest.mark('one')
    def test_one(self, fixture1):
        # fixture1.y = 1
        self.x = 1
        assert self.x + fixture1.y == 2

    @pytest.mark('two')
    def test_two(self, fixture2):
        # fixture2.y = 2
        self.x += fixture2.y
        assert self.x == 3

    @pytest.mark('cleanup')
    @pytest.mark('two')
    @pytest.mark.run('after=test_two')
    def test_cleanup(self, fixture):
        # Let's say this cleans stuff 
        fixture.y = 0

这一系列命令将运行完整的测试。

pytest test_cases.py -m "one"

收集了 1 个测试... (test_one)

pytest test_cases.py -m "two"

收集了 2 个测试..(test_two 和清理)

在第二个命令中,它显示为两个测试,这就是整个问题所在。无论如何要从结果中排除清理但执行清理部分?

或者通过将test_cleanup 更改为cleanup 可以达到同样的效果吗?这里的问题是,对于不同的测试用例,包括它作为参数的固定装置,清理功能显然是不同的。

【问题讨论】:

    标签: python-3.x pytest


    【解决方案1】:

    我认为清理应该是您fixture2 的一部分。利用fixture teardown 使用yield 语句而不是return

    @pytest.fixture()
    def fixture2():
        # Create your fixture data
        value = 'whatever object the fixture is supposed to create'
    
        yield value
    
        # Perform cleanup on the data when the test function exits
    

    【讨论】:

    • 经过深思熟虑后,我们改变了设计,从此类类型测试转移到带有用于拆卸的固定装置的简单功能。但这意味着,我们需要为每个测试使用一个新的夹具。一个夹具只能使用一次并且有很多这样的夹具是一个好习惯吗?
    • @manji369 不,这听起来不是一个好主意。但是,如果不知道您的固定装置做什么以及它们如何生成应该清理的对象,就很难提出替代方案。
    • 为了提供更多上下文,这些测试中的每一个都将测试产品的单独功能。因此,与其他测试相比,每个测试都可能创建不同的实体。这可能表明如果没有单独的固定装置,我们就无法做到这一点。这就是原因,我首先在类中添加了 test_cleanup 函数(以适应特定特性的特定清理功能)。
    • @manji369 似乎您甚至不需要固定装置,因为如果每种情况都非常具体,那么您可以在测试功能中设置所有内容,在这种情况下...清理真正应该是什么在做什么?
    • 清理应该删除在产品内部创建的实体(通过rest api调用)。我们应该重用该产品进行持续集成测试。在测试函数内部进行清理的问题在于,每个测试用例都有两个测试函数(test_one 和 test_two),而且我们并不总是同时运行它们。基于 cmdline args,我们应该在 test_one 或 test_one 和 test_two 都运行之后运行清理。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-11
    • 1970-01-01
    • 2022-12-18
    • 2018-01-25
    • 1970-01-01
    • 2023-01-11
    • 1970-01-01
    相关资源
    最近更新 更多