Почему я не могу 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)

  1. определить прибор как доступную переменную (например, inputв следующем примере). Чтобы определить его, используйте request.cls.VARIABLE_NAME_YOU_DEFINE = RETURN_VALUE

  2. использовать @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")
Другие вопросы по тегам