【问题标题】:Unit-testing MPI Programs with gtest使用 gtest 对 MPI 程序进行单元测试
【发布时间】:2013-05-07 18:13:14
【问题描述】:

我正在并行化一个使用 gTest 和 MPI 的现有应用程序。在 MPI 程序中,首先要做的是通过调用

来初始化环境
MPI_Init( int *argc, char ***argv )

在 MPI 程序结束时,根进程也应该调用 MPI_Finalize。如何使用 Google Test 为此类应用程序编写单元测试?

特别是,我如何访问 argc,以及来自测试的 argv gTest 修改它们之前。

我现在正在做:

int argc = 0;
char** argv = NULL;
boost::mpi::environment env(argc,argv);

TEST(component_test, test_name) {
  // stuff using mpi
}

感觉不对。

【问题讨论】:

    标签: c++ mpi googletest


    【解决方案1】:

    只需添加到@rmhartog 的答案。

    您可能还想在下面添加,以便在 RUN_ALL_TESTS() 之前只留下一个用于打印的侦听器,否则,标准输出消息会混合在一起。

    ::testing::TestEventListeners& listeners =
        ::testing::UnitTest::GetInstance()->listeners();
    if (world.rank() != 0) {
        delete listeners.Release(listeners.default_result_printer());
    }
    

    【讨论】:

      【解决方案2】:

      您确定要在之前 googletest 访问argcargv 值吗?它们被修改以删除 googletest 特定参数,例如 --gtest_filter,以便应用程序看不到它们。

      我认为您想要做的只是使用以下 sn-p 作为您的main

      int main(int argc, char* argv[]) {
          int result = 0;
      
          ::testing::InitGoogleTest(&argc, argv);
          MPI_Init(&argc, &argv);
          result = RUN_ALL_TESTS();
          MPI_Finalize();
      
          return result;
      }
      

      【讨论】:

      • 谢谢! InitGoogleTest 是否会删除与 gTest 无关的参数?
      • 不,它没有。只有 gtest 参数。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-01-01
      • 2012-03-21
      • 2011-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-03
      相关资源
      最近更新 更多