Как использовать приборы Pytest с методами Unittest - PullRequest
0 голосов
/ 06 июня 2018
class MyTestCase(unittest.Testcase):
    def setUp(self):
        self.something = True

    @pytest.fixture(autouse=True)
    def MyTestMethod(self, frozentime):
        fn(self.something)  # self.something is NOT defined

Если я использую @pytest.fixture(autouse=True), я получаю странное поведение из PyTest.Вместо того, чтобы вызывать мой метод setUp перед тестовым методом, PyTest пропускает setUp и вызывает MyTestMethod, как если бы это был PyTest MyTestFunction, что, конечно, не очень хорошо работает.

КакЯ получаю MyTestMethod для использования прибора frozentime без игнорирования метода setUp, который должен быть вызван первым.

class MyTestCase(unittest.Testcase):
    def setUp(self):
        self.something = True

    #@pytest.fixture(autouse=True)
    def MyTestMethod(self, frozentime): # Fails on call, because it needs too many arguments.
        fn(self.something)  

1 Ответ

0 голосов
/ 06 июня 2018

Это потому, что автоматические осветительные приборы выполняются до setUp / tearDown методов:

Примечание

Из-за архитектурных различий между двумя платформами, настройки и демонтажа дляunittest тесты проводятся на этапе call тестирования вместо стандартных setup и teardown этапов pytest.Это может быть важно понять в некоторых ситуациях, особенно при рассуждении об ошибках.Например, если пакет на основе unittest выдает ошибки во время установки, pytest не сообщит об ошибках во время фазы setup и вместо этого выдаст ошибку во время call.

Источник

Вы ничего не можете сделать, чтобы обойти это поведение.Вы можете переместить соответствующий код прибора из методов setUp / tearDown, например: если self.flag используется в приборах с классовой областью, вы можете заменить

class Tests(unittest.TestCase):

    def setUp(self):
        self.flag = True

    def tearDown(self):
        self.flag = False

    @pytest.fixture(autouse=True)
    def myfixture(self):
        print(self.flag)

на

class Tests(unittest.TestCase):

    @pytest.fixture(autouse=True)
    def prepare_flag(self):
        self.flag = True
        yield
        self.flag = False

    @pytest.fixture(autouse=True)
    def myfixture(self, prepare_flag):
        print(self.flag)

Или вы можете переместить весь setUp соответствующий код из приборов:

class Tests(unittest.TestCase):

    def setUp(self):
        self.flag = True

    @pytest.fixture(autouse=True)
    def myfixture(self, somearg):
        fn(self.flag, somearg)

становится

class Tests(unittest.TestCase):

    def setUp(self):
        self.flag = True
        fn(self.flag, self._somearg)

    @pytest.fixture(autouse=True)
    def assign_stuff(self, somearg):
        self._somearg = somearg
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...