LABARATORIUM 9 TESTY JEDNOSTKOWE JUNIT 3.8



Podobne dokumenty
Testowanie jednostkowe. Jacek Starzyński, ZETiIS PW

Testowanie jednostkowe

1. Które składowe klasa posiada zawsze, niezależnie od tego czy je zdefiniujemy, czy nie?

TEMAT : KLASY DZIEDZICZENIE

Programowanie zespołowe

Programowanie poprzez testy z wykorzystaniem JUnit

METODY PROGRAMOWANIA

Dziedziczenie. dr Jarosław Skaruz

Obszar statyczny dane dostępne w dowolnym momencie podczas pracy programu (wprowadzone słowem kluczowym static),

Programowanie obiektowe

Kurs programowania. Wykład 2. Wojciech Macyna. 17 marca 2016

Testowanie. Ryszard Beczek & Piotr Miłkowski 1 04/11/07

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

Aplikacje w środowisku Java

Enkapsulacja, dziedziczenie, polimorfizm

Java: kilka brakujących szczegółów i uniwersalna nadklasa Object

Multimedia JAVA. Historia

Dokumentacja do API Javy.

Java Język programowania

Zadanie polega na stworzeniu bazy danych w pamięci zapewniającej efektywny dostęp do danych baza osób.

Testowanie i logowanie. 1. Testowanie aplikacji JUnit. 2. Tworzenie logów: pakiet java.util.logging.

PHP 5 język obiektowy

Programowanie obiektowe - 1.

Wykład 8: klasy cz. 4

Języki i techniki programowania Ćwiczenia 2

Wyjątki Monika Wrzosek (IM UG) Programowanie obiektowe 180 / 196

Aplikacje w środowisku Java

Technologie i usługi internetowe cz. 2

Podstawy Programowania Obiektowego

Instrukcja 10 Laboratorium 13 Testy akceptacyjne z wykorzystaniem narzędzia FitNesse

Materiały do zajęć VII

Java - tablice, konstruktory, dziedziczenie i hermetyzacja

Programowanie współbieżne Wykład 8 Podstawy programowania obiektowego. Iwona Kochaoska

Wykład 6: Dziedziczenie

Programowanie obiektowe Wykład 6. Dariusz Wardowski. dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/14

Programowanie obiektowe

Szablony klas, zastosowanie szablonów w programach

Testy automatyczne. Korzystające z junit

Laboratorium 6 DIAGRAM KLAS (Class Diagram)

Klasy. dr Anna Łazińska, WMiI UŁ Podstawy języka Java 1 / 13

Język C++ Programowanie obiektowe

Testowanie II. Cel zajęć. Pokrycie kodu

Kurs programowania. Wykład 1. Wojciech Macyna. 3 marca 2016

Programowanie obiektowe

JUnit TESTY JEDNOSTKOWE. Waldemar Korłub. Platformy Technologiczne KASK ETI Politechnika Gdańska

Java. język programowania obiektowego. Programowanie w językach wysokiego poziomu. mgr inż. Anna Wawszczak

Wyjątki. Streszczenie Celem wykładu jest omówienie tematyki wyjątków w Javie. Czas wykładu 45 minut.

Obiekt klasy jest definiowany poprzez jej składniki. Składnikami są różne zmienne oraz funkcje. Składniki opisują rzeczywisty stan obiektu.

Zaawansowane programowanie w C++ (PCP)

Pola i metody statyczne. Klasy zawierające pola i metody statyczne

Język programowania Scala / Grzegorz Balcerek. Wyd. 2. Poznań, cop Spis treści

Polimorfizm, metody wirtualne i klasy abstrakcyjne

INŻYNIERIA OROGRAMOWANIA TESTOWANIE JEDNOSTKOWE 2015/2016

Spis treści. 1 Moduł Modbus TCP 4

Platformy Technologiczne

PARADYGMATY PROGRAMOWANIA Wykład 4

Kurs WWW. Paweł Rajba.

Mechanizm dziedziczenia

TESTOWANIE OPROGRAMOWANIA

Zaawansowane programowanie w C++ (PCP)

Laboratorium 03: Podstawowe konstrukcje w języku Java [2h]

UML a kod w C++ i Javie. Przypadki użycia. Diagramy klas. Klasy użytkowników i wykorzystywane funkcje. Związki pomiędzy przypadkami.

Wykład 8: Obsługa Wyjątków

Programowanie II. Lista 3. Modyfikatory dostępu plik TKLientBanku.h

