Zaawansowane CPP/Ćwiczenia 4: Testowanie: Różnice pomiędzy wersjami

Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania
Mirek (dyskusja | edycje)
Nie podano opisu zmian
Mirek (dyskusja | edycje)
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
{mod09/exercises/stack_test_cppunit.cpp}<tt>stacktestcppunit.cpp</tt>.  Polega on na naprzemiennym wkładaniu i
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 {stac_dyn.h}.   
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łedu w destruktorze jest wyciek pamięci.


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, i pamięci w końcu zabraknie. Wtedy kolejne wywołanie
będzie wyciek i pamięci w końcu zabraknie. Wtedy kolejne wywołanie
{operator new} rzuci wyjątek. Oczywiście jeśli wyciek będzie mały  
<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ę {equal} która porównuje dwa stosy, opróżniając
napisałem funkcję <tt>equal</tt>, która porównuje dwa stosy, opróżniając
je, a następnie uzupęłniając z powrotem. Kod znajduję się w pliku
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].  
{mod09/exercises/stack_test_cppunit.cpp}<tt>stacktestcppunit.cpp</tt>.  


Częstym błedem podaczas kopiowania/przypisywania jest doprowadzenie do
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ę {inc}
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 wspołdzielenia reprezentacji nastąpi zwiększenie obu
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].
{mod09/exercises/stack_test_cppunit.cpp}<tt>stacktestcppunit.cpp</tt>.
 
</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