我正在尝试将
py.test
的 fixtures 与我的单元测试结合使用 unittest
。我已将几个固定装置放入项目顶层的 conftest.py
文件中(如此处所述),用 @pytest.fixture
装饰它们,并将它们的名称作为需要它们的测试函数的参数。
灯具注册正确,如
py.test --fixtures test_stuff.py
所示,但是当我运行 py.test
时,我得到 NameError: global name 'my_fixture' is not defined
。这似乎只在我使用 unittest.TestCase
的子类时发生 - 但 py.test
文档似乎说它与 unittest
配合得很好。
为什么我使用
unittest.TestCase
时测试看不到灯具?
@pytest.fixture
def my_fixture():
return 'This is some fixture data'
import unittest
import pytest
class TestWithFixtures(unittest.TestCase):
def test_with_a_fixture(self, my_fixture):
print(my_fixture)
@pytest.fixture()
def my_fixture():
return 'This is some fixture data'
import pytest
class TestWithFixtures:
def test_with_a_fixture(self, my_fixture):
print(my_fixture)
我问这个问题更多是出于好奇;现在我只是完全放弃
unittest
。
虽然 pytest 支持通过测试函数参数接收装置 对于非unittest测试方法,unittest.TestCase方法不能 直接接收固定功能参数作为实现 可能会影响运行一般unittest.TestCase测试的能力 套房。
来自底部的注释部分: https://pytest.org/en/latest/unittest.html
可以使用具有
unittest.TestCase
es 的灯具。请参阅该页面了解更多信息。
您可以将
unittest.TestCase
中的 pytest 固定装置与 pytest 选项 autouse
一起使用。但是,如果您使用 test_
作为使用夹具的单位方法,则会出现以下错误:
Fixtures are not meant to be called directly,...
### conftest.py
@pytest.fixture
def my_fixture():
return 'This is some fixture data'
一种解决方案是使用
prepare_fixture
方法将固定装置设置为 TestWithFixtures
类的属性,以便固定装置可用于所有单元测试方法。
### test_stuff.py
import unittest
import pytest
class TestWithFixtures(unittest.TestCase):
@pytest.fixture(autouse=True)
def prepare_fixture(self, my_fixture):
self.myfixture = my_fixture
def test_with_a_fixture(self):
print(self.myfixture)
将夹具定义为可访问变量(如以下示例中的
input
)。要定义它,请使用 request.cls.VARIABLE_NAME_YOU_DEFINE = RETURN_VALUE
使用
@pytest.mark.usefixtures("YOUR_FIXTURE")
在单元测试类之外使用固定装置,在单元测试类内部,通过 self.VARIABLE_NAME_YOU_DEFINE
访问固定装置。
例如
import unittest
import pytest
@pytest.fixture(scope="class")
def test_input(request):
request.cls.input = {"key": "value"}
@pytest.mark.usefixtures("test_input")
class MyTestCase(unittest.TestCase):
def test_something(self):
self.assertEqual(self.input["key"], "value")
这对我有用。对 pytest 有更多了解的人可能能够解释它为什么有效。我无法在类上使用 @pytest.mark.usefixtures 的文档中找到为我工作的解决方案。
class MyTest(TestCase):
@pytest.fixture(autouse=True)
def inject_fixtures(self, request):
self.db_session = request.getfixturevalue("db_session")
def test_method1(self):
assert hasattr(self, "db_session")
# assert 0, self.db # fail for demo purposes