Модульное тестирование MPI-программ с помощью gtest

Я распараллеливаю уже существующее приложение, которое использует 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
}

и неправильно.

2 ответов


вы уверены, что хотите получить доступ к argc и argv значения до googletest? Они изменяются для удаления конкретных аргументов 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;
}

просто добавьте к ответу @rmhartog.

вы, вероятно, также хотите добавить ниже, чтобы оставить только один прослушиватель для печати перед RUN_ALL_TESTS (), иначе сообщения stdout смешиваются.

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