Jak mogę użyć Google Test do wywoływania określonych funkcji testowych w określonych miejscach w funkcji main ()?

Używam TDD i Google Test do projektu, który obejmuje symulacje numeryczne. Stan danych zmienia się w pętli wmain funkcji, ale istnieją wymagania, które muszą zostać spełnione po każdej zmianie. Jeśli wszystkie wymagania są spełnione dla przypadku testowego, test akceptacji minął:

while(simulation)
     modify simulation data
     FIRST_TEST()
     some other simulation operations
     SECOND_TEST()

TheGTest primer stany, które zwykle wywołuje RUN_ALL_TESTS (). TheZaawansowany przewodnik pokazuje, jak uruchomić podtesty, wgfiltrowanie testów z RUN_ALL_TESTS. Chciałbym jednak wiedzieć, jak wywoływać testy indywidualnie.

W przeciwnym razie musiałbym napisać nową aplikację do testowania akceptacji za każdym razem, gdy potrzebuję nowego testu, takiego jak FIRST_ i SECOND_ we fragmencie pseudokodu powyżej.

Więcej informacji: używam frameworka OpenFOAM dla Computational Fluid Dynamics, tworząc globalne urządzenia pozamain nie jest opcją. Aplikacja symulacyjna wymaga uruchomienia katalogu i plików konfiguracyjnych, a główne obiekty globalne są skorelowane (wymagają wzajemnej inicjalizacji). Jednym z przykładów takiej aplikacji jestOpenFOAM-2.2.x.

Dalsze uwagi

Wziąłem zaakceptowaną odpowiedź oraz odpowiedź na pytanie, jak używać argc i argv jako zmiennych globalnych w teście znalezionym nakolejne pytanie na temat przepełnienia stosu i podsumowałem to w tym kompilacyjnym małym modelu, może ktoś uzna to za przydatne:

#include <gtest/gtest.h>
#include <iostream>

class Type 
{
    int value_ = 0;
    int times_ = 1; 

    public: 

        Type(int x) : value_(x) {}; 

        void operator()(){
            if (times_ < 10) {
                ++times_; 
                value_ *= times_; 
            }
        }

        int value () const { return value_; } 
}; 

class mySeparatedTests : public ::testing::Test 
{
    protected:

      template<typename Type>
      void TEST_ONE(Type const &t)
      {
          ASSERT_TRUE((t.value() % 2) == 0); 
      }

      template<typename Type> 
      void TEST_TWO(Type const & t)
      {
          ASSERT_TRUE((t.value() - 5) > 0); 
      }
};

TEST_F(mySeparatedTests, testName)
{
    extern char** globalArgv; 
    char** argv = globalArgv;

    // Simulation parameters and objects requiring argc and argv for initialization. 
    int simulationEndTime;  

    *argv[1] >> simulationEndTime;  

    Type typeObject(*argv[2]); 

    TEST_ONE(typeObject); 

    // Simulation loop. 
    for (int i = 0; i < simulationEndTime; ++i)
    {
        typeObject(); 

        TEST_TWO(typeObject); 
    }
}

int globalArgc; 
char** globalArgv; 

int main(int argc, char **argv)
{
    ::testing::InitGoogleTest(&argc, argv);

    globalArgc = argc; 
    globalArgv = argv; 

    return RUN_ALL_TESTS(); 

    return 0; 
}

Takie podejście, jak opisano w zaakceptowanej odpowiedzi, przenosi kod symulacji zmain w TEST_F i używamySeparatedTests funkcje klasy do definiowania indywidualnych testów, które można następnie wywołać w dowolnym miejscu. Jest to skompilowane z:

g++ -std=c++11 -l gtest main.cpp  -o main

Testy kończą się niepowodzeniem w zależności od parowanych parametrów;

to się nie udaje:

./main 1 1 

to się udaje:

./main 2 2 

Uwaga: Wiem, że dzieje się konwersja char / int; to tylko po to, aby pokazać, jak podnieść argumenty.

questionAnswers(1)

yourAnswerToTheQuestion