Замена для наследования тестовых случаев в pytest? - PullRequest
0 голосов
/ 27 августа 2018

Фон

В среде Python unittest довольно распространенной идиомой является использование наследования на базовом наборе тестов для применения всего набора тестов к новой задаче, а иногда и для добавления дополнительных тестов. Тривиальный пример будет:

from unittest import TestCase

class BaseTestCase(TestCase):
    VAR = 3

    def test_var_positive(self):
        self.assertGreaterEqual(self.VAR, 0)

class SubTestCase(BaseTestCase):
    VAR = 8

    def test_var_even(self):
        self.assertTrue(self.VAR % 2 == 0)

Который при запуске запускает 3 теста:

$ python -m unittest -v
test_var_positive (test_unittest.BaseTestCase) ... ok
test_var_even (test_unittest.SubTestCase) ... ok
test_var_positive (test_unittest.SubTestCase) ... ok

----------------------------------------------------------------------
Ran 3 tests in 0.000s

Это особенно полезно, если вы тестируете иерархию классов, где каждый подкласс является подтипом родительских классов и, таким образом, должен иметь возможность пройти набор тестов родительского класса в дополнение к своему собственному.

Задача

Я хотел бы перейти на использование pytest, но у меня есть много тестов, которые структурированы таким образом. Из того, что я могу сказать, pytest намеревается заменить большую часть функциональности TestCase классов на приборы, но есть ли идиома pytest, которая позволяет наследовать тест, и если да, то что это ?

Я знаю, что pytest может использоваться для запуска unittest -тификаторов, но поддержка ограничена , и я хотел бы использовать некоторые из функций, которые "никогда не будут поддерживаться" pytest в моих тестах.

1 Ответ

0 голосов
/ 27 августа 2018

Pytest позволяет группировать тестовые случаи в классах, поэтому он, естественно, поддерживает наследование тестовых случаев.

Переписывая свои unittest тесты в pytest тесты, не забывайте следовать правилам именования pytest :

  • имена классов должны начинаться с Test
  • имена функций / методов должны начинаться с test_

Несоблюдение этой схемы именования будет препятствовать сбору и выполнению ваших тестов.


Ваши тесты, переписанные для pytest, будут выглядеть так:

class TestBase:
    VAR = 3

    def test_var_positive(self):
        assert self.VAR >= 0

class TestSub(TestBase):
    VAR = 8

    def test_var_even(self):
        assert self.VAR % 2 == 0
...