Можно ли протестировать некоторое время True l oop с pytest (я пытаюсь с таймаутом)? - PullRequest
2 голосов
/ 09 апреля 2020

У меня есть 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
    ...

Подробнее

  1. Я смотрел на добавление декоратора, такого как @pytest.mark.timeout(5), но это не сработало, и это останавливает всю функцию, поэтому я никогда не доберусь до assert s. (как предложено здесь ).
  2. Если я не найду способ, я просто протестирую детали, но в идеале я бы хотел найти способ проверить, сломав l oop.
  3. Я знаю, что могу переписать свой код, чтобы у него был тайм-аут, но это означало бы изменение кода, чтобы сделать его тестируемым, что я не считаю хорошим дизайном.
  4. Придурки Я не пробовал (как предлагалось здесь ), потому что я не верю, что могу издеваться над тем, что я делаю, так как он пишет информацию из Интернета. Мне нужно на самом деле увидеть «оригинальную» работу.

Ответы [ 2 ]

1 голос
/ 10 апреля 2020

Да, это возможно, и приведенный выше код показывает один из способов сделать это (выполнить многопроцессорную обработку с тайм-аутом).

Поскольку проверки работали нормально, я обнаружил, что проблема не в pytest, но отчет о покрытии не учитывает multiprocessing должным образом.

Я описываю, как исправить этот (теперь отдельный) вопрос вопроса здесь .

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

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

def scrape_web_info(url):
  data = get_it(url)
  return data

# In production:

while True:
  scrape_web_info(...)

# During test:

def test_web_info():
  assert scrape_web_info(...) == ...
...