Zaawansowane CPP/Ćwiczenia 4: Testowanie: Różnice pomiędzy wersjami
Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania
Nie podano opisu zmian |
Nie podano opisu zmian |
||
Linia 25: | Linia 25: | ||
Test stosu podzielę na cztery części: pierwsza zawierać będzie test | Test stosu podzielę na cztery części: pierwsza zawierać będzie test | ||
podstawowych funkcji, druga - destruktora, a trzecia i czwarta - | podstawowych funkcji, druga - destruktora, a trzecia i czwarta - | ||
konstruktora kopiującego i operatora przypisania. | konstruktora kopiującego i operatora przypisania. | ||
Test podstawowy zawarty jest w składowej <tt>test_base()</tt> klasy | Test podstawowy zawarty jest w składowej <tt>test_base()</tt> klasy <tt>stack_test</tt> w pliku [http://osilek.mimuw.edu.pl/images/1/1f/Stack_test_cppunit.cpp stack_test_cppunit.cpp]. Polega on na naprzemiennym wkładaniu i | ||
<tt>stack_test</tt> w pliku | |||
zdejmowaniu ze stosu liczb całkowitych i sprawdzaniu poprawności | zdejmowaniu ze stosu liczb całkowitych i sprawdzaniu poprawności | ||
zdejmowanych elementów. Na końcu trzykrotnie wypełniamy i opróżniamy | zdejmowanych elementów. Na końcu trzykrotnie wypełniamy i opróżniamy | ||
Linia 38: | Linia 36: | ||
działają one prawidłowo, co można dość łatwo stwierdzić bez | działają one prawidłowo, co można dość łatwo stwierdzić bez | ||
przeprowadzania testów. W ogólności jednak nie musi tak być. | przeprowadzania testów. W ogólności jednak nie musi tak być. | ||
Przykładem może być implementacj | Przykładem może być implementacj [http://osilek.mimuw.edu.pl/images/0/06/Stack_dyn.h stack_dyn.h]. | ||
Zacznijmy od destruktora. Zadaniem destruktora jest usunięcie pamięci | |||
zajętej przez stos, a objawem błędu w destruktorze jest wyciek pamięci. | |||
Nie znam uniwersalnego sposobu testowania wycieku pamięci. Zwykle | Nie znam uniwersalnego sposobu testowania wycieku pamięci. Zwykle | ||
używam prostej, ale ograniczonej sztuczki. Polega ona na tworzeniu i | używam prostej, ale ograniczonej sztuczki. Polega ona na tworzeniu i | ||
Linia 56: | Linia 53: | ||
Jeśli destruktor nie zwolni pamięci, to w każdej iteracji następował | Jeśli destruktor nie zwolni pamięci, to w każdej iteracji następował | ||
będzie wyciek | będzie wyciek i pamięci w końcu zabraknie. Wtedy kolejne wywołanie | ||
<tt>operator new</tt> rzuci wyjątek. Oczywiście jeśli wyciek będzie mały | |||
np. parę bajtów, to ta metoda go nie wychwyci. | np. parę bajtów, to ta metoda go nie wychwyci. | ||
Linia 65: | Linia 62: | ||
zawartości stosów bez opróżniania ich. Nawet zresztą gdybyśmy mieli | zawartości stosów bez opróżniania ich. Nawet zresztą gdybyśmy mieli | ||
operator porównia, to i tak wymagałby on testowania. W tym celu | operator porównia, to i tak wymagałby on testowania. W tym celu | ||
napisałem funkcję | napisałem funkcję <tt>equal</tt>, która porównuje dwa stosy, opróżniając | ||
je, a następnie | je, a następnie uzupełniając z powrotem. Kod znajduje się w pliku [http://osilek.mimuw.edu.pl/images/1/1f/Stack_test_cppunit.cpp stack_test_cppunit.cpp]. | ||
Częstym | Częstym błędem podaczas kopiowania/przypisywania jest doprowadzenie do | ||
współdzielenia reprezentacji. Musimy więc sprawdzić, czy dwie kopie nie | współdzielenia reprezentacji. Musimy więc sprawdzić, czy dwie kopie nie | ||
tylko są równe ale i niezależne. W tym celu napisałem funkcję | tylko są równe, ale i niezależne. W tym celu napisałem funkcję <tt>inc</tt>, | ||
która zwiększa każdy element stosu liczb całkowitych o jeden. | która zwiększa każdy element stosu liczb całkowitych o jeden. | ||
W przypadku | W przypadku współdzielenia reprezentacji nastąpi zwiększenie obu | ||
stosów i oba stosy dalej będą równe. | stosów i oba stosy dalej będą równe. | ||
Linia 80: | Linia 76: | ||
podobnie jak w przypadku destruktora. | podobnie jak w przypadku destruktora. | ||
Całość kodu znajduje się w pliku | Całość kodu znajduje się w pliku [http://osilek.mimuw.edu.pl/images/1/1f/Stack_test_cppunit.cpp stack_test_cppunit.cpp]. | ||
</div></div> | </div></div> |
Wersja z 21:28, 26 wrz 2006
Ćwiczenie 1
Do przykładu testów max
napisanych w
CppUnit
dodaj testy sprawdzające wersję szukającą maksimum w
tablicy. Wykorzystaj w tym celu dodatkową klasę testującą.
Sprawdź swój test na implementacji max_error.h. Znajdź znajdujące się tam błędy.
Rozwiązanie
Ćwiczenie 2
Zaproponuj i napisz, używając CppUnit
, testy
klasy Stack
. Implementacja tej klasy znajduje się w pliku stack.h. Nie zapomnij o testach kopiowania i
przypisywania oraz destruktora.
Sprawdź czy stos zaimplementowany w pliku stack_dyn.h, przechodzi twoje testy. Jeśli tak, to znajdź błędy w kodzie i tak popraw testy, aby wyłapywały te błędy. Popraw kod tak, aby przeszedł uzupełnione testy.
Rozwiązanie