Aplikacje Internetowe. Najprostsza aplikacja. Komponenty Javy. Podstawy języka Java

Konstruktory. Streszczenie Celem wykładu jest zaprezentowanie konstruktorów w Javie, syntaktyki oraz zalet ich stosowania. Czas wykładu 45 minut.

Współbieżność w środowisku Java

Wykład 7: Pakiety i Interfejsy

1 Atrybuty i metody klasowe

Programowanie obiektowe

Dziedziczenie. Ogólna postać dziedziczenia klas:

Dziedziczenie. Tomasz Borzyszkowski

Laboratorium z przedmiotu: Inżynieria Oprogramowania INP002017_ Laboratorium 11 Testy akceptacyjne z wykorzystaniem narzędzia FitNesse

Dziedziczenie jednobazowe, poliformizm

Programowanie obiektowe

Klasy Obiekty Dziedziczenie i zaawansowane cechy Objective-C

Zaawansowane programowanie w C++ (PCP)

Wprowadzenie do projektu QualitySpy

Programowanie 3 - Funkcje, pliki i klasy

Klasy cd. Struktury Interfejsy Wyjątki

Platformy Programistyczne Wykład z Javy dla zaawansowanych

Programowanie w Javie 1 Wykład i Ćwiczenia 3 Programowanie obiektowe w Javie cd. Płock, 16 października 2013 r.

Marcin Luckner Politechnika Warszawska Wydział Matematyki i Nauk Informacyjnych

2. Klasy cz. 2 - Konstruktor kopiujący. Pola tworzone statycznie i dynamicznie - Funkcje zaprzyjaźnione - Składowe statyczne

Informacje ogólne. Karol Trybulec p-programowanie.pl 1. 2 // cialo klasy. class osoba { string imie; string nazwisko; int wiek; int wzrost;

Dziedziczenie. Streszczenie Celem wykładu jest omówienie tematyki dziedziczenia klas. Czas wykładu 45 minut.

Podstawy Języka Java

Programowanie obiektowe

4. Podstawowa konfiguracja

PROE wykład 2 operacje na wskaźnikach. dr inż. Jacek Naruniec

Wykład 2: Podstawy Języka

Język Java część 2 (przykładowa aplikacja)

Informatyka I. Dziedziczenie. Nadpisanie metod. Klasy abstrakcyjne. Wskaźnik this. Metody i pola statyczne. dr inż. Andrzej Czerepicki

Interfejsy. Programowanie obiektowe. Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki Politechniki Wrocławskiej

Programowanie obiektowe

Java podstawy jęyka. Wykład 2. Klasy abstrakcyjne, Interfejsy, Klasy wewnętrzne, Anonimowe klasy wewnętrzne.

Różne właściwości. Różne właściwości. Różne właściwości. C++ - klasy. C++ - klasy C++ - KLASY

Wykład 4: Klasy i Metody

JAVA W SUPER EXPRESOWEJ PIGUŁCE

C++ - dziedziczenie. C++ - dziedziczenie. C++ - dziedziczenie. C++ - dziedziczenie. C++ - dziedziczenie C++ - DZIEDZICZENIE.

Transkrypt:

