У меня много «длинных тестов», где я должен ждать некоторого относительно большого таймаута (минуты). Например, я вызываю некоторый API в тесте, подождите 15 минут и после этого проверяю веб-страницу на предмет изменений.Как приостановить тест py.test и выполнить некоторые другие тесты во время ожидания?
Итак, вопрос заключается в том, как приостановить некоторый тест, но делать другие тесты во время ожидания. Я не могу использовать только sleep() - полный тестовый костюм в этом случае будет длиться в течение часа (15 минут * (количество таких тестов)).
Единственное решение, которое я вижу - организовать тесты (с крючками pytest_collection_modifyitems):
- Выполнить первые части (до 15 минут пауза) всех длинных тестов (назовем API в конечном примере тест выше)
- Выполнить все короткие тесты
- (необязательно) немного подождать, если (2) занимает менее 15 минут
- Выполнить второй части (после паузы) всех длинных тестов (проверка веб-страницы в приведенном выше примере)
Но это был бы просто большой беспорядок, очень сложный для управления.
И это производит много фиктивных тестов, которые выполняются в (1) - на самом деле это что-то вроде тестовых установок, мне не нужны результаты от них, но pytest будет относиться к ним как к отдельным тестам.
UPD xdist не очень помогает - даже если я могу контролировать, как он распараллеливает тесты (в каких группах, которые запускаются одновременно), мне пришлось бы запускать все длительные тесты параллельно, потому что я хочу сделать что-то полезное во времени ожидания, а не просто ждать (15 минут * (количество длинных тестов))/(количество xdist процессов).
Кажется, единственный способ - запланировать основную петлю pytest для этого. Таким образом, он будет запускать тесты асинхронно. Но я даже не знаю, с чего начать это делать.
Кажется, что вы хотите выполнить несколько действий параллельно. В этом случае вам может потребоваться использовать https://docs.python.org/2/library/multiprocessing.html или https://docs.python.org/2/library/thread.html#module-thread – Andersson
Спасибо , очень хорошая идея! Для запуска вторых частей в виде потоков с простым сном внутри потоков. Но я не понимаю, что «сантехника» должна возвращать результаты в py.test. Кажется, мне нужно подождать в каком-то месте в главной теме py.test для всех этих дополнительных потоков, чтобы закончить, но в каком месте? И как передать все утверждения из дополнительных потоков в основной? Я думал, что для этого есть библиотека, особенно для py.test. – MasterAndrey