CMake / CTest - выполнять процессы параллельно как тест - PullRequest
1 голос
/ 03 апреля 2020

в моей команде мы разрабатываем библиотеку, которая координирует несколько приложений через какой-то сетевой сервер. Сборка обрабатывается CMake 3.10.4, и мы запускаем наши тесты с CTest. В настоящее время мы поддерживаем только Linux, но поддержка Windows и MacOS не за горами.

Мы также предоставляем примеры приложений, которые мы настраиваем и создаем в качестве тестов в CTests.

Как мы можем:

  1. запустить 2 примера программ с CTest в качестве одного теста параллельно?
  2. сохранить реализацию как можно независимой от системы?
  3. захватывает оба STDOUT по отдельности (чередование тоже хорошо)?

Что мы пробовали

Мы создали скрипт CMake, который вызывается CTest. Он выполняет следующее, используя execute_process :

# DUMMY_A, DUMMY_B are the dummy application
execute_process(
  COMMAND ${DUMMY_A} ${DUMMY_CONFIG} SolverOne MeshOne
  COMMAND ${DUMMY_B} ${DUMMY_CONFIG} SolverTwo MeshTwo
  WORKING_DIRECTORY ${DUMMY_RUN_DIR}
  RESULTS_VARIABLE DUMMY_RESULTS
)

Это не работает надежно, поскольку DUMMY_B может вернуться до DUMMY_A. В этом случае DUMMY_A все еще записывает в STDOUT, что приводит к SIGPIPE (сломанной трубе) и, следовательно, к неудачному тесту.

Дальнейшие варианты, которые мы рассмотрели:

  • Использование сценария оболочки для параллельного запуска обеих программ, который зависит от системы.
  • Использование сценария python для запуска одной программы в качестве подпроцесса, что очевидно требует python.
  • Разрешить тесты с ошибкой с SIGPIPE, который мы можем проверить с помощью RESULTS_VARIABLE. Это может скрыть реальные неудачные тесты.
...