Python: Как протестировать программу, использующую форк?

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

Во время разработки я несколько раз разбираю начальный процесс, чтобы получить полную настройку экземпляров, что очень удобно.

Тем не менее, попытка написать интеграционные тесты вызывает у меня проблемы: фреймворк для тестирования (unittest/nosetests/py.test), конечно, тоже разветвлен, так что в итоге я получаю фреймворк для тестирования нескольких копий, предоставляя искаженные результаты как выходные данные каждого ребенка. unittest перекрывается.

Упрощенный пример:

  • программа является клиентом чата, подключается к другому клиенту через некоторое сетевое соединение (скажем, redis pubsub)
  • программа выставляет API для публикации и чтения сообщений
  • Я хочу раскошелиться на два экземпляра программы, которые соединяются друг с другом
  • тесты должны использовать API, чтобы убедиться, что клиенты работают, отправляя / получая сообщения друг другу
  • Основной процесс контролирует дочерние процессы на наличие ошибок и запускает набор тестов.

Чтобы достичь этого, мне нужно "выгрузить" или остановить тестовые фреймы от дочерних процессов. Как я могу это сделать?

Я мог бы исправить это, вызывая набор тестов только после разрыва с детьми, но мне нужно перезапускать всех детей для каждого теста.

1 ответ

Решение

Формирование процесса в этом контексте является большой проблемой, поскольку дочерние процессы наследуют полный стек родительского процесса, включая работающий экземпляр тестовой среды.

Существуют два варианта решения этой проблемы:

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

Номер два - отказаться от всего вместе, просто запустив процессы с помощью subprocess / Popen, Я нашел плагин Pytest под названием xprocess, который поможет вам в этой задаче. Это не обеспечило именно то, что мне нужно, но оно указало мне в правильном направлении.

Другие вопросы по тегам