2013-05-13 5 views
7

Ich parallelisieren eine bereits vorhandene Anwendung, die gTest mit MPI verwendet. In MPI-Programmen ist das erste, was zu tun, um die Umwelt mit einem Aufruf anUnit-Test MPI-Programme mit gtest

MPI_Init(int *argc, char ***argv) 

Am Ende eines MPI-Programm das Root-Prozess aufrufen sollte auch MPI_Finalize zu initialisieren. Wie kann ich Komponententests für eine solche Anwendung mit Google Test schreiben?

Insbesondere wie greife ich auf argc und argv von den Tests vor gTest ändert sie.

Im Moment bin ich tun:

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

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

und fühlt sich falsch an.

Antwort

10

Sind Sie sicher, dass Sie auf die argc und argv Werte vor googeltest zugreifen möchten? Sie werden modifiziert, um googletest-spezifische Argumente wie --gtest_filter zu entfernen, damit die Anwendung sie nicht sieht.

Ich denke, was Sie tun möchten, ist einfach das folgende Snippet als main mit:

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; 
} 
+0

Danke! Entfernen InitGoogleTest Argumente, die für gTest nicht relevant sind? – gnzlbg

+1

Nein, tut es nicht. Nur die besten Argumente. – rmhartog

2

Fügen Sie einfach zu @ rmhartog Antwort.

Sie möchten wahrscheinlich auch unten hinzufügen, um nur einen Listener für das Drucken vor RUN_ALL_TESTS() zu lassen, andernfalls vermischen sich die stdout Nachrichten.

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