Я устанавливаю фреймворк для модульного тестирования, используя 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