Jakie ramy testów jednostkowych dla gier opartych na c ++? [Zamknięte]

13

Którą kombinację narzędzi testujących uważasz za najlepszą? Biorąc pod uwagę wybrany szkielet / bibliotekę, możesz rozważyć:


Uwaga: Chociaż jest to potencjalnie ogólne pytanie, takie jak to na SO , twierdzę, że tworzenie gier jest zwykle związane z określonym przepływem pracy, który wpływa na wybór do testowania. Perspektywa wyższego poziomu znajduje się w pytaniu Automatyczne testowanie gier .

jmp97
źródło
Chociaż bezpośrednio nie widzę nic złego w tym pytaniu, myślę, że korzystanie z Wiki Wiki byłoby korzystne. Na przykład: gamedev.stackexchange.com/questions/480/…
Jesse Dorsey
Zrobiłem to CW. Jednak myślę, że wytyczne dotyczące tego, kiedy zadawać pytanie CW, wydają się nieco niejasne jako nowicjusz, szczególnie, że jest to ogólnie dyskutowane ( meta.stackexchange.com/questions/55888 ). Może moglibyśmy wyraźnie określić politykę gamedev dotyczącą tego w FAQ?
jmp97,

Odpowiedzi:

7

Odkryłem, że UnitTest ++ jest bardzo łatwy w obsłudze. Będę musiał jeszcze wypróbować amopa wraz z nim, o którym wspomniano, że jest dobrym towarzyszem UnitTest ++ pod względem funkcjonalności próbnego obiektu. W przeciwnym razie Google Mock jest popularnym wyborem. Możesz także przeczytać na UnitTest ++ i Mock Objects .

UnitTest ++ można skonfigurować za pomocą podejścia Continuous Integration, np. Z Hudson

Możesz przeczytać ten inspirujący post, jeśli nie jesteś przekonany, że testy jednostkowe i gry idą dobrze.

jmp97
źródło
UnitTest ++ jest jedyną strukturą testową, której powinieneś potrzebować, szczególnie biorąc pod uwagę, że można ją łatwo modyfikować i rozszerzać. Jeśli później zaczniesz programować w Javie, JUnit uderzy cię raz po raz młotkiem z całkowitą nieelegancją, którą wyświetla.
dash-tom-bang
W przypadku UnitTest ++ przejdź na stronę github.com/unittest-cpp/unittest-cpp. Wszystko inne jest nieaktualne.
Markus
4

Kolejny głos na UnitTest ++ . Bardzo łatwa do zintegrowania, skompilowana dla naszej docelowej platformy wbudowanej bardzo łatwo, prosta i łatwa w użyciu. Zintegrowaliśmy go również z Hudsonem. Przyjrzeliśmy się GoogleTestowi, ale go odrzuciliśmy (myślę, że miał problemy z kompilacją dla naszej platformy docelowej), ale ma podobny zestaw funkcji i może być odpowiedni dla Ciebie.

Dodatkowo możesz zajrzeć do jakiejś struktury testowania dymu. Z mojego doświadczenia trudno jest uzyskać wystarczające pokrycie testowe dla gry z samych testów jednostkowych. Zwłaszcza jeśli wprowadzasz testy jednostkowe do istniejącej bazy kodu, a nawet więcej dla dużego zespołu. Testowanie dymu polega na testowaniu rzeczy wysokiego poziomu, takich jak „upewnij się, że wszystkie poziomy się ładują”. Moja teoria jest taka, że ​​jeśli mam oba rodzaje testów, to w pewnym momencie mogą się spotkać na środku i dać przyzwoitą średnią. :)

Chris Howe
źródło
2

Kiedy pracowałem w C ++ (zastrzeżenie: było to około 2005 r.), Użyłem nieco zmodyfikowanej wersji TUT (Framework Unit Test Framework) . Podobało mi się to, ponieważ był tak lekki, że ułatwiał modyfikację i oznaczał, że podczas pisania testów wymagane było niewiele kleju.

Oto jedna bardzo prosta modyfikacja, którą wprowadziłem, dzięki czemu pisanie testów jest jeszcze łatwiejsze / łatwiejsze:

static int BogusFunction() { return __COUNTER__; } // Increment the __COUNTER__ to the correct position for the begining of the tests
#define TEST template<> template<> void object::test<__COUNTER__>()
#define ENSURE(msg, cond) ensure(msg, cond, __FILE__, __LINE__)
#define ENSURE_EQUALS(msg, actual, expected) ensure_equals(msg, actual, expected, __FILE__, __LINE__)
#define ENSURE_DISTANCE(msg, actual, expected, distance) ensure_distance(msg, actual, expected, distance, __FILE__, __LINE__)
#define FAIL(msg) fail(msg, __FILE__, __LINE__)

Inną zmianą, jaką wprowadziłem, był format wyjściowy, tak aby niepowodzenia testów były poprawnie wyświetlane na liście błędów programu Visual Studios (uruchamianej jako część kompilacji), którą można kliknąć, aby przejść do pliku i wiersza nieudanego testu.

(Zdolność do robienia tego rodzaju rzeczy oznacza, że można go dopasować do procesu TDD / CI, a nie zmuszać do dopasowania się do niego.)

