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

gnz*_*lbg 8 c++ mpi googletest

我正在并行化一个已经存在的使用gTest和MPI的应用程序.在MPI程序中,首先要做的是通过调用来初始化环境

MPI_Init( int *argc, char ***argv )
Run Code Online (Sandbox Code Playgroud)

在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
}
Run Code Online (Sandbox Code Playgroud)

并且感觉不对.

rmh*_*tog 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;
}
Run Code Online (Sandbox Code Playgroud)


小智 5

只需添加@rmhartog 的答案即可。

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

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