我正在使用ctest和cmake设置单元测试框架。想法是在docker容器中执行test命令,并且测试将在容器内执行。这就是要求。
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。因此从该文件读取失败(test_cmd的docker exec已经返回) 而且我在LastTest.log中看不到这些测试的标准输出
当我像这样运行测试时
make test ARGS="-j1"
所有测试均通过。 /root/result.txt是针对所有测试生成的,我可以看到这些测试的输出(stdout)
j> 1的行为相同。 测试未超时。我检查了。 我的猜测是 回声$ CODE> /root/result.txt; 我正在尝试从/root/result.txt读取退出状态,但是它又如何在-j1和sh顺序执行中传递。直到一个命令退出,它才继续前进。
一个有趣的发现是,当我尝试使用子进程而不是bash从python脚本执行此操作(docker exec,相同的命令)时,它会起作用。
def executeViaSubprocess(cmd, doOutput=False):
p = subprocess.Popen(cmd, stdout=subprocess.PIPE)
stdout, stderr = p.communicate()
retCode = p.returncode