Inżynieria Oprogramowania 2013/14 LABARATORIUM 9 TESTY JEDNOSTKOWE JUNIT 3.8 Hierarchia klas: TestCase klasa testująca, będąca klasą bazową dla wszystkich przypadków testowych. Zawiera przypadki testowe zapisane w postaci metod (przypadek testowy to pojedyncza metoda, nie klasa. Udostępnia domyślne asercje. Razem z TestSuite stanowi implementację interfejsu Test. Możliwe jest tworzenie zestawów testów (suite) i uruchamianie ich w identyczny sposób jak pojedynczej klasy TestCase, struktura drzewiasta, którą tworzą pozwala na jednorodne zarządzanie testami (wzorzec Composite) TestResult jest klasą przechowującą wyniki wykonanych przypadków Testowych, tworzoną i wypełnianą danymi przez wykonywane klasy TestCase.

Struktura klasy testującej: Konstruktor przyjmuje parametr będący nazwą przypadku testowego (podawany opcjonalnie); Metoda setup() (dziedziczona po klasie TestCase) odpowiada za inicjację każdego przypadku testowego. Wykonywana jest przed każdym przypadkiem testowym. Tworzy obiekt testowany oraz obiekty niezbędne do jego uruchomienia. Przypadki testowe są implementowane w pojedynczych metodach klasy testującej (zgodność z konwencją JUnit 3.x: brak przyjmowanych parametrów i zwracanych wartości, nazwa z przedrostkiem 'test, w przeciwnym razie nie będą rozpoznawane jako przypadki testowe). Metoda teardown(), kończąca wykonanie każdego przypadku testowego (przywrócenie stanu sprzed wykonania testu) jest komplementarna do metody setup(). Służy zwalnianiu zasobów zaalokowanych przez przypadek testowy (rozłączenie połączenia sieciowego lub do bazy) Przykład: Klasa testująca dla klasy RomanNumber, reprezentującej liczby rzymskie. W klasie RomanNumberTest znajduje się pole przechowujące referencję do obiektu testowanego, które jest inicjowane w metodzie setup(). Przypadek testowy o nazwie testfive()sprawdza, czy konwersja liczby arabskiej 5 na rzymską V jest dokonywana właściwie, niezgodność jest raportowana przez wyjątek. Metoda teardown() została zaimplementowana jedynie dla przejrzystości, gdyż usunięcie obiektu testowanego jest realizowane mechanizm garbage collector.

Asercje w klasie TestCase: Asercje są to metody pomocnicze służące ocenie poprawności działania oprogramowania poprzez sprawdzenie czy spełniony został zadany warunek. Dla wielu typów danych w Javie są to metody przeciążone, co pozwala lepiej odzwierciedlać różnice między porównywanymi danymi. Istnieje wersja każdej metody przyjmująca jako pierwszy parametr komunikat wyświetlany dla nieprawdziwej wartości asercji. asercje porównań (AssertEquals) za pomocą tej asercji można zweryfikować dowolny obiekt poprzez sprawdzenie czy wartości przekazane jako parametry są równe. W przypadku typów prymitywnych porównanie jest wykonywane za pomocą operatora ==, natomiast dla typów obiektowych wywoływana jest metoda equals() odpowiednich klas. W szczególności asercja ta może porównywać zawartość ciągów znakowych. Ma również wersję o sygnaturach odpowiednich dla wszystkich typów podstawowych boolean, int, short oraz object. W przypadku tablic typów podstawowych porównywane są referencje tablic, a nie ich zawartość: assertequals([string message], expected, actual) Przykład: assertequals( Wynikiem powinno być 3 1/3, 3.33, 10.0/3.0, 0.01); asercje referencji null o assertnull umożliwia sprawdzenie, czy obiekt jest równy null, czy podana referencja wskazuje na obiekt. assertnull([string message], object) o assertnotnull umożliwia sprawdzenie, czy obiekt jest różny od null. assertnotnull([string message], object)

asercje tożsamości o assertsame sprawdza czy expected i actual reprezentują ten sam obiekt, we wszystkich przypadkach stosuje operator ==. assertsame([string message], expected, actual) o assertnotsame sprawdza czy expected i actual reprezentują różne obiekty, we wszystkich przypadkach stosuje operator ==. assertnotsame([string message], expected, actual) asercje logiczne o asserttrue sprawdza, czy podany warunek logiczny jest prawdziwy. asserttrue([string message], boolean condition) o assertfalse sprawdza, czy podany warunek logiczny jest nieprawdziwy. assertfalse([string message], boolean condition) bezwarunkowe niepowodzenie o fail skutkuje natychmiastowym negatywnym zakończeniem testu i (opcjonalnym) komunikatem message. Stosowany w celu zaznaczenia sekcji kodu, których osiągnięcie jest niepożądane (obsługa wyjątku). fail([string message]) Tworzenie obiektu testowanego: Nie powinno się odbywać w konstruktorze TestCase (w przypadku wystąpienia wyjątku zostanie on mylnie zinterpretowany przez środowisko JUnit (brak informacji wskazującej na przyczynę błędu)! o Konstruktor klasy testującej powinien zostać niemal całkowicie pominięty (każdy wyjątek zgłoszony w konstruktorze przerywa proces tworzenia obiektu.

Właściwym miejscem tworzenia obiektu testującego jest metoda testująca setup: Po przechwyceniu wyjątek zostanie poprawnie wyświetlony z kompletną informacją o przyczynie błędu: Przypadki testowe Kolejność wykonania przypadków testowych jest dowolna, gdyż są z założenia wzajemnie niezależne (każdy przypadek testowy poprzedzony jest metodą setup(), a po nim wywoływana jest metoda teardown()).kolejność przypadków w pliku nie ma żadnego znaczenia dla środowiska JUnit. Ustalenie kolejności przypadków testowych przez zastosowanie metody statycznej suite() (uruchomienie przypadków testowych przez środowisko JUnit). Kolekcja przypadków testowych przechowywana jest w obiekcie klasy TestSuite w sposób uporządkowany (wykonywanych w określonej kolejności). Metoda suite() tworzona w klasie testującej definiuje kolejność przypadków testowych w suicie ( w tym kolejność ich wykonania).

Testy nie powinny być zależne od zasobów zewnętrznych (dane do testowania w pliku zewnętrznym), gdyż mogą one nie istnieć (konsekwencja pracy nad jednym projektem przez kilku programistów). Niepowodzenie odczytu może mylnie wskazywać na błąd przypadku testowego. Częstą praktyką jest umieszczenie danych bezpośrednio w klasie testującej (pole lub oddzielna klasa wewnętrzna) wymagana jest ponowna kompilacja programu przy zmianie danych, dane testowe są zawsze dostępne. Plik z danymi można także dołączyć do pliku JAR z klasami, a odczytać go korzystając z class loader, pomijając system plików: adresowanie plików wewnątrz pliku JAR bez znajomości jego położenia. Testy nie powinny zależeć od kontekstu i konfiguracji środowiska, jak format prezentacji czasu i daty, bieżąca godzina lub strefa czasowa (fałszywe komunikaty błędów). Testy należy wykonywać względem bieżącej konfiguracji komputera, nie zaś stałych ustawień w treści przypadku testowego.

Testowanie wyjątków Przypadek testowy sprawdza, czy w odpowiedzi na konkretne wywołanie metody w obiekcie testowanym zostanie zgłoszony wyjątek (brak wyjątku jest błędem). umieszczenie tej metody wewnątrz właściwie skonfigurowanej klauzuli try..catch. Wewnątrz klauzuli try wywoływana jest metoda, która powinna zgłosić wyjątek, a zaraz po niej metoda fail(). W klauzuli catch przechwytywany jest wyjątek zgłaszany przez testowaną metodę, a następnie jest on ignorowany. W ten sposób, jeżeli wyjątek się pojawi, wówczas zamiast metody fail() wykonana zostanie klauzula catch, która zignoruje wyjątek. Natomiast jego brak spowoduje zgłoszenie błędu za pomocą metody fail(). użycie specjalnej klasy ExceptionTestCase. Konstruktor tej klasy przyjmuje dwa argumenty: nazwę przypadku testowego oraz klasę wyjątku, który należy przechwycić. Testowanie liczb zmiennoprzecinkowych Wiele liczb zmiennoprzecinkowych jest reprezentowanych niedokładnie, stąd tez asercje tego typu są przeciążone (dodatkowy parametr oznaczający największą dopuszczalną różnicę pomiędzy wartością oczekiwaną a uzyskaną). Asercja zamiast porównywać wartości sprawdza, czy są one wystarczająco bliskie siebie. Parametr ten powinien przyjmować małe wartości.

Struktura katalogów z testami (rozdzielenie testów od kodu) Każdej klasie produkcyjnej odpowiada klasa testująca, obie powinny znajdować się w tych samych pakietach (dostęp do składowych o pakietowym zakresie widoczności package private), nie jest to jednak optymalne rozwiązanie. Stosuje się więc dwie równoległe struktury pakietów: dla klas produkcyjnych i testujących. Testowanie metod niepublicznych 1. Należy testować jedynie metody publiczne; tylko one wchodzą w oddziaływanie z innymi obiektami. 2. Należy testować wszystkie klasy nietrywialne bez względu na ich zakres widoczności. Testowanie klas prywatnych i chronionych umożliwia w Javie mechanizm JavaReflection (zmiana poziomu dostępu do pola lub metody przez JunitX - dodatek do JUnit, klasa PrivateAccessor)

Wady JUnit 3.8 sztywne konwencje nazewnicze przypadków testowych, konieczność dziedziczenia po klasie TestCase (dodatkowa zależność), często niewystarczająca kontrola kolejności wykonywania przypadków testowych jedna metoda inicjująca i jedna finalizująca dla wszystkich przypadków testowych (duplikacja kodu w złożonych przypadkach) brak dodatkowych funkcji obsługi limitów czasowych (wbudowanej obsługi testowania wyjątków, braku mechanizmu konfiguracji przypadków testowych, poza niektórymi rozszerzeniami proponowanymi przez niezależnych autorów)