[英]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.