PyTest teardown_class запускается слишком рано - PullRequest
0 голосов
/ 27 июня 2018

Python "teardown_class" не ведет себя так, как я ожидаю. Ниже приведена сводка моего кода:

@classmethod
def setup_class(cls):
    cls.create_table(table1)
    cls.create_table(table2)
    cls.create_table(table3)

@classmethod
def create_table(cls, some_arg_here):
    """Some code here that creates the table"""

def test_foo(self):
    """Some test code here"""

@classmethod
def teardown_class(cls):
    """Perform teardown things"""

Я полагаю, что это так:

  1. create_table вызывается из установки с первым параметром (таблица1)
  2. Выполнение кода в create_table
  3. Код в teardown_class выполняется
  4. 1-3 выше выполняется снова со вторым параметром
  5. 1-3 выше выполняется снова с 3-м параметром
  6. Код в test_foo выполняется

Как я ожидаю, что это выполнит:

  1. create_table вызывается с 1-м параметром (table1)
  2. Код в create_table выполняется
  3. create_table вызывается со вторым параметром (таблица 2)
  4. Выполнение кода в create_table
  5. create_table вызывается с третьим параметром (таблица 3)
  6. Выполнение кода в create_table
  7. код в test_foo выполняется
  8. Код в teardown_class выполняется

Python 2.7.10, pytest-3.6.2, py-1.5.3, pluggy-0.6.0

Ответы [ 2 ]

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

Мне удалось найти решение. Я воссоздал функцию create_table как внутреннюю функцию внутри функции setup.

@classmethod
def setup_class(cls):
    def create_table(some_arg_here):
       """Some code here that creates the table"""

    create_table(table1)
    create_table(table2)
    create_table(table3)

def test_foo(self):
    """Some test code here"""

@classmethod
def teardown_class(cls):
    """Perform teardown things"""

И теперь он работает так, как я ожидаю, в следующей последовательности:

  1. Выполнить create_table один раз для параметра table1
  2. Выполнить create_table один раз для table2 param
  3. Выполнить create_table один раз для table3 param
  4. Пробег test_foo
  5. Выполнить teardown_class

Кажется, что каждый раз, когда функция, находящаяся за пределами setup, вызывается из setup, она заставляет функцию teardown запускать непосредственно после кода во внешней функции и это была проблема, с которой я столкнулся.

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

Ваш классовый метод пропускает параметр cls:

@classmethod
def create_table(some_arg_here):
    """Some code here that creates the table"""

Измените его на

@classmethod
    def create_table(cls, some_arg_here):

Я изменил ваш код и добавил несколько отпечатков:

class TestClass:

    @classmethod
    def setup_class(cls):
        print("Setting up")
        cls.create_table('table1')
        cls.create_table('table2')
        cls.create_table('table3')

    @classmethod
    def create_table(cls, some_arg_here):
        print("Creating:", some_arg_here)
        """Some code here that creates the table"""

    def test_foo(self):
        print('Running test_foo')
        """Some test code here"""

    @classmethod
    def teardown_class(cls):
        print("Tearing down")
        """Perform teardown things"""

Если вы запустите его с -s, вы получите следующий результат:

test.py Setting up
Creating: table1
Creating: table2
Creating: table3
Running test_foo
.Tearing down

Как видите, все работает как положено. Вызывается setup_class, создаются таблицы (все 3), запускается метод тестирования, а затем запускается teardown_class.

Если вы добавите функцию test_bar (), вы получите:

test.py Setting up
Creating: table1
Creating: table2
Creating: table3
Running test_foo
.Running test_bar
.Tearing down

Кажется, мне тоже подойдет ..

Есть ли у вас еще какие-то подсказки для вашего предположения, что что-то не так?

...