Почему я не могу unittest.TestCases увидеть мои py.test приборы?
Я пытаюсь использовать py.test
Светильники с моими юнит-тестами, в сочетании с 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
?
Не работает:
conftest.py
@pytest.fixture
def my_fixture():
return 'This is some fixture data'
test_stuff.py
import unittest
import pytest
class TestWithFixtures(unittest.TestCase):
def test_with_a_fixture(self, my_fixture):
print(my_fixture)
Работает:
conftest.py
@pytest.fixture()
def my_fixture():
return 'This is some fixture data'
test_stuff.py
import pytest
class TestWithFixtures:
def test_with_a_fixture(self, my_fixture):
print(my_fixture)
Я задаю этот вопрос больше из любопытства; сейчас я просто бросаю unittest
в целом.
3 ответа
Хотя pytest поддерживает получение осветителей через аргументы тестовой функции для методов тестирования, не относящихся к юнит-тесту, методы unittest.TestCase не могут напрямую получать аргументы функции фикстуры в качестве реализации, которая может повлиять на возможность запуска общих тестовых пакетов unittest.TestCase.
Из раздела заметок внизу: https://pytest.org/latest/unittest.html
Можно использовать светильники с unittest.TestCase
эс. Смотрите эту страницу для получения дополнительной информации.
Вы можете использовать приборы pytest в
unittest.TestCase
с pytest
autouse
:
conftest.py
@pytest.fixture
def my_fixture():
return 'This is some fixture data'
test_stuff.py
import unittest
import pytest
class TestWithFixtures(unittest.TestCase):
@pytest.fixture(autouse=True)
def test_with_a_fixture(self, my_fixture):
print(my_fixture)
определить прибор как доступную переменную (например,
input
в следующем примере). Чтобы определить его, используйтеrequest.cls.VARIABLE_NAME_YOU_DEFINE = RETURN_VALUE
использовать
@pytest.mark.usefixtures("YOUR_FIXTURE")
чтобы использовать фикстуру вне класса unittest, внутри класса unittest, доступ к фикстуре осуществляется с помощью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")