Ctest с опцией -j дает разные результаты с j1 и jn - PullRequest
0 голосов
/ 06 июля 2019

Я устанавливаю фреймворк для модульного тестирования, используя ctest и cmake. Идея состоит в том, чтобы выполнить команду test в контейнере Docker, и тест будет выполнен внутри контейнера. Это требование.

add_test выглядит так add_test (test_name, / bin / sh, runner.sh test_cmd)

где runner.sh - скрипт, который запускает контейнер и test_cmd - это команда теста, которая выполняется в контейнере.

test_cmd похож на это

/path/to/test/test_binary; CODE=$?; echo $CODE > /root/result.txt;

runner.sh имеет этот код

docker exec -t -i --user root $CONTAINERNAME bash -c "test_cmd"

runner.sh далее пытается прочитать /root/result.txt из контейнера.

runner.sh порождает новый контейнер для каждого теста. Каждый тест выполняется в своем собственном контейнере Поэтому они не могут мешать друг другу при параллельном выполнении. /root/result.txt является отдельным для каждого контейнера.

когда я запускаю такие тесты

make test ARGS="-j8"

для некоторых конкретных тестов /root/result.txt не генерируется. Следовательно, чтение из этого файла не выполняется (docker exec для test_cmd уже возвращается) И я не вижу стандартный вывод этих тестов в LastTest.log

когда я запускаю такие тесты

make test ARGS="-j1"

Все тесты пройдены. /root/result.txt генерируется для всех тестов, и я вижу вывод (stdout) этих тестов

Такое же поведение существует для j> 1. Тесты не истекают. Я проверил. Я думаю, что до echo $ CODE> /root/result.txt; Я пытаюсь прочитать статус выхода из /root/result.txt, но опять же, как он проходит в -j1 и в sh его последовательное выполнение. Пока не выйдет одна команда, она не будет двигаться вперед.

Одним интересным наблюдением является то, что когда я пытаюсь сделать это (docker exec, та же команда) из скрипта Python, используя подпроцесс вместо bash, это работает.

def executeViaSubprocess(cmd, doOutput=False):
    p = subprocess.Popen(cmd, stdout=subprocess.PIPE)
    stdout, stderr = p.communicate()
    retCode = p.returncode
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...