Как запустить несколько тестов с Pytest с квалификационным тестом - PullRequest
0 голосов
/ 13 февраля 2020

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

tests/
test_qualifier.py
test_one.py
test_two.py
...

Теперь, когда я запускаю тесты, используя pytest test/ -x, он запускает все тесты, учитывая, что он останавливается при первом сбое. Я хочу, чтобы pytest запустил test_qualifier.py, и если это не удалось, остановите дальнейшее выполнение, но если оно пройдет, не останавливайте, не пройден ли какой-либо тест.

Ответы [ 2 ]

0 голосов
/ 14 февраля 2020

Вы можете использовать Pytest-зависит плагин. Пометить другие тесты как зависимые от test_qualifier.

Со страницы плагина :

Этот плагин pytest позволяет объявлять зависимости между тестами pytest, где зависимые тесты не будет работать, если тесты, от которых они зависят, не были успешными.

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

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

Пример кода :

BUILD_PATH = 'build'

def test_build_exists():
    assert os.path.exists(BUILD_PATH)

@pytest.depends(on=['test_build_exists'])
def test_build_version():
    result = subprocess.run([BUILD_PATH, '--version', stdout=subprocess.PIPE)
    assert result.returncode == 0
    assert '1.2.3' in result.stdout

Вы можете достичь того же самого, написав свой собственный плагин pytest, используя ловушки pytest.

0 голосов
/ 13 февраля 2020

Это не та особенность, которая в общем-то имеет большой смысл, поэтому я не вижу, чтобы pytest поддерживал ее «из коробки».

Однако вы, вероятно, можете развернуть ее самостоятельно: в test_qualifier создайте autouse прибор, который проверяет результат теста и вызывает что-то вроде pytest.exit, если один из тестов не прошел. Может быть, проверьте, как работает --exitfirst, если вы хотите получать правильные отчеты, я не знаю, будет ли прямой вызов pytest.exit генерировать нормальный отчет об ошибках, так что он может быть менее чем велик.

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

Вы также можете написать плагин conftest, подключенный к pytest_collection_modifyitems , чтобы ваши квалификационные тесты всегда выполнялись первыми, и вы не подвергались капризам прямой итерации или алфавитного порядка c.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...