繁体   English   中英

具有全局装置时,如何将 Python 单元测试转换为 py.test?

[英]How can I convert Python unittests to py.test when having global fixtures?

我确实有一组使用 Python 的unittest模块编写的单元测试。 他们使用 setUpModule() 函数加载一个全局变量,其中包含运行测试(包括一些 HTTP 会话)所需的共享“东西”。

使用unittest运行我的测试时,它们运行良好。 使用py.test他们失败了。

我对其进行了一些修补以使其使用旧的pytest固定功能(碰巧与unittest的名称不同)运行。 它有效,但仅当不在多个线程上执行时,这是我想要使用的功能。

文档示例对我来说是无用的,因为我确实有 20 个类 (unittest.TestCase),每个类中有 10 个测试。 显然我不想为每个测试添加一个新参数。

到目前为止,我使用类 setUp() 方法在self内部加载共享字典,并在每个测试中从那里使用它。

#!/usr/bin/env python
# conftest.py
@pytest.fixture(scope="session")
def manager():
    return { "a": "b"}

现在测试:

#!/usr/bin/env python
# tests.py

class VersionTests(unittest.TestCase):

    def setUp(self):
        self.manager = manager

    def test_create_version(self):
        # do something with self.manager
        pass

请记住,我需要一个可以使用多个线程的解决方案,一次调用夹具。

pytest可以运行unittest是肯定的测试,在记录的支持夹具的unittest.TestCase生成/集成 棘手的部分是不鼓励直接使用pytest funcargs 固定装置

虽然 pytest 支持通过非 unittest 测试方法的测试函数参数接收夹具,但 unittest.TestCase 方法不能直接接收夹具函数参数,因为实现可能会影响运行通用 unittest.TestCase 测试套件的能力。

假设我们有一个这样的测试模块,使用标准的unittest初始化工具:

# test_unittest_tests.py (for the sake of clarity!)
import unittest

manager = None

def setUpModule():
    global manager
    manager = {1: 2}

class UnittestTests(unittest.TestCase):
    def setUp(self):
        self.manager = manager

    def test_1_in_manager(self):
        assert 1 in self.manager

    def test_a_in_manager(self):
        assert 'a' in self.manager

使用unittest运行时会产生以下输出:

$ python -m unittest -v test_unittest_tests
...
test_1_in_manager (test_unittest_tests.UnittestTests) ... ok
test_a_in_manager (test_unittest_tests.UnittestTests) ... FAIL
...

test_a_in_manager按预期失败。 manager目录中没有任何'a'键。

我们设置了一个 conftest.py 来为这些测试提供范围内的pytest固定装置。 像这样,例如,在不破坏标准unittest行为的情况下,也不需要使用pytest autouse来触摸它们的测试:

# conftest.py
import pytest

@pytest.fixture(scope='session', autouse=True)
def manager_session(request):
    # create a session-scoped manager
    request.session.manager = {'a': 'b'}

@pytest.fixture(scope='module', autouse=True)
def manager_module(request):
    # set the sessions-scoped manager to the tests module at hand
    request.module.manager = request.session.manager

使用pytest (使用pytest-xdist )运行测试进行并行化,产生以下输出:

$ py.test -v -n2
...
[gw1] PASSED test_unittest_tests.py:17: UnittestTests.test_a_in_manager
[gw0] FAILED test_unittest_tests.py:14: UnittestTests.test_1_in_manager
...

现在test_1_in_manager失败了; pytest管理器字典中没有任何1键。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM