2008-09-18 11 views
35

Mocno wierzę w stosowanie testów jednostkowych w ramach budowania dużych aplikacji wieloplatformowych. Obecnie planujemy przeprowadzenie testów jednostkowych w ramach oddzielnego projektu. Ma to tę zaletę, że utrzymuje czystość kodu źródłowego. Myślę jednak, że oddzieliłoby to kod testowy od implementacji jednostki. Co sądzisz o tym podejściu i czy są jakieś narzędzia, takie jak JUnit dla aplikacji C++?W jaki sposób wdrażasz testowanie jednostkowe w dużych projektach C++?

+0

Istnieje bardzo podobne pytanie, które właśnie zadano. Spójrz na [CppUnit] (http://cppunit.sourceforge.net), [CppUnitLite] (http://www.objectmentor.com/resources/downloads.html) i "[działa efektywnie ze starszym kodem"] (http: // /www.amazon.co.uk/Working-Effectively-Legacy-Robert-Martin/dp/0131177052) "(wszystko przez Michaela Feathersa –

Odpowiedz

15

Istnieje wiele frameforks jednostka testowa dla C++. CppUnit z pewnością nie jest tym, który wybrałbym (przynajmniej w wersji stabilnej 1.x, ponieważ brakuje wielu testów i wymaga wielu zbędnych linii kodów). Do tej pory moją preferowaną strukturą jest CxxTest i planuję kiedyś przeprowadzić ocenę Fructose.

jakikolwiek sposób, istnieje kilka "papiery", które oceniają ram C++ TU

+0

W przeciwieństwie do JUnit i lepiej pasuje do C++: [CATCH] (https://github.com/philsquared/Catch) . –

11

To rozsądne podejście.

miałem bardzo dobre wyniki zarówno z UnitTest++ i Boost.Test

Szukałem na CppUnit, ale dla mnie, to czułem się bardziej jak w tłumaczeniu rzeczy JUnit niż coś mającego na C++.

Aktualizacja: W dzisiejszych czasach wolę używać Catch. Okazało się, że jest skuteczny i prosty w użyciu.

+3

[doctest] (https://github.com/onqtam/doctest) jest moją reimplementacją Złap z ogromnym naciskiem na szybkość kompilacji - sprawdź [FAQ] (https://github.com/onqtam/doctest/blob/master/doc/markdown/faq.md#how-is-doctest-different-crom-catch), aby zobaczyć, w jakim względzie są one różne – onqtam

1

CppUnit jest bezpośrednim odpowiednikiem JUnit dla aplikacji C++ http://cppunit.sourceforge.net/cppunit-wiki

Osobiście stworzył testy jednostkowe w innym projekcie i stworzył oddzielną konfigurację build który zbudowany wszystkie testy jednostkowe i kod źródłowy zależnej. W niektórych przypadkach chciałem przetestować prywatne funkcje członkowskie klasy, dlatego stworzyłem klasę Test jako klasę przyjaciela do testowanego obiektu, ale ukryłem deklaracje przyjaciela podczas budowania konfiguracji "beztestowych" za pomocą deklaracji preprocesorów.

Skończyłem robić te gimnastyki kodowania, ponieważ byłem integrowania testów do kodu starszego jednak. Jeśli zaczynasz w celu testowania jednostkowego, lepszy projekt może być prosty.

1

Można utworzyć projekt testu jednostkowego dla każdej biblioteki w drzewie źródłowym w podkatalogu tej biblioteki. Kończy się to aplikacją sterownika testowego dla każdej biblioteki, co ułatwia uruchomienie pojedynczego zestawu testów. Umieszczając je w podkatalogu, utrzymuje bazę kodu w czystości, ale także utrzymuje testy blisko kodu.

Skrypty można łatwo napisać, aby uruchomić wszystkie zestawy testów w drzewie źródłowym i zebrać wyniki.

Używam niestandardowej wersji oryginalnego CppUnit od lat z wielkim sukcesem, ale są teraz inne alternatywy. GoogleTest wygląda interesująco.

1

Wydaje mi się, że jesteś na właściwej drodze dzięki testom jednostkowym i świetnemu planowi poprawy niezawodności produktu.

Chociaż testowanie jednostek nie rozwiąże wszystkich problemów podczas konwersji aplikacji na różne platformy lub nawet różne systemy operacyjne. Powodem tego jest testowanie jednostki procesowej w celu wykrycia błędów w aplikacji. Po prostu wyrzuca tyle wejść, ile można sobie wyobrazić w systemie i czeka na wynik na drugim końcu. To tak, jakby małpa ciągle naciskała na klawiaturę i obserwowała wyniki (beta testerzy).

Aby przejść do następnego etapu, przy dobrych testach jednostkowych należy skupić się na wewnętrznym projekcie aplikacji. Najlepszym podejściem, jakie znalazłem, było wykorzystanie wzorca projektowego lub procesu projektowania zwanego "programowaniem umowy" lub "Projektowaniem według umowy". Druga książka, która jest bardzo pomocna w budowaniu niezawodności w twoim głównym projekcie.

Debugowanie procesu rozwoju: praktyczne strategie dotyczące koncentrowania się, trafiania na daty statków i budowania stałych zespołów.

W naszym zespole programistów bardzo uważnie przyjrzeliśmy się temu, co uważamy za błąd programisty, błąd programisty, błąd projektowy i sposób, w jaki możemy używać testów jednostkowych, a także budować niezawodność w naszym pakiecie oprogramowania za pośrednictwem DBC i postępować zgodnie z zaleceniami debugowania procesu rozwoju.

1

CxxTest jest również wart obejrzenia dla lekkiej, łatwej w użyciu platformy JUnit/CppUnit/xUnit-like dla platformy C++. Uważamy, że jest bardzo proste dodawanie i opracowania testów

Aeryn jest kolejnym ramowa C++ Testowanie warto przyjrzeć

2

używam unittest ++. Testy są w osobnym projekcie, ale rzeczywiste testy są powiązane z rzeczywistym kodem. Istnieją w folderze pod testowaną sekcją. tj:
myproject \ src \ < - źródło rzeczywistej aplikacji
myproject \ src \ testuje < - źródło testów
Jeśli masz zagnieżdżone foldery (a kto nie), to oni też będą mieli własny podkatalog testów.

+0

Robimy to samo, a nasz system budowy automatycznie buduje test EXE pochodzi z kodu znalezionego pod dowolnym folderem źródłowym Unittest. –

3

Powinieneś oddzielić swój kod bazowy od wspólnej biblioteki (dynamicznej), a następnie napisać większą część testów jednostkowych dla tej biblioteki.

Dwa lata temu (2008) brałem udział w dużym projekcie LSB Infrastructure wdrażanym przez The Linux Foundation. Jednym z celów tego projektu było napisanie testów jednostkowych dla 40 000 funkcji z podstawowych bibliotek Linux. W ramach tego projektu stworzyliśmy AZOV technology i podstawowe narzędzie o nazwie API Sanity Autotest w celu automatycznego wygenerowania wszystkich testów. Możesz spróbować użyć tego narzędzia do wygenerowania testów jednostkowych dla twojej podstawowej biblioteki.

Powiązane problemy