使用-j选项的Ctest使用j1和jn表示不同的结果

时间:2019-07-06 07:24:23

标签: bash docker cmake multiprocessing ctest

我正在使用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

0 个答案:

没有答案