使用gtest对MPI程序进行单元测试

时间:2013-05-13 16:16:39

标签: c++ mpi googletest

我正在并行化一个已经存在的将gTest与MPI一起使用的应用程序。在MPI程序中,首先要做的是通过调用

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

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

特别是,如何在 gTest修改它们之前从测试访问argc和argv。

现在我正在做:

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

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

并且感觉不对。

2 个答案:

答案 0 :(得分:13)

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

我认为您想要做的只是将以下代码段用作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;
}

答案 1 :(得分:2)

只需添加@ rmhartog的答案。

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

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