Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Testing CMake/CTest-作为测试并行执行进程_Testing_Cmake_Multiprocessing_Ctest_System Testing - Fatal编程技术网

Testing CMake/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调用。 它使用以下命令执行以下操作

在我的团队中,我们开发了一个库,它通过一些网络后端协调多个应用程序。 该建筑由CMake 3.10.4管理,我们使用CTest运行测试。我们目前只支持Linux,但Windows和MacOS的支持即将到来

我们还提供了示例应用程序,这些应用程序在CTEST中作为测试进行配置和构建

我们如何能够:

  • 将CTest作为单个测试并行运行2个示例程序
  • 使实现尽可能独立于系统
  • 分别捕获两个
    STDOUT
    (交错也可以)
  • 我们尝试了什么 我们创建了一个CMake脚本,由CTest调用。 它使用以下命令执行以下操作:

    这不能可靠地工作,因为
    DUMMY\u B
    可能在
    DUMMY\u A
    之前返回。 在这种情况下,
    DUMMY_A
    仍然写入
    STDOUT
    ,这会导致管道破裂,从而导致测试失败

    我们考虑的其他选择:

    • 使用shell脚本并行运行两个程序,这取决于系统
    • 使用python脚本将一个程序作为子进程运行,这显然需要python
    • 允许测试通过
      SIGPIPE
      失败,我们可以通过
      RESULTS\u VARIABLE
      进行检查。但这可能会隐藏实际失败的测试

    @Tsyvarev对于
    执行过程
    ,有两个非常相似的选项:
    结果变量
    用于最后一个过程的退出代码,而
    结果变量
    (注意
    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
    )