Тест пропуска PyTest на основе целевой версии кода - PullRequest
1 голос
/ 26 марта 2020

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

Я добавил метод pytest_addoption:

def pytest_addoption(parser):
   parser.addoption(
        '--target-version',
        action='store', default='28',
        help='Version of firmware running in target')

Создайте прибор для принятия решения. если тест должен быть запущен:

@pytest.fixture(autouse = True)
def version_check(request, min_version: int = 0, max_version: int = 10000000):
    version_option = int(request.config.getoption('--target-version'))
    if min_version and version_option < min_version:
        pytest.skip('Version number is lower that versions required to run this test '
                    f'({min_version} vs {version_option})')
    if max_version and version_option > max_version:
        pytest.skip('Version number is higher that versions required to run this test '
                    f'({max_version} vs {version_option})')

Пометить тесты следующим образом:

@pytest.mark.version_check(min_version=24)
def test_this_with_v24_or_greater():
    print('Test passed')

@pytest.mark.version_check(max_version=27)
def test_not_supported_after_v27():
    print('Test passed')

@pytest.mark.version_check(min_version=13, max_version=25)
def test_works_for_range_of_versions():
    print('Test passed')

В аргументах для запуска теста я просто хочу добавить --target-version 22 и иметь только правильные тесты Я не смог выяснить, как передать аргументы с @pytest.mark.version_check(max_version=27) на version_check.

Есть ли способ сделать это или я совершенно не в курсе и должен искать что-то еще? чтобы выполнить 1019 * это? 1018 *

1 Ответ

2 голосов
/ 27 марта 2020

Вы недалеко от решения, но вы путаете маркеры с приборами; они не одинаковы, даже если вы дадите им то же имя. Однако вы можете прочитать маркеры каждой тестовой функции в вашем приборе version_check и пропустить тест в зависимости от того, что было предоставлено маркером version_check , если он установлен. Пример:

@pytest.fixture(autouse=True)
def version_check(request):
    version_option = int(request.config.getoption('--target-version'))
    # request.node is the current test item
    # query the marker "version_check" of current test item
    version_marker = request.node.get_closest_marker('version_check')
    # if test item was not marked, there's no version restriction
    if version_marker is None:
        return
    # arguments of @pytest.mark.version_check(min_version=10) are in marker.kwargs
    # arguments of @pytest.mark.version_check(0, 1, 2) would be in marker.args
    min_version = version_marker.kwargs.get('min_version', 0)
    max_version = version_marker.kwargs.get('max_version', 10000000)
    # the rest is your logic unchanged
    if version_option < min_version:
        pytest.skip('Version number is lower that versions required to run this test '
                    f'({min_version} vs {version_option})')
    if version_option > max_version:
        pytest.skip('Version number is higher that versions required to run this test '
                    f'({max_version} vs {version_option})')
...