Лучший способ выполнить очистку после запуска нескольких тестов с помощью pytest - PullRequest
0 голосов
/ 09 октября 2019

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

Я добился взаимодействия между первым и вторым тестом с использованием кеша pytest. Первый тест что-то делает и записывает необходимые данные в кэш Pytest. Второй тест при запуске с другой командой pytest читает из этого кэша и делает что-то еще. Я использую переменную self тестового класса в качестве кэша, выполняя заданные атрибуты и получая атрибуты в нескольких из ловушек pytest.

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

# filename test_cases.py
class TestCase1:
    @pytest.mark('one')
    def test_one(self, fixture1):
        # fixture1.y = 1
        self.x = 1
        assert self.x + fixture1.y == 2

    @pytest.mark('two')
    def test_two(self, fixture2):
        # fixture2.y = 2
        self.x += fixture2.y
        assert self.x == 3

    @pytest.mark('cleanup')
    @pytest.mark('two')
    @pytest.mark.run('after=test_two')
    def test_cleanup(self, fixture):
        # Let's say this cleans stuff 
        fixture.y = 0

Эта серия команд запускает полные тесты.

pytest test_cases.py -m "one"

Собран 1 тест ... (test_one)

pytest test_cases.py -m "two"

Собрано 2 теста .. (test_two и cleanup)

Во второй команде она показывается как два теста, и в этом вся проблема. Есть ли способ исключить очистку из результатов, но выполнить очистку?

Или все-таки можно добиться того же, изменив test_cleanup на cleanup? Подвох в том, что функция очистки, очевидно, различна для разных тестовых случаев, включая приборы, которые она принимает в качестве аргументов.

1 Ответ

0 голосов
/ 10 октября 2019

Я думаю, что очистка должна быть частью вашего fixture2. Воспользуйтесь преимуществом демонтажа прибора , используя оператор yield вместо return:

@pytest.fixture()
def fixture2():
    # Create your fixture data
    value = 'whatever object the fixture is supposed to create'

    yield value

    # Perform cleanup on the data when the test function exits
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...