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.
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.