2009-01-19 16 views
32

Kilka dni temu zacząłem analizować strukturę testów jednostkowych o nazwie check, i zamierzam uruchomić test na kodzie c pod Linuksem.Czy przeprowadzanie testu jednostki z Valgrindem jest przesadą?

Teraz sprawdź, a niektóre dobrze zaprojektowane kod, a niektóre kodu testu może mi pomóc zweryfikować że podstawowa funkcjonalność jest poprawna, Znaczy to jest dość łatwe do wystarczy spojrzeć na zmiennych oraz odpowiedź z powrotem, a następnie zdecydować, czy funkcja jest prawidłowa, czy nie.

Ale powiedzmy, że chcę przetestować dynamiczną strukturę pamięci z dużo wolnego od malloc i wolnego, i okazuje się, że mogę wprowadzić dane i odzyskać poprawne dane. Ale to nie dowodzi, że nie złamałem pamięci podczas procesu, załóżmy, że zapomniałem zwolnić połowę pamięci i straciłem wskaźniki (klasyczny memelak). Ten kod prawdopodobnie przejdzie większość testów jednostkowych.

Tak więc na pytanie: jest to dobry pomysł, aby uruchomić cały kod testowy jednostki, np. Valgrind i pozwolić mu wykryć problemy malloc/free? (Albo coś podobnego w kompilacji Electric Fence?)

Czuje się dobrym pomysłem, ale nie jestem pewien, co dostaję się do tutaj .....

Dzięki Johan


Aktualizacja: Dzięki Douglas i Jonathan, wydaje się, że jest to dobry pomysł i coś powinienem kontynuować :-)

Aktualizacja: Valgrind to fajne narzędzie, jednak pierwsze memleaksy, które znalazłem robiąc to , były w strukturze testowej, a nie w moim własnym kodzie (całkiem zabawne). Tak więc wskazówką dla reszty jest sprawdzenie, czy struktura testowa urządzenia, której używasz, nie przecieka, zanim odwrócisz własny kod do góry nogami. W moim przypadku potrzebna była tylko pusta walizka testowa, od tego czasu działa tylko framework testów jednostkowych.

Odpowiedz

51

Z pewnością tak jest - znacznie łatwiej jest uruchomić valgrind przeciwko testom jednostkowym niż przy pełnym programie.

Również wszelkie błędy pamięci są zlokalizowane w obszarze kodu testowanego urządzenia, co ułatwia jego naprawę.

Ponadto sprawdzanie, czy zostało to naprawione jest łatwiejsze - ponieważ test jednostkowy jest wykonywany, nie jest to bardziej skomplikowany test w stosunku do pełnego programu.

Jeśli używasz valgrind w sposób zautomatyzowany prawdopodobnie chcesz --error-exitcode=<number> [default: 0]

Określa alternatywny kod wyjścia do powrotu jeśli Valgrind odnotowano żadnych błędy w biegu. Po ustawieniu na domyślną wartość (zero), wartość zwracana z Valgrind zawsze będzie wartością zwracaną z procesu o wartości . Po ustawieniu wartości niezerowej wartość ta jest zwracana zamiast tego, , jeśli Valgrind wykryje jakiekolwiek błędy.Ten jest przydatny do korzystania z Valgrind jako część z automatycznego zestawu testów, ponieważ to ułatwia wykrywanie przypadków testowych dla , które Valgrind zgłosiło błędy, tylko poprzez sprawdzenie kodów powrotnych.

http://valgrind.org/docs/manual/manual-core.html#manual-core.erropts

+0

Istnieją również '--xml = yes' i' --xml-file = ', które ułatwiają automatyzację czytania wyników. –

10

Jak powiedział Douglas Leeder, to warto wyświetlanie testów jednostkowych z oprogramowaniem diagnostycznym, które można położyć ręce, które zapewnią, że to naprawdę działa zgodnie z oczekiwaniami. Nie obejmuje to nadużywania pamięci, więc używanie valgrind jest dobrym pomysłem.

Naprawdę chcesz przeprowadzić testy jednostkowe, aby udowodnić, że Twój kod działa.

Nie musisz ich uruchamiać w trybie valgrind przez cały czas - ale powinno to być tak banalnie proste jak to możliwe, i powinieneś to robić okresowo (powiedz po dużych zmianach).

Powiązane problemy