Pracuję na dużym systemie C ++, który jest rozwijany od kilku lat. W ramach starań o poprawę jakości istniejącego kodu zaangażowaliśmy się w duży, długoterminowy projekt refaktoryzacyjny.
Czy znasz dobre narzędzie, które pomoże mi pisać testy jednostkowe w C ++? Może coś podobnego do Junit lub Nunit?
Czy ktoś może udzielić dobrej rady na temat metodologii pisania testów jednostkowych dla modułów, które zostały napisane bez uwzględnienia testów jednostkowych?
c++
unit-testing
refactoring
Sakin
źródło
źródło
Odpowiedzi:
Zastosowanie testów jednostkowych do starszego kodu było powodem napisania pracy efektywnie ze starszym kodem . Autorem jest Michael Feathers - jak wspomniano w innych odpowiedziach, był zaangażowany w tworzenie zarówno CppUnit, jak i CppUnitLite .
źródło
Niedawno firma Google wydała własną bibliotekę do testowania jednostkowego aplikacji C ++ o nazwie Google Test.
Projekt w Google Code
źródło
Sprawdź doskonałe porównanie kilku dostępnych apartamentów. Autor tego artykułu później opracował UnitTest ++ .
To, co szczególnie mi się w nim podoba (poza tym, że dobrze obsługuje wyjątki itp.) To to, że istnieje bardzo ograniczona ilość „administracji” wokół przypadków testowych i definicji urządzeń testowych.
źródło
Boost posiada bibliotekę Testing który zawiera wsparcie dla testów jednostkowych. Może warto to sprawdzić.
źródło
Noel Llopis z Games From Within jest autorem książki Exploring the C ++ Unit Testing Framework Jungle , wszechstronnej (ale już nieaktualnej) oceny różnych frameworków C ++ Unit Testing, a także książki o programowaniu gier.
Używał CppUnitLite przez dłuższy czas, naprawiając różne rzeczy, ale ostatecznie połączył siły z innym autorem biblioteki testów jednostkowych i stworzył UnitTest ++ . Używamy tutaj UnitTest ++ i jak na razie bardzo mi się to podoba. Ma (dla mnie) dokładną równowagę sił przy niewielkich rozmiarach.
Użyłem rozwiązań własnych, CxxTest (który wymaga Perla) i boost :: test. Kiedy zaimplementowałem tutaj testy jednostkowe, w mojej obecnej pracy, sprowadzało się to do UnitTest ++ vs boost :: test.
Naprawdę lubię większość bibliotek boost, z których korzystałem, ale IMHO, boost :: test jest trochę zbyt uciążliwy. Szczególnie nie podobało mi się to, że wymaga (AFAIK) zaimplementowania głównego programu wiązki testowej za pomocą makra boost :: test. Wiem, że nie jest to „czysty” TDD, ale czasami potrzebujemy sposobu na uruchomienie testów z poziomu aplikacji GUI, na przykład gdy w linii poleceń jest przekazywana specjalna flaga testowa, a boost :: test nie może obsługiwać tego typu scenariuszowy.
UnitTest ++ był najprostszym środowiskiem testowym do skonfigurowania i użycia, z jakim spotkałem się w moim (ograniczonym) doświadczeniu.
źródło
Używam doskonałego Boost.Test biblioteki w połączeniu z dużo mniej znaną, ale niesamowitą biblioteką Turtle : pozorowaną biblioteką obiektów opartą na boost.
Ponieważ przykład kodu mówi lepiej niż słowa, wyobraź sobie, że chciałbyś przetestować
calculator
obiekt, który działa naview
interfejsie (to jest przykład wprowadzający Turtle'a):Widzisz, jak łatwe i szczegółowe jest deklarowanie oczekiwania na pozorowanym obiekcie? Oczywiście test kończy się niepowodzeniem, jeśli oczekiwania nie zostaną spełnione.
źródło
Właśnie wypuściłem mój własny framework, CATCH , tam. Jest wciąż w fazie rozwoju, ale uważam, że już przewyższa większość innych frameworków. Różni ludzie mają różne kryteria, ale starałem się omówić większość obszarów bez zbyt wielu kompromisów. Spójrz na mój powiązany wpis na blogu, aby uzyskać degustację. Pięć moich najważniejszych funkcji to:
Posiada również wiązania Objective-C.
źródło
CxxTest to lekki, łatwy w użyciu i wieloplatformowy framework podobny do JUnit / CppUnit / xUnit dla C ++.
źródło
CppUnit jest drogą. Zobacz link poniżej:
http://cppunit.sourceforge.net/cppunit-wiki
http://en.wikipedia.org/wiki/CppUnit
źródło
UnitTest ++ , mały i prosty.
źródło
Obecnie szukam testów jednostkowych i makiet, które mogą być używane w naszej firmie do długoterminowego kodu. Jak wiesz, lista frameworków do testów jednostkowych dla języka c ++ jest długa, więc zastosowałem kilka filtrów, aby zredukować ją do pełnego zestawu, który można dokładniej przyjrzeć. Pierwszym kryterium filtrowania było to, że musi być za darmo. Drugim kryterium była aktywność projektowa. Szukałem również frameworków do mockowania, ponieważ potrzebujesz takiego, jeśli chcesz pisać testy jednostkowe.
Wymyśliłem następującą listę (w przybliżeniu) posortowaną według aktywności, najwyższa aktywność u góry:
GoogleTest / GoogleMock: wielu współpracowników i używane przez samą Google. Prawdopodobnie będzie tu przez jakiś czas i otrzyma aktualizacje. W mojej prywatnej bazie kodów przełączę się na tę kombinację w nadziei, że wskoczę na najszybszy pociąg.
BoostTest + Turtle: Nie aktualizowany tak często, ale framework testowy jest częścią boost, więc powinien być utrzymywany. Z drugiej strony żółw jest utrzymywany głównie przez jednego faceta, ale ma urażoną aktywność, więc nie jest martwy. Zrobiłem prawie całe moje doświadczenie testowe z tą kombinacją, ponieważ korzystaliśmy już z biblioteki boost w mojej poprzedniej pracy i obecnie używam jej do mojego prywatnego kodu.
CppUTest: Zapewnia testowanie i mockowanie . Projekt ten był aktywny od 2008 do 2015 roku i ostatnio był dość aktywny. To odkrycie było trochę zaskakujące, ponieważ wiele projektów o znacznie mniejszej aktywności pojawia się częściej podczas wyszukiwania w Internecie (np. CppUnit, który miał ostatnią aktualizację w 2013 r.). Nie zagłębiałem się w to głębiej, więc nie mogę nic powiedzieć o szczegółach. Edytuj (16.12.2015): Niedawno wypróbowałem to i stwierdziłem, że ten framework jest trochę niezgrabny i "C-stylowy", zwłaszcza gdy używam pozorowanych klas. Wydawało się również, że ma mniejszą różnorodność twierdzeń niż inne ramy. Myślę, że jego główną zaletą jest to, że można go używać z projektami czystego C.
QTest: Biblioteka testowa dostarczana z frameworkiem Qt. Utrzymanie powinno być gwarantowane przez jakiś czas, ale używam go raczej jako biblioteki pomocniczej, ponieważ rejestracja testowa jest bardziej niezgrabna w IMO niż w innych frameworkach. O ile rozumiem, zmusza cię to do posiadania jednego egzaminu testowego na urządzenie testowe. Ale funkcje pomocnicze testów mogą być przydatne podczas testowania kodu Qt-Gui. Nie ma kpiny.
Catch: Niedawno działał, ale został opracowany głównie przez jednego gościa. Zaletą tego frameworka jest alternatywne podejście do ustalania, które pozwala na pisanie kodu wielokrotnego użytku w samym teście. Pozwala również ustawić nazwy testów jako ciągi znaków, co jest miłe, gdy zwykle zapisujesz całe zdania jako nazwy testów. Chciałbym, żeby ten styl został wyrwany i umieszczony w GoogleTest ;-)
Mock Frameworks
Liczba fałszywych frameworków jest znacznie mniejsza niż liczba frameworków testowych, ale oto te, które okazały się ostatnio aktywne.
Hippomock : Aktywny od 2008 r. Teraz, ale tylko z małą intensywnością.
FakeIt : Aktywny od 2013 roku, ale mniej więcej opracowany przez jednego gościa.
Wniosek
Jeśli Twoja baza kodu jest na dłuższą metę, wybierz między BoostTest + Turtle a GoogleTest + GoogleMock . Myślę, że ci dwaj będą mieli długoterminową konserwację. Jeśli masz tylko krótką bazę kodu, możesz wypróbować Catch, który ma ładną składnię. Wtedy musiałbyś dodatkowo wybrać mockujący framework. Jeśli pracujesz z Visual Studio, możesz pobrać adaptery test-runner dla BoostTest i GoogleTest, które pozwolą Ci na uruchamianie testów za pomocą GUI test runner zintegrowanego z VS.
źródło
Zobacz także odpowiedzi na blisko związane pytanie „Wybór narzędzia / struktury do testów jednostkowych C ++” tutaj
źródło
Jest też TUT , Template-Unit-Test, framework oparty na szablonach. Jego składnia jest niezręczna (niektórzy nazywali to nadużyciem szablonu), ale jego główną zaletą jest to, że wszystko jest zawarte w jednym pliku nagłówkowym .
Tutaj znajdziesz przykład testu jednostkowego napisanego w TUT .
źródło
Wypróbowałem CPPunit i nie jest on zbyt przyjazny dla użytkownika.
Jedyną alternatywą, jaką znam, jest użycie C ++ .NET do pakowania klas C ++ i pisania testów jednostkowych za pomocą jednej z platform do testów jednostkowych .NET (NUnit, MBUnit itp.)
źródło
CppUTest to doskonały, lekki framework do testów jednostkowych C i C ++.
źródło
Michael Feathers z ObjectMentor odegrał kluczową rolę w rozwoju zarówno CppUnit, jak i CppUnitLite.
Obecnie zaleca CppUnitLite
źródło
Spójrz na CUnitWin32 . Jest napisany dla MS Visual C. Zawiera przykład.
źródło
Spójrz na cfix ( http://www.cfix-testing.org ), specjalizuje się w programowaniu w Windows C / C ++ i obsługuje testy jednostkowe zarówno w trybie użytkownika, jak i trybie jądra.
źródło
Jeśli korzystasz z programu Visual Studio 2008 z dodatkiem SP1, bardzo polecam używanie MSTest do pisania testów jednostkowych. Następnie używam makiety Google do pisania makiet. Integracja z IDE jest idealna i umożliwia i nie wiąże się z narzutem CPPunit w zakresie edycji trzech miejsc na dodanie jednego testu.
źródło
Myślę, że VisualAssert wykonuje świetną robotę w integracji VS. Umożliwia uruchamianie i debugowanie testów z poziomu VS i nie ma potrzeby tworzenia pliku wykonywalnego w celu uruchomienia testów.
źródło
Sprawdź fruktozę: http://sourceforge.net/projects/fructose/
Jest to bardzo prosta struktura, zawierająca tylko pliki nagłówkowe, a zatem łatwa do przenoszenia.
źródło
Używam testu MS z typemock Isolator ++ . Spróbuj!
źródło