Как динамически запускать некоторые тесты параллельно в Pytest 3.0.7 - PullRequest
1 голос
/ 23 апреля 2020

Я использую Pytest 3.0.7 (в Python 2.7), и мне нужно иметь возможность динамически запускать выбранные тесты параллельно, не изменяя тесты. Возьмите приведенный ниже пример кода:

import time
import logging
import pytest

logger = logging.getLogger('test1')
logger.setLevel(logging.DEBUG)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
# File handler
logfh = logging.FileHandler('results.log')
logfh.setLevel(logging.DEBUG)
logfh.setFormatter(formatter)
logger.addHandler(logfh)
# Console handler
logch = logging.StreamHandler()
logch.setLevel(logging.DEBUG)
logch.setFormatter(formatter)
logger.addHandler(logch)

def waste_time(prefix, range_end=5, sleep_time=2):
    logger.info("WASTE TIME")
    for i in range(range_end):
        logger.debug("{}, iteration {} of {}.".format(prefix, i, range_end))
        time.sleep(sleep_time)

def test_test1():
    logger.info("Test1 is starting.")
    waste_time(prefix='TEST 1')
    assert True
    logger.info("Test1 is done.")

def test_test2():
    logger.info("Test2 is starting.")
    waste_time(prefix='TEST 2')
    assert True
    logger.info("Test2 is done.")

def test_test3():
    logger.info("Test3 is starting.")
    waste_time(prefix='TEST 3')
    assert True
    logger.info("Test3 is done.")

Мне нужно иметь возможность динамически решать, какие тесты, если таковые имеются, запускаться параллельно. Иногда это будут test1 и test2, а тест 3 будет выполняться последовательно после. Иногда test1 будет выполняться с последующими параллельными тестами 2 и 3, иногда я буду запускать все параллельно, иногда нет, и т. Д. c.

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

Я играл с плагином pytest_generate_tests и пытался внедрить метки в свои тесты, но я не нашел способа успешно пометить тест. Я использовал pytest-xdist в качестве параллельного тестера.

Вот один из моих экспериментов pytest_generate_tests (сейчас я просто пытаюсь заставить его пропустить тест).

def pytest_generate_tests(metafunc):
    if metafunc.definition.name == 'test_test2':
        metafunc.definition.own_markers = [_pytest.mark.Mark(name='skip', args=(), kwargs={})]
        logger.debug("Mark set on test_test2")

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

Да, я знаю, Python 2.7 устарела. Мы перейдем на 3.0, но есть много кода и довольно большая организация для перемещения.

Буду признателен за любую помощь.

1 Ответ

0 голосов
/ 24 апреля 2020

Мне удалось пропустить тест, динамически установив маркер с помощью хука pytest_collection_fini sh следующим образом:

import _pytest.mark

def pytest_collection_finish(session):
    for itm in session.session.items:
        if itm.name == 'test_test2':
            itm.own_markers = [_pytest.mark.Mark(name='skip', args=(), kwargs={})]

Теперь, чтобы посмотреть, смогу ли я применить его к своей реальной проблеме.

...