У меня есть python функция foo
с while True
l oop внутри. Для фона: ожидается потоковая информация из интернета, запись и запуск в течение неопределенного времени. Проверка утверждения, если запись была сделана правильно.
Ясно, что мне нужно когда-нибудь ее остановить, чтобы протестировать.
То, что я сделал, было запустить через multirpocessing
и ввести таймаут там, однако, когда я вижу тестовое покрытие, функция, которая прошла через многопроцессорную обработку, не помечается как покрытая.
Вопрос 1 : почему pytest теперь работает таким образом?
Вопрос 2 : Как я могу сделать эту работу?
Я думал, что это, вероятно, потому что я технически выход из l oop, так что, возможно, pytest не пометит это как проверено ....
import time
import multiprocessing
def test_a_while_loop():
# Start through multiprocessing in order to have a timeout.
p = multiprocessing.Process(
target=foo
name="Foo",
)
try:
p.start()
# my timeout
time.sleep(10)
p.terminate()
finally:
# Cleanup.
p.join()
# Asserts below
...
Подробнее
- Я смотрел на добавление декоратора, такого как
@pytest.mark.timeout(5)
, но это не сработало, и это останавливает всю функцию, поэтому я никогда не доберусь до assert
s. (как предложено здесь ). - Если я не найду способ, я просто протестирую детали, но в идеале я бы хотел найти способ проверить, сломав l oop.
- Я знаю, что могу переписать свой код, чтобы у него был тайм-аут, но это означало бы изменение кода, чтобы сделать его тестируемым, что я не считаю хорошим дизайном.
- Придурки Я не пробовал (как предлагалось здесь ), потому что я не верю, что могу издеваться над тем, что я делаю, так как он пишет информацию из Интернета. Мне нужно на самом деле увидеть «оригинальную» работу.