pytest: рефакторинг повторных тестов - PullRequest
0 голосов
/ 15 апреля 2020

У меня есть тестовые примеры, как показано ниже:

class TestSomething():
    def test_a(self):
        ...
    def test_b(self):
        ...

Это работало хорошо. Но теперь мне нужно изменить некоторые настройки среды, перезагрузить машину, чтобы она стала эффективной, и снова протестировать эти случаи.

Все, что я могу думать, это:

class TestSomething():
    def test_a(self):
        ...
    def test_b(self):
        ...
    # change the env var on the target machine and reboot it
    def test_change_env_and_reboot(self):
        some_env_var = get_env_var()
        if not some_env_var:
            set_env_var()
            reboot()
    def test_a1(self):
        self.test_a()
    def test_b1(self):
        self.test_b()

Это не выглядит не очень хорошо. Есть ли лучший способ достичь той же цели, не меняя исходные существующие тестовые наборы?

Обновление: Цель состоит в том, чтобы обнаружить some_env_var, установить его и перезагрузить компьютер, если он не True. После этого повторно запустите test_a и test_b. С другой стороны, если some_env_var уже установлен, не запускайте эти тестовые сценарии повторно.

1 Ответ

1 голос
/ 15 апреля 2020

Вы можете просто извлечь из своего первого тестового класса и добавить метод настройки (я использовал setup_class, который вызывается один раз, при необходимости вы можете использовать setup_method, который вызывается перед каждым тестом). Если вы запустите pytest с этим файлом:

import os

class TestSomething:
    def test_a(self):
        pass

    def test_b(self):
        pass


class TestSomethingElse(TestSomething):
    @classmethod
    def setup_class(cls):
        if os.getenv('VAR') == '1':
            pytest.skip("Test not needed")
        else:
            print('Changing configuration...')

Вы получите:

collecting ... collected 4 items

test_setup.py::TestSomething::test_a PASSED                              [ 25%]
test_setup.py::TestSomething::test_b PASSED                              [ 50%]
test_setup.py::TestSomethingElse::test_a Changing configuration...
PASSED                          [ 75%]
test_setup.py::TestSomethingElse::test_b PASSED                          [100%]

========================== 4 passed in 0.07 seconds ===========================

Как видите, каждый тест запускается снова после выполнения измененной установки.

Если вам не нужен тест (здесь определяется значением переменной среды), вы можете пропустить его непосредственно в настройке. В этом случае ваш вывод будет:

collecting ... collected 4 items

test_setup.py::TestSomething::test_a PASSED                              [ 25%]
test_setup.py::TestSomething::test_b PASSED                              [ 50%]
test_setup.py::TestSomethingElse::test_a SKIPPED                         [ 75%]
Skipped: Test not needed

test_setup.py::TestSomethingElse::test_b SKIPPED                         [100%]
Skipped: Test not needed
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...