Oto przykładowy test (ze stosu poleceń mojego edytora):

TEST // Undoing a command
{
    cs.AddCommand(new TestCommand);
    cs.AddCommand(new TestCommand(od));

    ENSURE("Undo success", cs.Undo());
    ENSURE_EQUALS("Stack size", cs.size(), 2);
    ENSURE_EQUALS("Command's Undo() was called", od.undo, 1);
    ENSURE_EQUALS("Command's Redo() not called", od.redo, 0);

    ACommandStack::const_iterator it = cs.end();
    ENSURE("Command is redoable", cs.GetUndoPos() == --it);
}

(Na powyższym kodu csi ododnoszą modułami osprzętu oraz TestCommandjest atrapa obiektu).

Andrew Russell
źródło
2

Jeśli chodzi o C ++, próbowałem i użyłem frameworku googletest, http://code.google.com/p/googletest/ . Jest prosty w konfiguracji, łatwy w użyciu i działa świetnie.

Szymon
źródło
2

Nie jestem profesjonalnym programistą gier, ale jestem profesjonalnym programistą osadzonym. Być może nie tak jak w grach, ale blisko. W moim miejscu pracy wykorzystaliśmy kilka.

Naprawdę lubię test Google . Posiada wszystkie najlepsze cechy najnowszych frameworków testów jednostkowych, jednocześnie utrzymując wszystko w minimalnym, liniowym interfejsie.

Następny na mojej liście jest Test doładowania . Interfejs API testu Google jest nieco nowocześniejszy niż Boost.Test, ale Boost Test wykonał niesamowitą robotę dodając nowe funkcje i odrzucając nieokrzesany paradygmat CppUnit.

Użyłem również CxxTest . Jest dość dobrze zrobiony, ale można stwierdzić, że nie jest tak nowoczesny jak Boost.Test lub Google Test. W szczególności obsługa zestawów testowych i urządzeń jest nieco niewygodna.

Lubię korzystać z zaawansowanych funkcji, ale jeśli jesteś minimalistą, nigdy nie zobaczysz różnicy między tymi trzema. Większość moich kolegów byłaby zadowolona z frameworka testu jednostkowego, który obsługuje test automatycznej rejestracji (w sposób deklaratywny) i ma pewnego rodzaju makro CHECK_EQUALS (a, b).

deft_code
źródło
1

Moja ulubiona biblioteka testowa to QuickCheck http://en.wikipedia.org/wiki/QuickCheck . Istnieje eksperymentalna wersja C ++, ale wygląda na zbyt ciężką, ale nawet bez dedykowanej biblioteki zasady są łatwe w użyciu.

Wszystkie moje klasy mają metodę genArbitrary, która może wygenerować przypadkową instancję. Używam tego do testowania procesów odwracalnych dymu, takich jak ładowanie i rozładowywanie. Mogę wygenerować tysiące losowych scen i sprawdzić, czy zachowują się różne właściwości (np. Scena, którą serializuję, jest taka sama jak scena, którą deserializuję).

Nie zastępuje tradycyjnych testów jednostkowych (zmniejsza potrzebę wielu potencjalnych testów jednostkowych), ale jest świetnym sposobem na wykrywanie błędów i pomaga w testowaniu warunków skrajnych w mojej strategii alokacji pamięci (wraz z Valgrind). Wspaniale jest oglądać ponad milion alokacji, które wychodzą z Valgrind pure :).

Używałem CxxTest jako uprzęży testowej, co mi się podobało. Teraz wszystkie moje testy są osobnymi ex. Mam tylko folder o nazwie Test i każdy plik, który zaczyna się od Test_, staje się testem. Jak dotąd przeprowadzanie testów jest bardzo łatwe.

Jonathan Fischoff
źródło
0

W Javie jest tak wiele dobrych bibliotek ... Nie w przypadku C ++.

Dla użytkowników C ++ istnieje narzędzie łańcucha od Kitware, które jest bardzo interesujące:

  • CMake: zrób narzędzie
  • CDash: narzędzie do ciągłej integracji

Kitware pisze kody C ++ dla informatyki.

Do osobistych projektów używam biblioteki testów jednostek Boost (na platformie Desktop). Do ciągłej integracji używam Hudson:

  • łatwa instalacja na Tomcat
  • skryptowalny
Ellis
źródło
0

Popieram framework TUT (Template Unit Test) ; jest bardzo lekki i niezwykle elastyczny, nie wspominając o naprawdę łatwej konfiguracji i obsłudze od razu po wyjęciu z pudełka (pojedynczy nagłówek zawiera trochę kodu głównego / konfiguracji i 24 wiersze kodu testowego, później masz test jednostkowy). Połączyłem go z binfmtc (uruchamiam programy C ++ jako skrypty) w celu szybkiego prototypowania / TDD / szablonów edukacyjnych z wielkim sukcesem, w tym rozwoju oprogramowania wbudowanego. Ponieważ jest w stanie wyświetlać dane w formacie XML, ładnie współgra z Jenkins (CI) i Sonarem przy kolejnych moich projektach.

Nathan Paul Simons
źródło