python - 如何在 py.test 中跨测试累积状态

标签 python testing pytest

我目前有一个与这些类似的项目和测试。

class mylib:
    @classmethod
    def get_a(cls):
        return 'a'

    @classmethod
    def convert_a_to_b(cls, a):
        return 'b'

    @classmethod
    def works_with(cls, a, b):
        return True

class TestMyStuff(object):
    def test_first(self):
        self.a = mylib.get_a()

    def test_conversion(self):
        self.b = mylib.convert_a_to_b(self.a)

    def test_a_works_with_b(self):
        assert mylib.works_with(self.a, self.b)

使用 py.test 0.9.2,这些测试(或类似的测试)通过了。对于更高版本的 py.test,test_conversion 和 test_a_works_with_b 失败并显示“TestMyStuff 没有属性 a”。

我猜这是因为在后来的 py.test 构建中,为每个测试的方法创建了一个单独的 TestMyStuff 实例。

编写这些测试的正确方法是什么,以便可以为序列中的每个步骤给出结果,但可以(必须)使用先前(成功)测试的状态来执行后续测试?

最佳答案

我部分同意 Ned 的观点,因为最好避免随机共享测试状态。但我也认为在测试期间逐步积累状态有时是有用的。

使用 py.test,您实际上可以通过明确表示您想要共享测试状态来做到这一点。您的示例重写后可以正常工作:

class State:
    """ holding (incremental) test state """

def pytest_funcarg__state(request):
    return request.cached_setup(
        setup=lambda: State(),
        scope="module"
    )

class mylib:
    @classmethod
    def get_a(cls):
        return 'a'

    @classmethod
    def convert_a_to_b(cls, a):
        return 'b'

    @classmethod
    def works_with(cls, a, b):
        return True

class TestMyStuff(object):
    def test_first(self, state):
        state.a = mylib.get_a()

    def test_conversion(self, state):
        state.b = mylib.convert_a_to_b(state.a)

    def test_a_works_with_b(self, state):
        mylib.works_with(state.a, state.b)

您可以使用最新的 py.test 版本运行它。每个函数接收一个“状态”对象,“funcarg”工厂最初创建它并将其缓存在模块范围内。连同 py.test 保证测试按文件顺序运行,测试函数可以更确切地说它们将在测试“状态”上递增地工作。

但是,它有点脆弱,因为如果您通过例如仅选择运行“test_conversion” “py.test -k test_conversion” 那么您的测试将失败,因为第一个测试尚未运行。我认为进行增量测试的某种方法会很好,因此也许我们最终可以找到一个完全可靠的解决方案。

喂, 霍尔格

关于python - 如何在 py.test 中跨测试累积状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3145720/

相关文章:

python - 如何在使用 argparse 的文件上使用指定的测试目录运行 pytest?

pytest - 为什么在同一个文件中定义的 pytest 钩子(Hook)没有运行?

python - 如何使用 pytest、fastapi 和 tortoise-orm 回滚每个测试?

python - 解析Trie树时统计单词笔画

python - 两个数据帧之间的相关性

python - 使用 dict 参数的具有 OR 条件的 Django 过滤器

php - 将 Laravel phpunit 测试绑定(bind)到路由

javascript - 使用 Google 网站优化工具测试动态页面

python - 将参数传递给 Django 表单

javascript - Mocha 只运行一个测试文件