Testing CMake/CTest-作为测试并行执行进程
在我的团队中,我们开发了一个库,它通过一些网络后端协调多个应用程序。 该建筑由CMake 3.10.4管理,我们使用CTest运行测试。我们目前只支持Linux,但Windows和MacOS的支持即将到来 我们还提供了示例应用程序,这些应用程序在CTEST中作为测试进行配置和构建 我们如何能够:Testing CMake/CTest-作为测试并行执行进程,testing,cmake,multiprocessing,ctest,system-testing,Testing,Cmake,Multiprocessing,Ctest,System Testing,在我的团队中,我们开发了一个库,它通过一些网络后端协调多个应用程序。 该建筑由CMake 3.10.4管理,我们使用CTest运行测试。我们目前只支持Linux,但Windows和MacOS的支持即将到来 我们还提供了示例应用程序,这些应用程序在CTEST中作为测试进行配置和构建 我们如何能够: 将CTest作为单个测试并行运行2个示例程序 使实现尽可能独立于系统 分别捕获两个STDOUT(交错也可以) 我们尝试了什么 我们创建了一个CMake脚本,由CTest调用。 它使用以下命令执行以下操作
STDOUT
(交错也可以)DUMMY\u B
可能在DUMMY\u A
之前返回。
在这种情况下,DUMMY_A
仍然写入STDOUT
,这会导致管道破裂,从而导致测试失败
我们考虑的其他选择:
- 使用shell脚本并行运行两个程序,这取决于系统
- 使用python脚本将一个程序作为子进程运行,这显然需要python
- 允许测试通过
失败,我们可以通过SIGPIPE
进行检查。但这可能会隐藏实际失败的测试RESULTS\u VARIABLE
执行过程
,有两个非常相似的选项:结果变量
用于最后一个过程的退出代码,而结果变量
(注意s
)用于所有退出代码的列表execute\u process
已经并行运行了这些进程,问题是如何防止管道破裂。哦,没有注意到以选项的名义终止S
,CMake 3.10+实际上有这个选项。因此,如果您不担心DUMMY\u A
的输出,您可以使用output\u QUIET
选项,使用附加的execute\u进程
来包装它的执行,这样它就不会再写入管道,也无法获得SIGPIPE。但是,如果应用程序的输出非常重要,那么您应该同时执行第二个命令:1。输出其stdin。2.执行DUMMY\u B
。再次需要并行执行。。。创建2或3个特定于平台的小型shell包装脚本似乎比克服管道更简单。@Tsyvarev感谢您的输入!编写一些最小的脚本肯定比将功能打包到CMake中更容易维护。您是否介意将您的评论作为答案发布,以便我可以将其标记为解决方案?建议在不指定替换的情况下放弃某些方法,这可能不是“解决方案”:)至于shell脚本,虽然我清楚地了解Linux创建后台进程并等待它的方法,但对于Windows,它可能会非常困难:。除非您只需要一个并行测试,否则您仍然可以考虑使用非shell语言或甚至C/C++程序编写脚本。@ Tsyvarev有两个非常类似的选项:<代码> ExcUTETY进程< /代码>:<代码>结果>变量>代码>最后一个进程的退出代码和<代码>结果>变量< /代码>(注意<代码> S/<代码>)查看所有退出代码的列表execute\u process
已经并行运行了这些进程,问题是如何防止管道破裂。哦,没有注意到以选项的名义终止S
,CMake 3.10+实际上有这个选项。因此,如果您不担心DUMMY\u A
的输出,您可以使用output\u QUIET
选项,使用附加的execute\u进程
来包装它的执行,这样它就不会再写入管道,也无法获得SIGPIPE。但是,如果应用程序的输出非常重要,那么您应该同时执行第二个命令:1。输出其stdin。2.执行DUMMY\u B
。再次需要并行执行。。。创建2或3个特定于平台的小型shell包装脚本似乎比克服管道更简单。@Tsyvarev感谢您的输入!编写一些最小的脚本肯定比将功能打包到CMake中更容易维护。您是否介意将您的评论作为答案发布,以便我可以将其标记为解决方案?建议在不指定替换的情况下放弃某些方法,这可能不是“解决方案”:)至于shell脚本,虽然我清楚地了解Linux创建后台进程并等待它的方法,但对于Windows,它可能会非常困难:。除非您只需要一个并行测试,否则您可能仍然会考虑使用非shell语言编写脚本,甚至还可以考虑C/C++程序。
# 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
)