Я использую 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, но есть много кода и довольно большая организация для перемещения.
Буду признателен за любую помощь.