Testowanie jednostkowe
|
|
- Ewa Olejnik
- 9 lat temu
- Przeglądów:
Transkrypt
1 Testowanie jednostkowe Prowadzący: Bartosz Walter Testowanie jednostkowe 1
2 Agenda Testowanie jednostkowe Biblioteka JUnit 3.8 Biblioteka JUnit 4.0 Biblioteka TestNG Obiekty zastępcze Testowanie jednostkowe (2) Podczas wykładu zostaną zaprezentowane następujące zagadnienia przypomniane będą idea i zasady związane z testowaniem jednostkowym przedstawiona zostanie klasyczna biblioteka JUnit 3.8, która zapoczątkowała wzrost znaczenia testowania jednostkowego w inŝynierii oprogramowania zaprezentowane będą dwie biblioteki nowej generacji (JUnit 4.0 i TestNG), oparte na moŝliwościach oferowanych przez języka Java 5.0 wprowadzone będzie pojęcie obiektu zastępczego (imitacji) Testowanie jednostkowe 2
3 Agenda Testowanie jednostkowe Biblioteka JUnit 3.8 Biblioteka JUnit 4.0 Biblioteka TestNG Obiekty zastępcze Testowanie jednostkowe (3) Pierwszą częścią jest przypomnienie zadań stawianych testowaniu jednostkowemu. Testowanie jednostkowe 3
4 Podstawowe pojęcia Cel: weryfikacja oczekiwanego zachowania obiektu z faktycznym Obiekt testowany: wyizolowana instancja klasy, która podlega testom Przypadek testowy: weryfikacja jednego zachowania jednej metody Klasa testująca: klasa z przypadkami testowymi dotyczącymi jednego obiektu testowanego. Testowanie jednostkowe (4) Testowanie jednostkowe jest jedną z technik weryfikacji poprawności działania programu. Dotyczy jednak bardzo niskiego poziomu pojedynczej klasy i metody. Celem jego jest sprawdzenie, czy rzeczywisty efekt działania metody wywołanej w określonym kontekście i z określonymi parametrami jest taki, jak oczekiwano. Nazwa 'testowanie jednostkowe' wywodzi się z faktu, Ŝe obiektem testowanym jest pojedyncza, wyizolowana ze środowiska instancja klasy. Zatem nie jest uruchamiany cały tworzony system, ale właśnie pojedynczy obiekt. Przypadkiem testowym w testowaniu jednostkowym jest sprawdzenie, czy metoda w określonych warunkach zachowuje się poprawnie. Zatem dla kaŝdej metody o nietrywialnym zachowaniu (zwykle będzie to metoda publiczna) istnieje jeden lub więcej przypadków testowych, po jednym dla kaŝdego rodzaju zachowania testowanej metody. Przypadki testowe dotyczące jednego obiektu testowanego są zebrane wewnątrz jednej klasy testującej. W ten sposób jednej klasie testowanej odpowiada jedna klasa testująca. Testowanie jednostkowe 4
5 Agenda Testowanie jednostkowe Biblioteka JUnit 3.8 Biblioteka JUnit 4.0 Biblioteka TestNG Obiekty zastępcze Testowanie jednostkowe (5) Ilustracją tych zasad jest opis biblioteki JUnit 3.8, która w znacznym stopniu przyczyniła się do wzrostu popularności testowania jednostkowego. Testowanie jednostkowe 5
6 Hierarchia klas w JUnit 3.8 Test TestResult TestCase TestSuite MojTest junit.framework.* Testowanie jednostkowe (6) W skład biblioteki JUnit 3.8 wchodzi kilkadziesiąt klas, jednak kilka z nich ma znaczenie podstawowe. Klasą bazową dla wszystkich przypadków testowych jest TestCase, z uwagi na nieco nieszczęśliwą nazwę często mylony z przypadkiem testowym (tymczasem TestCase jest klasą testującą, która zawiera przypadki testowe zapisane w postaci metod; dlatego przypadek testowy to pojedyncza metoda, a nie klasa). Klasa ta udostępnia podstawowe funkcje pomocne w testowaniu, m.in. domyślne asercje. TestCase jest wraz z TestSuite implementacją interfejsu Test. Razem klasy te tworzą strukturę drzewiastą, w której wszystkie węzły poza liśćmi drzewa są reprezentowane przez TestSuite, a liście przez klasę TestCase. Jest to w rzeczywistości implementacja wzorca projektowego Composite, który pozwala zarządzać całą strukturą w sposób jednorodny. Dzięki temu moŝliwe jest tworzenie suit (zestawów testów) i uruchamianie ich w identyczny sposób jak pojedyncze klasy TestCase. TestResult jest klasą przechowującą wyniki wykonanych przypadków testowych. Jest ona tworzona i wypełniana danymi przez kolejne klasy TestCase, które są wykonywane. Jest to takŝe implementacja wzorca o nazwie Collecting Parameter Testowanie jednostkowe 6
7 Struktura klasy testującej utwórz RomanNumberTest(nazwa) void setup() Klasa RomanNumber wykonaj void testone() void testfive() void testnineteen() void testthousand() usuń void teardown() Testowanie jednostkowe (7) Klasa testująca w JUnit 3.x ma określoną strukturę: konstruktor przyjmuje parametr będący nazwą przypadku testowego; zwykle nie ma on Ŝadnego znaczenia i moŝna go pominąć. metoda setup() słuŝy do inicjacji kaŝdego przypadku testowego; jest wykonywana przed kaŝdym z nich i zwykle słuŝy do stworzenia obiektu testowanego i innych obiektów wymaganych do uruchomienia go. Metoda ta jest dziedziczona po klasie TestCase przypadki testowe są implementowane w pojedynczych metod zawartych w klasie testującej. Muszą one spełniać konwencję przyjętą w JUnit 3.x: nie przyjmować parametrów, nie zwracać wartości oraz mieć nazwę zaczynającą się od przedrostka 'test' (inne metody nie są rozpoznawane jako przypadki testowe). Wykonanie kaŝdego przypadku testowego jest poprzedzone wywołaniem metody setup() i zakończone wywołaniem metody teardown() metoda teardown() jest komplementarna w stosunku do metody setup(), tzn. słuŝy do przywrócenia stanu sprzed wykonania testu. JeŜeli setup() jedynie tworzyła obiekty, wówczas implementacja teardown() jest zbędna; ma ona znaczenie tylko jeŝeli przypadek testowy zaalokował zasób, który powinien być zwolniony np. połączenie sieciowe lub do bazy danych etc. Wówczas metoda ta powinna ten zasób zwolnić Testowanie jednostkowe 7
8 Klasa testująca w JUnit 3.x dziedziczenie po klasie TestCase metoda inicjująca setup() przypadek testowy nazwa zaczyna się od słowa test metoda finalizująca teardown() public class RomanNumberTest extends TestCase{ RomanNumber rn1 = null; public void setup() { rn = new RomanNumber(5); public void testfive() throws Exception { String str = rn.tostring(); assertequals(str, "V"); public void teardown() { rn = null; Testowanie jednostkowe (8) PowyŜej przedstawiono klasę testującą 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. Jakakolwiek niezgodność jest raportowana przez wyjątek. Metoda teardown() została zaimplementowana jedynie dla porządku, poniewaŝ jej zadanie usunięcie obiektu testowanego i tak wykona mechanizm garbage collector. Testowanie jednostkowe 8
9 Dostępne asercje w klasie TestCase asercje porównań assertequals([komunikat], oczekiwany, faktyczny) asercje toŝsamości assertsame([komunikat], oczekiwany, faktyczny) assertnotsame([komunikat], oczekiwany, faktyczny) asercje referencji null assertnull([komunikat], referencja) assertnotnull([komunikat], referencja) asercje logiczne asserttrue([komunikat], warunek) assertfalse([komunikat], warunek) bezwarunkowe niepowodzenie fail([komunikat]) Testowanie jednostkowe (9) Klasa TestCase posiada kilka domyślnych asercji, pozwalających łatwo weryfikować relacje pomiędzy wartością oczekiwaną a wartością rzeczywistą, obliczoną przez metodę w obiekcie testowanym. Asercje są metodami przeciąŝonymi dla wielu typów danych języka Java, tak aby moŝliwie najczytelniej prezentować róŝnice między porównywanymi wartościami. Ponadto kaŝda z metod ma wersję przyjmującą jako pierwszy parametr komunikat wyświetlany w momencie, gdy asercja okaŝe się nieprawdziwa. assertequals() sprawdza, 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() assertsame() (i analogiczna assertnotsame()) sprawdza identyczność obu parametrów, czyli we wszystkich przypadkach stosuje operator == assertnull() i assertnotnull() sprawdzają, czy podana referencja wskazuje na obiekt, czy teŝ nie asserttrue() i assertfalse() badają prawdziwość podanych warunków fail() jest bezwarunkowym zgłoszeniem nieprawdziwości asercji. Metoda ta przydaje się w szczególnych sytuacjach, gdy określona gałąź sterowania nigdy nie powinna być wykonana Testowanie jednostkowe 9
10 Tworzenie obiektu testowanego Nie naleŝy tworzyć obiektu testowanego w konstruktorze public class RomanNumberTest extends TestCase { private RomanNumber rn = null; public RomanNumberTest (String testname) { super (testname); rn = new RomanNumber(-1); zgłoszenie wyjątku powoduje, Ŝe obiekt rn nie zostanie utworzony Testowanie jednostkowe (10) Bardzo waŝną zasadą dotyczącą tworzenia testów jednostkowych jest niemal całkowite pominięcie konstruktora klasy testującej. Konstruktor jest elementem języka Java i zgodnie ze specyfikacją, jakikolwiek wyjątek zgłoszony w konstruktorze przerywa proces tworzenia obiektu. Aby uniknąć sytuacji, w której niemoŝność utworzenia np. obiektu testowanego spowoduje błąd konstrukcji obiektu klasy testującej, nie wolno umieszczać takiego kodu w konstruktorze. Błąd wynikający z tego zostanie przechwycony przez środowisko uruchomieniowe JUnit, ale przedstawiony on będzie w sposób niepełny i mylący, bez informacji wskazujących na przyczynę błędu. Testowanie jednostkowe 10
11 Tworzenie obiektu testowanego Obiekt testowany jest tworzony w metodzie inicjującej public class RomanNumberTest extends TestCase { private RomanNumber rn = null; public void setup() { rn = new RomanNumber(-1); zgłoszenie wyjątku powoduje prawidłową obsługę błędu java.lang.illegalstateexception: Ujemna liczba! at pl.put.romannumbertest.setup(romannumbertest.java:8) at junit.framework.testcase.runbare(testcase.java:127) at junit.framework.testresult$1.protect( TestResult.java:100)... Testowanie jednostkowe (11) Dlatego rolę logicznego konstruktora pełni w przypadku obiektów klas TestCase metoda setup(), i to ona jest prawidłowym miejscem tworzenia instancji obiektu testowanego. W identycznej sytuacji, jaką przedstawiono na poprzednim slajdzie, wyjątek zostanie przechwycony i zaprezentowany we właściwy sposób, z pełną informacją o przyczynie błędu i śladzie wyjątku. Testowanie jednostkowe 11
12 Kolejność wykonania przypadków testowych Przypadki testowe są wykonywane w dowolnej kolejności Przypadki testowe nie mogą mieć efektów ubocznych public class RomanNumberTest extends TestCase { public RomanNumberTest(String testname) { super (testname); nie moŝna zapewnić takiej kolejności public void testnajpierw () { public void testpotem () { Testowanie jednostkowe (12) Jednym z załoŝeń testowania jednostkowego jest niezaleŝność poszczególnych przypadków testowych. Jednak ze względów praktycznych często jest konieczne uporządkowanie ich wg pewnej kolejności, co pozwoli wykorzystać efekty wykonania poprzedników w przypadkach testowych po nich następujących. Najprostszym przykładem jest uŝycie bazy danych: jeŝeli kaŝdy przypadek testowy wypełniałby bazę zestawem tych samych (lub niemal tych samych) danych, a następnie usuwał je (za pomocą metody teardown()), wówczas wykonanie zbioru testów trwałoby bardzo długo. NaleŜy jednak pamiętać, Ŝe JUnit został stworzony z załoŝeniem o niezaleŝności przypadków testowych: kaŝdy z nich jest poprzedzony metodą setup() a po nim jest wywoływana metoda teardown(). Dlatego zakładanie określonej kolejności ich wykonania moŝe okazać się fałszywe. Kolejność metod w pliku nie ma Ŝadnego znaczenia dla środowiska uruchomieniowego JUnit, więc poleganie na niej moŝe prowadzić do błędnych wyników wykonania testów. Testowanie jednostkowe 12
13 Kolejność wykonania przypadków testowych Kolejnością wykonania moŝna sterować poprzez metodę suite() public class RomanNumberTest extends TestCase { public void testnajpierw() { public void testpotem() { public static Test suite() { TestSuite suite = new TestSuite(); suite.addtest(new RomanNumberTest("testNajpierw")); suite.addtest(new RomanNumberTest("testPotem")); return suite; przypadki testowe są wykonywane w kolejności określonej w metodzie suite() Testowanie jednostkowe (13) Zdarzają się jednak sytuacje, w których uporządkowanie przypadków testowych jest konieczne (a czasami tak jest JUnit 3.x posiada kilka braków funkcjonalnych, które zostaną omówione nieco później), nawet za cenę naruszenia zasady ich niezaleŝności od siebie. Wówczas z pomocą moŝe przyjść znajomość wewnętrznej konstrukcji obiektów TestSuite, reprezentujących suity (zestawy testów). Przechowują one uporządkowaną kolekcję przypadków testowych, które są wykonywane w tej właśnie kolejności. Wystarczy zatem stworzyć w klasie testującej metodę statyczną suite(), wykorzystywaną przez środowisko uruchomieniowe JUnit do uruchomienia przypadków testowych, która zdefiniuje kolejność przypadków testowych w suicie. Zostaną one wykonane w takiej właśnie kolejności. Testowanie jednostkowe 13
14 ZaleŜności zewnętrzne testów Testy nie powinny zaleŝeć od zewnętrznych zasobów public class SomeTestCase extends TestCase { public void setup () { InputStream input = new FileInputStream ("C:/DaneTestowe/dane.dat"); //.. zewnętrzny plik moŝe nie istnieć w momencie wykonania przypadku testowego Testowanie jednostkowe (14) Testy zwykle są umieszczane razem z kodem produkcyjnym w repozytorium, tak aby kaŝdy programista mógł je w kaŝdej chwili wykonać. Dlatego umieszczanie w kodzie testów odwołań do zewnętrznych zasobów, które trzeba adresować w sposób bezwzględny, podając ich lokalizację, jest złym pomysłem. WiąŜe on wszystkich uŝytkowników klasy z jedną strukturą katalogów, co moŝe okazać się duŝym utrudnieniem lub nawet uniemoŝliwić testowanie. W tym przypadku odczyt pliku "C:/DaneTestowe/dane.dat" moŝe zakończyć się niepowodzeniem mylnie wskazującym na błąd samego przypadku testowego. Testowanie jednostkowe 14
15 ZaleŜności zewnętrzne testów Dane testowe powinny być umieszczone blisko testu public class SomeTestCase extends TestCase { private double dane[] = {1.0, 3.14, 2.71; public void setup () { InputStream inp = class.getresourceasstream (this.getclass(), "dane.dat"); dane zapisane bezpośrednio w klasie testującej wczytanie danych poprzez class loader, a nie system plików Testowanie jednostkowe (15) Lepszym rozwiązaniem jest umieszczenie danych nawet bezpośrednio w klasie testującej jako pole lub w postaci oddzielnej klasy (np. wewnętrznej). Zwykle nie jest to najlepsze rozwiązanie, poniewaŝ wymaga rekompilacji programu przy zmianie danych, jednak z drugiej strony daje ono pewność, Ŝe dane testowe będą zawsze dostępne. Kiedy takie rozwiązanie jest niemoŝliwe (np. z uwagi na rozmiar danych lub ich skomplikowaną strukturę), wówczas moŝna np. plik z danymi dołączyć do pliku JAR z klasami i następnie odczytać go korzystając z mechanizmu class loader, pomijając system plików. Pozwala to na adresowanie plików wewnątrz pliku JAR bez znajomości jego połoŝenia. Testowanie jednostkowe 15
16 Kontekst i środowisko testów Testy nie powinny zaleŝeć od kontekstu i konfiguracji środowiska public class SomeTestCase extends TestCase { public void testlocale () { Locale locale = Locale.getDefault(); assertequals("pl", locale.getlanguage()); assertequals("08:05:23", new Date().toString()); testy zaleŝne od kontekstu prowadzą do zgłaszania fałszywych błędów Testowanie jednostkowe (16) Podobną naturę posiada problem związany z konfiguracją środowiska (w przypadku Javy moŝe to być np. format prezentacji czasu i daty, bieŝąca godzina czy teŝ strefa czasowa). Przyjęcie załoŝenia o konkretnym formacie stosowanym domyślnie przez maszynę wirtualną Javy moŝe spowodować, Ŝe uruchomienie testów na komputerze o innej konfiguracji będzie powodować trudne do zlokalizowania błędy. Dlatego testy te powinny być wykonywane nie względem ustawień określonych na stałe w treści przypadku testowego, ale względem bieŝącej konfiguracji komputera. Testowanie jednostkowe 16
17 Obsługa wyjątków Testy nie powinny samodzielnie obsługiwać wyjątków zgłaszanych przez aplikację public void testwyjatek () { try { // wywołanie metody zgłaszającej WyjatekAplikacji catch (WyjatekAplikacji ex) { fail ("Przechwycono WyjatekAplikacji"); opakowanie wyjątku ukrywa informację o jego przyczynie Testowanie jednostkowe (17) Przypadki testowe, wywołując metodę w obiekcie testowanym, mogą spowodować zgłoszenie wyjątku. Wyjątki sprawdzane wymagają obsługi lub przekazania do metody wywołującej. W niektórych przypadkach zdarza się, Ŝe programista próbuje przechwycić taki wyjątek i np. przetłumaczyć go na błąd informujący o niepowodzeniu asercji poprzez wywołanie metody fail(). Poza rzadkimi przypadkami jest to zupełnie niepotrzebne i błędne: środowisko uruchomieniowe JUnit samodzielnie przechwytuje takie wyjątki i prezentuje ich przyczynę, a przechwycenie ich przez przypadek testowy i przetłumaczenie na inny rodzaj wyjątku (metoda fail() zastępuje wówczas jeden wyjątek innym) jedynie utrudnia identyfikację przyczyny błędu. Prawidłowym rozwiązaniem jest zadeklarowanie zgłaszanych wyjątków w sygnaturze przypadku testowego, co jest całkowicie akceptowalne z punktu widzenia konwencji narzucanych przez JUnit. Testowanie jednostkowe 17
18 Testowanie wyjątków Testowanie wyjątków public void testindexoutofbounds() { ArrayList emptylist = new ArrayList(); try { Object o = emptylist.get(0); fail("oczekiwano IndexOutOfBoundsException"); catch (IndexOutOfBoundsException success) { // wyjątek zignorowany oczekiwany wyjątek jest ignorowany; brak wyjątku jest błędem Testowanie jednostkowe (18) Innym zagadnieniem jest testowanie wyjątków. Wówczas sytuacja ulega odwróceniu: przypadek testowy sprawdza, czy w odpowiedzi na pewne wywołanie metody w obiekcie testowanym zostanie zgłoszony wyjątek. Obecność wyjątku jest poŝądana i powinna zostać potraktowana jako sytuacja normalna, natomiast brak wyjątku jest błędem. W przypadku JUnit 3.8 najprostszym rozwiązaniem jest 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(). Testowanie jednostkowe 18
19 Testowanie wyjątków Testowanie wyjątków // ignorowanie wyjątku IndexOutOfBoundsException public void testindexoutofbounds() { ArrayList emptylist = new ArrayList(); Object o = emptylist.get(0); ExceptionTestCase samodzielnie obsługuje wyjątki public static Test suite() { TestSuite suite = new TestSuite(); suite.addtest( new ExceptionTestCase("testIndexOutOfBounds", IndexOutOfBoundsException.class); return suite; Testowanie jednostkowe (19) Innym rozwiązaniem jest uŝycie specjalnej klasy ExceptionTestCase, która opakowuje obiekty typu TestCase, a następnie samodzielnie realizuje opisaną wcześniej logikę "odwracania wyjątku". Rozwiązanie to jest elegantsze z punktu widzenia strukturalizacji kodu. Konstruktor tej klasy przyjmuje dwa argumenty: nazwę przypadku testowego oraz klasę wyjątku, który naleŝy przechwycić. Testowanie jednostkowe 19
20 Testowanie liczb zmiennoprzecinkowych Pozornie identyczne liczby zmiennoprzecinkowe mogą binarnie się róŝnić assertequals (oczekiwany, faktyczny, delta); assertequals ( , 1.0/10.0, 0.01); dodatkowy parametr największa dopuszczalna wartość róŝnicy między wartością oczekiwaną i faktyczną Testowanie jednostkowe (20) Podczas testowania wartości zmiennoprzecinkowych, warto pamiętać, Ŝe wiele z nich jest reprezentowanych w komputerach niedokładnie. Dlatego asercje dla tych typów zostały przeciąŝone i posiadają dodatkowy parametr, będący największą dopuszczalną róŝnicą pomiędzy wartościami oczekiwaną i faktyczną. Asercja wówczas nie porównuje tych wartości bezpośrednio, a jedynie sprawdza, czy są one dostatecznie bliskie siebie. Parametr ten powinien przyjmować niewielkie wartości dodatnie, np lub Testowanie jednostkowe 20
21 Struktura katalogów z testami Układ katalogów pozwala oddzielić testy od kodu src +--main klasy logicznie znajdują się w tym samym pakiecie +--pl +--put pl.put.klasa +--Klasa.java +--test +--pl +--put pl.put.klasatest +--KlasaTest.java Testowanie jednostkowe (21) Jak juŝ wspominaliśmy wcześniej, zgodnie z konwencją przyjętą w JUnit, kaŝdej klasie produkcyjnej odpowiada klasa testująca. Powstaje jednak pytanie, jak logicznie powinny one wobec siebie być umieszczone. Z uwagi na konieczność dostępu do niektórych składowych o pakietowym (ang. package private) zakresie widoczności wskazane jest, aby znajdowały się one w tych samych pakietach. Jednak fizyczne umieszczanie klas w tych samych katalogach utrudnia zarządzanie konfiguracją testów i kodu produkcyjnego: niewskazane jest przecieŝ dostarczanie odbiorcy programu testów wymieszanych z innymi klasami. Dlatego często stosuje się rozwiązanie z dwiema równoległymi strukturami pakietów, osobnej dla klas produkcyjnych, i osobnej dla klas testujących. Pozwala to osiągnąć wszystkie postawione przed chwilą cele. Testowanie jednostkowe 21
22 Testowanie metod niepublicznych Wywołanie metody niepublicznej wymaga dostępu do niej public void testduzeliteryustawione() { // pole rn.uppercase jest prywatne Object pole = PrivateAccessor.getField(rn, "uppercase"); Boolean wartosc = (Boolean) pole; asserttrue(wartosc); zmiana dostępu do prywatnego pola junitx.util.* Testowanie jednostkowe (22) Często pojawiające się pytanie dotyczy testowania metod niepublicznych. Jedna z odpowiedzi mówi, Ŝe testować naleŝy tylko metody publiczne, poniewaŝ jedynie one uczestniczą w interakcji z innymi obiektami, zatem stanowią one jedyny dostępny na zewnątrz interfejs klasy. Inna szkoła dowodzi, Ŝe znacznie bardziej uzasadnione jest testowanie wszystkich metod o nietrywialnym zachowaniu, bez względu na zakres ich widoczności. Wówczas czasami konieczne staje się przetestowanie takŝe metod prywatnych i chronionych. W Javie jest to moŝliwe jedynie poprzez mechanizm Java Reflection. Rozwiązanie to na potrzeby testowania zostało zaimplementowane w dodatku do JUnita pod nazwą JUnitX w klasie PrivateAccessor. Pozwala ona zmienić poziom dostępu do dowolnej składowej (pola lub metody) i w razie potrzeby odwołać się do niej. Testowanie jednostkowe 22
23 Wady JUnit 3.x sztywne konwencje nazewnicze przypadków testowych konieczność dziedziczenia po klasie TestCase słaba kontrola kolejności wykonywania przypadków testowych tylko jedna dla wszystkich przypadków testowych metoda inicjująca i jedna finalizująca niewygodne konfigurowanie przypadków testowych brak dodatkowych funkcji (niektóre obecne w rozszerzeniach) Testowanie jednostkowe (23) JUnit w wersji 3.x, mimo prostoty wewnętrznej i spójnego, logicznego projektu obiektowego, posiada szereg wad, które z czasem w coraz większym stopniu utrudniają jego stosowanie w praktyce: przyjęcie konwencji nazewniczych dotyczących nazw przypadków testowych jest dość nieporęczne; ścisła integracja (poprzez dziedziczenie) z klasą TestCase stwarza dodatkową zaleŝność, której moŝna uniknąć; kontrola kolejności wykonywanych przypadków testowych jest utrudniona, poniewaŝ pierwotnie załoŝono całkowitą ich niezaleŝność od siebie; istnieje tylko jedna para metod inicjalizująco-finalizujących, i to wyłącznie na poziomie przypadku testowego. Powoduje to zbędną duplikację kodu w bardziej złoŝonych przypadkach; brak wielu istotnych funkcji (np. obsługi limitów czasowych, wbudowanej obsługi testowania wyjątków, braku mechanizmu konfiguracji przypadków testowych), spośród których część jest obecna w rozszerzeniach tworzonych przez niezaleŝnych autorów. Wady te oraz pojawienie się moŝliwości związanych z nowymi elementami języka Java w wersji 5.0 spowodowały powstanie oraz szybki rozwój dwóch bibliotek: JUnit 4.0, będącej napisaną od nowa wersją JUnit 3.8, wyposaŝoną w nowe moŝliwości, oraz TestNG niezaleŝnej implementacji częściowo zgodnej z JUnit 3.x, jednak opartej na nieco zmodyfikowanych załoŝeniach. Testowanie jednostkowe 23
24 Agenda Testowanie jednostkowe Biblioteka JUnit 3.8 Biblioteka JUnit 4.0 Biblioteka TestNG Obiekty zastępcze Testowanie jednostkowe (24) Druga część wykładu jest poświęcone nowej wersji biblioteki JUnit w wersji 4.0 Testowanie jednostkowe 24
25 ZałoŜenia dla JUnit 4.x brak konieczności dziedziczenia przez klasy testujące wykorzystanie anotacji Java 5.0 zamiast konwencji nazw metody inicjujące i finalizujące na poziomie metody i klasy wiele metod inicjujących i finalizujących wbudowana obsługa spodziewanych wyjątków pomijanie wybranych przypadków testowych obsługa limitów czasowych kompatybilność z JUnit 3.x Testowanie jednostkowe (25) W JUnit 4.0, tworzonym podobnie jak wersja 3.x przez K. Becka i E. Gammę, część z wymienionych wcześniej problemów została rozwiązana. W miejsce dziedziczenia po klasie TestCase oraz zamiast konwencji nazewniczej przypadków testowych zastosowano wprowadzone w JDK 5.0+ anotacje, które określają znaczenie poszczególnych metod. Rozwiązanie to jest znacznie bardziej eleganckie i zrozumiałe od narzuconego sposobu nazywania metod. Ponadto rozszerzono moŝliwości inicjacji i finalizacji metod obecnie moŝna w klasie umieścić dowolną liczbę takich metod, oraz stworzono dodatkową parę metod inicjująco-finalizującą na poziomie klasy, a nie tylko przypadku testowego. Zostały teŝ zaimplementowane mechanizmy słuŝące do testowania wyjątków, ignorowania wybranych przypadków testowych i obsługi limitów czasowych. Co bardzo waŝne, przyjęto zasadę dwustronnej kompatybilności z JUnit 3.x: dotychczasowe testy mogą być uruchamiane przez silnik JUnit 4.0, a nowe testy moŝna opakować w adapter umoŝliwiający ich wykonywanie w starym środowisku uruchomieniowym. Testowanie jednostkowe 25
26 Testy z uŝyciem JUnit 4.0 brak dziedziczenia, dowolna klasa (POJO) metoda inicjująca; brak konwencji nazwy; przypadek testowy; brak konwencji nazwy metoda finalizująca; brak konwencji nazwy; public class RomanNumberTest { RomanNumber rn1 = public void inicjuj() { rn = new public void wykonajtest() throws Exception { String str = rn.tostring(); assertequals(str, public void sprzataj() { rn = null; org.junit.* Testowanie jednostkowe (26) Na slajdzie przedstawiono przykład klasy testującej RomanNumberTest, która wcześniej została napisana pod kątem uŝycia z biblioteką JUnit 3.8. Metoda inicjuj() oznaczona jest wykonywana analogicznie do metody setup() znanej z JUnit 3.8, czyli przed wykonaniem kaŝdego przypadku testowego. Jej odpowiednikiem finalizującym jest metoda sprzataj() oznaczona która zostanie wykonana po kaŝdym przypadku testowym. Liczba metod inicjujących i finalizujących jest dowolna, jednak między nimi nie są określone zaleŝności kolejnościowe. Przypadki testowe nie są juŝ związane konwencją nazewniczą znaną z JUnit 3.8: do ich oznaczania wystarcza Testowanie jednostkowe 26
27 Testy z uŝyciem JUnit 4.0 metoda inicjująca; brak konwencji nazwy test ignorowany; parametr timeout max. czas wykonania przypadku testowego parametr expected - obsługa oczekiwanego wyjątku metoda finalizująca; brak konwencji public void inicjujklase() public void powolnytest() { public void testujwyjatek() { public void sprzatajklase() { //... Testowanie jednostkowe (27) JUnit 4.0 pozwala na definiowanie dodatkowej pary metod inicjalizującej i finalizującej, tym razem na poziomie klasy. Metody te zostaną wykonane przez wszystkimi i po wszystkich przypadkach testowych naleŝących do danej klasy testującej. Do ich oznaczania słuŝą pozwala czasowo usunąć przypadek testowy z grona przypadków aktywnych: nie będzie on wykonywany w momencie wykonania testów. Parametr timeout w słuŝy natomiast do określenia maksymalnego czasu wykonywania przypadku testowego. JeŜeli zostanie on przekroczony, jest przerywany, a odpowiednia informacja trafia do programisty. Zaimplementowano takŝe oparty o anotację mechanizm testowania wyjątków. Parametr expected w pozwala określić, jaki typ wyjątku jest oczekiwany, i którego brak będzie błędem. Mechanizm ten zastępuje dotychczasowe prowizoryczne rozwiązania stosowane w JUnit 3.x Testowanie jednostkowe 27
28 Agenda Testowanie jednostkowe Biblioteka JUnit 3.8 Biblioteka JUnit 4.0 Biblioteka TestNG Obiekty zastępcze Testowanie jednostkowe (28) Alternatywą dla JUnit 4.0 jest biblioteka TestNG. Dzięki brakowi wstecznej zgodności z poprzednimi wersjami, jej moŝliwości znacznie wykraczają poza to co oferuje JUnit. Testowanie jednostkowe 28
29 ZałoŜenia dla TestNG separacja implementacji testów od ich konfiguracji rezygnacja z dziedziczenia klas testujących wykorzystanie anotacji Java 5.0 zamiast konwencji nazw parametryzacja przypadków testowych metody inicjujące i finalizujące na poziomie suity, klasy i przypadku testowego zaleŝności kolejnościowe między przypadkami testowymi asercje języka Java zamiast programowych Testowanie jednostkowe (29) NajwaŜniejsze cechy TestNG to: Separacja implementacji testów od ich konfiguracji. Testy jednostkowe są wykonywane wielokrotnie, jednak nie zawsze konieczne jest wykonanie wszystkich przypadków testowych. TestNG pozwala specyfikować zakres testów niezaleŝnie od kodu tych testów w postaci pliku XML. Dzięki temu moŝna zdefiniować róŝne zestawy testów (za pomocą osobnych plików XML) do róŝnych zastosowań. Rezygnacja z mechanizmu dziedziczenia z wyróŝnionej klasy testującej. Klasa testująca zapisana w TestNG nie musi być potomkiem konkretnej klasy naleŝącej do biblioteki moŝe nią być dowolna zwykła klasa (tzw. POJO Plain Old Java Object). Koniec z konwencjami nazewniczymi. Podobnie, nazwy metodprzypadków testowych nie muszą odpowiadać jakimkolwiek konwencjom. Wystarczy, Ŝe są oznaczone Parametryzacja przypadków testowych. Przypadki testowe mogą przyjmować parametry typu String, których liczba i wartości są konfigurowane niezaleŝnie od kodu testu. Trójpoziomowa ziarnistość inicjalizacji i finalizacji. Istnieje moŝliwość precyzyjnego ustalenia ziarnistości i zakresu inicjalizacji oraz finalizacji środowiska testowego: za pomocą adnotacji moŝna oznaczyć metody wykonywane przed i po wszystkich przypadkach testowych w grupie (@beforesuite w klasie testującej (@beforetestclass oraz podobnie jak w JUnit cie 3.x pojedynczym przypadku testowym (@beforetestmethod Testowanie jednostkowe 29
30 ZałoŜenia dla TestNG (cd.) separacja implementacji testów od ich konfiguracji rezygnacja z dziedziczenia klas testujących wykorzystanie anotacji Java 5.0 zamiast konwencji nazw parametryzacja przypadków testowych metody inicjujące i finalizujące na poziomie suity, klasy i przypadku testowego zaleŝności kolejnościowe między przypadkami testowymi asercje języka Java zamiast programowych Testowanie jednostkowe (30) Wykorzystanie asercji wbudowanych w język w miejsce asercji programowych. Specyfikowanie zaleŝności między grupami przypadków testowych i określanie kolejności ich wykonywania. Cecha ta, nieobecna w JUnit, pozwala m.in. na automatyczne pomijanie tych testów, których zaleŝności wcześniej nie zostały spełnione (tzn. zgłosiły wyjątki). Pozwala takŝe ręcznie oznaczać niektóre testy do pominięcia w aktualnym wykonaniu. Proste wskazywanie oczekiwanych wyjątków. Przypadek testowy sprawdzający pojawienie się oczekiwanego wyjątku zaimplementowany z wykorzystaniem JUnit 3.x musiał przechwycić ten wyjątek, a następnie go zignorować, natomiast brak wyjątku był sygnalizowany bezwarunkowym zgłoszeniem błędu. TestNG pozwala wskazać oczekiwany wyjątek za pomocą anotacji Testowanie jednostkowe 30
31 Testy z uŝyciem TestNG brak dziedziczenia, dowolna klasa (POJO) (beforetestmethod) metoda inicjująca kaŝdy przypadek testowy przypadek testowy (aftertestmethod) metoda finalizująca kaŝdy przypadek testowy public class RomanNumberTest { RomanNumber rn1 = public void inicjuj() { rn = new public void wykonajtest() throws Exception { String str = rn.tostring(); assertequals(str, public void sprzataj() { rn = null; Testowanie jednostkowe (31) Ponownie, przykładem jest klasa RomanNumberTest. Metoda inicjująca inicjuj() jest oznaczona z parametrem beforetestmethod, który wskazuje, Ŝe inicjuje ona kaŝdy przypadek testowy Jej odpowiednikiem finalizującym jest metoda sprzataj() z identyczną anotacją i parametrem aftertestmethod. Podobnie jak w przypadku implementacji dla JUnit 4.0, metoda wykonajtest() jest przypadkiem testowym wykrywanym automatycznie przez środowisko TestNG dzięki zastosowaniu Testowanie jednostkowe 31
32 Testy z uŝyciem TestNG (beforetestmethod) metoda inicjująca kaŝdą klasę testującą parametr enabled ignorowanie przypadku testowego obsługa oczekiwanego wyjątku (beforetestsuite) metoda inicjująca public void inicjujklase() { public void niewaznytest() public void testujwyjatek() { public void inicjujsuite() { //... Testowanie jednostkowe (32) Metoda inicjujklase() zostanie wykonana jeden raz przed wykonaniem wszystkich przypadków testowych zawartych w tej klasie. Metoda niewaznytest() zostanie pominięta, poniewaŝ parametr enabled powoduje zignorowanie jej przez TestNG. Metoda testujwyjatek() oczekuje pojawienia się wyjątku typu Wyjatek. Lista oczekiwanych wyjątków jest przekazywana za pomocą Metoda inicjujsuite() zostanie wykonana dokładnie raz dla całej suity (czyli jednego uruchomienia dowolnego zbioru przypadków testowych) Testowanie jednostkowe 32
33 Testy z uŝyciem TestNG parametr groups lista grup, do których naleŝy przypadek testowy lista metod, od których przypadek testowy zaleŝy lista parametrów wymaganych przez przypadek public void prosty() public void zaleznytest() public void inny(string parametr) { //... Testowanie jednostkowe (33) Na tym slajdzie przedstawiono bardziej zaawansowane cechy TestNG. moŝe posiadać parametr groups, który definiuje grupy, do jakich dany przypadek testowy naleŝy. Uruchamiając testy, moŝna podać grupy, jakie powinny zostać wykonane. Pozostałe (niewymienione grupy) zostaną zignorowane. Metoda zaleznytest() oznaczona zostanie wykonana po poprawnym (tzn. bez zgłoszenia wyjątku) metody od której zaleŝy, czyli metody prosty(). Mechanizm ten pozwala m.in. tworzyć metody zawierające wspólne fragmenty kodu dla wybranych grup przypadków testowych oraz uniknąć wykonywania zaleŝnych przypadków testowych, jeŝeli wykonywane przed nimi metody (np. inne przypadki testowe) nie powiodły się. Pozwala to uniknąć fałszywych komunikatów o błędach, które w rzeczywistości są spowodowane błędnym wynikiem przypadków zaleŝnych zastosowana do przypadku testowego pozwala na przekazanie mu dowolnych parametrów, których ten przypadek wymaga. Parametry te (zawsze typu String!) są przekazywane poprzez plik konfiguracyjny. Testowanie jednostkowe 33
34 Konfiguracja TestNG <!DOCTYPE suite SYSTEM " <suite name="zestaw1" verbose="1"> <test name="test1"> <classes> <parameter name="parametr" value="wartość"/> <class name="testprzykladowy"/> </classes> </test> </suite> Testowanie jednostkowe (34) Pliki konfiguracyjne TestNG są zapisywane w postaci XML. NajwyŜszym poziomem konfiguracji jest suita o podanej nazwie (w typ przypadku Zestaw1). Wewnątrz niej znajdują się pojedyncze testy, zbudowane z klas. Za pomocą pliku moŝna przekazać wartości parametrów do przypadków testowych, które tego wymagają, dzięki czemu ten sam przypadek testowy moŝe zostać uruchomiony wielokrotnie z róŝnymi wartościami parametrów. Ponadto moŝna zignorować wybrane przypadki testowe lub połączyć je w grupy niezaleŝnie od anotacji zapisanych bezpośrednio w kodzie. PoniewaŜ uruchomienie testów TestNG wymaga przekazania takŝe nazwy pliku konfiguracyjnego, moŝna łatwo zarządzać konfiguracją testów, tworząc kilka róŝnych plików XML. Wówczas np. moŝna wykonywać testy na róŝnych poziomach szczegółowości, koncentrując się na aktualnie istotnych elementach. Testowanie jednostkowe 34
35 Agenda Testowanie jednostkowe Biblioteka JUnit 3.8 Biblioteka JUnit 4.0 Biblioteka TestNG Obiekty zastępcze Testowanie jednostkowe (35) Ostatnia część wykładu jest poświęcona obiektom zastępczym, zwanym takŝe imitacjami obiektów. Technika ta umoŝliwia rozszerzenie zakresu stosowania testowania jednostkowego na nowe obszary. Testowanie jednostkowe 35
36 Testowanie obiektów z zaleŝnościami Klasa testująca JUnit 1 3 Obiekt testowany 2 Połączenie z bazą danych obiekt zaleŝny Testowanie jednostkowe (36) Typowy proces testowania jednostkowego, w którym obiekt testowany wymaga pewnego środowiska, polega na wykonaniu następujących kroków 1.Utworzenie instancji obiektu testowanego przez klasę testującą 2.Uzyskanie referencji do obiektów zaleŝnych niezbędnych do utworzenia/uŝycia obiektu testowanego. MoŜe to polegać na bezpośrednim utworzeniu tego obiektu bądź jego wyszukaniu (np. w katalogu JNDI), lub teŝ uruchomieniu oprogramowania dostarczającego tego środowiska (np. serwera aplikacji) 3.Wywołanie przypadku testowego, który wywołuje metody w obiekcie testowanym Jednak taka procedura jest niezupełnie zgodna z ideą testowania jednostkowego. W tym przypadku testom poddawany jest nie tylko sam obiekt testowany, lecz takŝe wszystkie jego zaleŝności. Powoduje to, Ŝe błąd znaleziony w teście moŝe w rzeczywistości wynikać z obiektu testowanego lub jego zaleŝności, które przecieŝ aktualnie nie są testowane. NiezaleŜnie od tego, nie do zaakceptowania jest sytuacja, w której dla potrzeb kaŝdego przypadku testowego będzie uruchamiany serwer aplikacji, którego rozruch zajmuje dłuŝszy czas. Celem testowania jednostkowego jest wyizolowanie obiektu testowanego od środowiska. Jednak jak osiągnąć ten cel, gdy obiekt ten wymaga spełnienia zaleŝności? Testowanie jednostkowe 36
37 Testowanie z uŝyciem obiektów zastępczych Klasa testująca JUnit 1 3 Obiekt testowany 2 Obiekt zastępczy połączenia z bazą danych Obiekty zastępcze tworzy się dla zaleŝności, a nie dla obiektów testowanych Mackinnon, Freeman (2001) Testowanie jednostkowe (37) Rozwiązaniem jest zastąpienie dla potrzeb przypadku testowego obiektu zaleŝnego przez obiekt zastępczy (ang. mock object). Obiekty zastępcze są pod względem typu identyczne jak obiekty zaleŝne i są zamiennikami wystarczającymi dla potrzeb uruchomienia testu. W przypadku pokazanym na rysunku, obiekt połączenia z bazą danych jest zastąpiony przez obiekt zastępczy. Obiekt ten nie wykonuje Ŝadnej operacji związanej z bazą danych, nie łączy się z nią ani nie wykonuje zapytań. Jego rola ogranicza się do naśladowania obiektu zaleŝnego w takim tylko zakresie, jaki jest niezbędny do wykonania przypadku testowego. W stosunku do tradycyjnej procedury testowania, zmieniony jest krok 2. ZaleŜności są spełniane nie przez obiekt testowany, ale przez klasę testującą, która przekazuje obiektowi testowanemu instancje obiektów zastępczych. Co waŝne, obiekt zastępczy NIGDY nie zastępuje obiektu testowanego, a jedynie jego zaleŝności. Celem jest przecieŝ sprawdzenie, czy obiekt testowany zachowuje się poprawnie, więc uŝycie zamiast niego obiektu zastępczego nie ma sensu. Testowanie jednostkowe 37
38 Obiekt zastępczy Obiekt zastępczy posiada interfejs zastępowanego obiektu naśladuje jego zachowanie w najprostszy moŝliwy sposób jest konfigurowalny obserwuje sposób interakcji między nim a obiektem testowanym umoŝliwia weryfikację poprawności sposobu interakcji Mackinnon, Freeman (2000) Testowanie jednostkowe (38) Koncepcja obiektów zastępczych, zaproponowana przez Mackinnona i Freemana w 2000 roku, ma na celu rozwiązanie przedstawionych przed chwilą problemów związanych z testowaniem jednostkowym. Obiekt zastępczy posiada interfejs zastępowanego przez niego obiektu zaleŝnego, a zatem moŝe zastąpić go w interakcji z obiektem testowanym bez jakichkolwiek zmian w kodzie. Jest najprostszą moŝliwą implementacją obiektu zaleŝnego, co oznacza, Ŝe nie wykonuje Ŝadnych operacji, które nie są niezbędne z punktu widzenia obiektu testowanego. Zwykle jego działanie sprowadza się do zwracania poprzez jego metody określonych "na sztywno" wartości. Jest zatem prymitywnym naśladowcą obiektu zaleŝnego. Aby zdefiniować jego zachowanie, musi być konfigurowalny moŝna w nim określić wartości zwracane przez jego metody. Wreszcie ostatnią własnością jest moŝliwość śledzenia interakcji z obiektem testowanym. Dzięki temu powstaje dodatkowa metoda weryfikacji zachowania obiektu testowanego: jeŝeli wywoła on metody obiektu zastępczego niewłaściwą liczbę razy, nie zapyta o parametr, o który powinien zapytać wówczas obiekt zastępczy moŝe takŝe zgłosić błąd, który będzie toŝsamy z niespełnieniem asercji przypadku testowego. Testowanie jednostkowe 38
39 UŜycie obiektów zastępczych 1. Utwórz instancje niezbędnych obiektów zastępczych 2. Ustaw wartości parametrów, które obiekty zastępcze zwrócą obiektowi testowanemu 3. Zdefiniuj zachowanie obiektów zastępczych wobec obiektu testowanego 4. Wywołaj metodę testowaną, przekazując obiekty zastępcze jako parametry 5. Zweryfikuj poprawność obiektów zastępczych Testowanie jednostkowe (39) Pełna procedura przebiega w następujących krokach: 1.Utworzenie instancji obiektów zastępczych koniecznych do utworzenia/uŝycia obiektu testowanego. W ten sposób przygotowane zostaje środowisko wykonania przypadku testowego 2.Obiekty zastępcze są konfigurowane wartościami parametrów, które zostaną przekazane obiektowi testowanemu, gdy on wywoła ich metody. 3.Obiekty zastępcze otrzymują dodatkową informację na temat spodziewanej interakcji z obiektem testowanym, np. minimalnej lub maksymalnej liczbie wywołań określonej metody. Informacja ta posłuŝy następnie do zweryfikowania poprawności stanu obiektów zastępczych po zakończeniu testu. W ten sposób pełni rolę dodatkowego mechanizmu weryfikacyjnego, niezaleŝnego od asercji umieszczonych w przypadku testowym. 4.Metoda testowana jest wywoływana przez przypadek testowy. JeŜeli to konieczne, metoda testowana otrzymuje parametry będące obiektami zastępczymi. 5.Wyniki wywołania metody są weryfikowane przez obiekty zastępcze (patrz pkt. 3). JeŜeli jakakolwiek załoŝona zaleŝność nie została spełniona, zgłaszany jest wyjątek, który wskazuje na niepowodzenie przypadku testowego. Testowanie jednostkowe 39
40 UŜycie obiektów zastępczych : Klient 1: utwórz 2: ustaw parametry : Obiekt zastępczy 3: ustaw punkty weryfikacji 4: utwórz 5: wykonaj : Obiekt testowany 6: pobierz parametr 7: weryfikuj Testowanie jednostkowe (40) Diagram przedstawia przykładową wymianę komunikatów pomiędzy przypadkiem testowym, obiektem testowanym i obiektem zastępczym. 1. Klient tworzy instancję Obiektu zastępczego 2. Klient ustawia parametry Obiektu zastępczego, które następnie zostaną przekazane Obiektowi testowanemu 3. Klient ustawia punkty weryfikacji w Obiekcie zastępczym, sprawdzające poprawność interakcji między nim a Obiektem testowanym 4. Klient tworzy instancję Obiektu testowanego 5. Klient wykonuje metodę wykonaj() Obiektu testowanego 6. Obiekt testowany w odpowiedzi pobiera parametry z Obiektu zastępczego 7. Klient kontroluje osiągnięcie punktów weryfikacji w Obiekcie zastępczym Testowanie jednostkowe 40
41 Zastosowania obiektów zastępczych trudno utworzyć i skonfigurować obiekt rzeczywisty rzeczywisty obiekt zachowuje się niedeterministycznie trudno wywołać określone zachowanie rzeczywistego obiektu (np. błąd sieciowy) znany jest tylko interfejs rzeczywistego obiektu rzeczywisty obiekt jest mało wydajny na potrzeby testu rzeczywisty obiekt posiada interfejs uŝytkownika stan obiektu wymaga weryfikacji po wykonaniu przypadku testowego Testowanie jednostkowe (41) Obiekty zastępcze okazują się skutecznym rozwiązaniem w wielu sytuacjach, w których uŝycie rzeczywistego obiektu zaleŝności jest trudne, niewygodne lub niemoŝliwe. Testowanie jednostkowe 41
42 Przykład public void testalicja34latazalogowana () { mockrequest.setupaddparameter("imie", "Alicja"); mockrequest.setupaddparameter("wiek", "34"); mockrequest.setexpectedattribute("zalogowana", true); mockresponse.setexpectedoutput("witaj, Ala"); servlet.init(mockconfig); servlet.doget(mockrequest, mockresponse); asserttrue("atrybut nie ustawiony", mockrequest.getattribute("zalogowana")); mockrequest.verify(); mockresponse.verify(); Testowanie jednostkowe (42) Przykład przedstawia zastosowanie idei obiektów zastępczych do testowania serwletów. Serwlety słuŝą do obsługi protokołów opartych o model klient-serwer, a ich najpopularniejszym zastosowaniem jest tworzenie dynamicznych aplikacji WWW. Serwlety są w znacznym stopniu zintegrowane z kontenerem obiektem, który je tworzy i zarządza ich cyklem Ŝycia. Testowanie serwletów poza kontenerem jest zatem bardzo trudne. Na przykład metoda doget(), która słuŝy do obsługi Ŝądania GET protokołu HTTP (jak zresztą niemal wszystkie metody serwleta), wymaga przekazania dwóch paramterów: HttpServletRequest, reprezentującego nadesłane przez klienta Ŝądanie HTTP, i HttpServletResponse, które jest tworzoną przez serwlet odpowiedzią HTTP. Obiekty te są tworzone i konfigurowane przez kontener, zatem nie moŝna wywołać tej metody poza kontenerem. Z pomocą przychodzą obiekty zastępcze, które zastępują te obiekty. Są one najpierw konfigurowane parametrami wejściowymi, które zwykle przesłałby klient w Ŝądaniu, oraz oczekiwanymi parametrami, które powinny pojawić się w tych obiektach po wywołaniu metody serwleta. Następnie serwlet (utworzony za pomocą konstruktora, poza kontenerem), jest konfigurowany (metoda init() takŝe przyjmuje obiekt zastępczy jako parametr) i wywoływana jest metoda doget() z obiektami zastępczymi jako parametrami. Po wywołaniu weryfikowane są asercje oraz spełnienie oczekiwanych zaleŝności zdefiniowanych wewnątrz obiektów zastępczych na początku. Testowanie jednostkowe 42
43 Podsumowanie Testy jednostkowe automatyzują weryfikację kodu Biblioteki do testowania jednostkowego wspierają tworzenie i uruchamianie przypadków testowych JUnit 4.0 i TestNG stanowią nową generację bibliotek do testowania jednostkowego Obiekty zastępcze wspierają testowanie jednostkowe Testowanie jednostkowe (43) Podczas wykładu przypomniano koncepcję testów jednostkowych, ich przeznaczenie oraz specyfikę działania. Przedstawiono takŝe trzy biblioteki wspomagające tworzenie i uruchamianie takich testów: JUnit 3.8, JUnit 4.0 i TestNG. Dwie ostatnie biblioteki stanowią odpowiedź na braki funkcjonalne JUnita 3.8 i, wykorzystując nowe moŝliwości języka Java, oferują znacznie prostsze metody tworzenia, konfiguracji i wykonania przypadków testowych. Ostatnim punktem była koncepcja obiektów zastępczych, które pozwalają na wykonywanie testów jednostkowych takŝe w sytuacji, gdy niemoŝliwe jest spełnienie zaleŝności obiektów testowanych. Testowanie jednostkowe 43
LABARATORIUM 9 TESTY JEDNOSTKOWE JUNIT 3.8
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
Testowanie jednostkowe. Jacek Starzyński, ZETiIS PW
Testowanie jednostkowe Jacek Starzyński, ZETiIS PW Testowanie Po co testować? Co testować? Kiedy testować? Jak testować? Narzędzia Po co testować? Testy nie udowadniają poprawności......ale pozwalają wykryć
METODY PROGRAMOWANIA
METODY PROGRAMOWANIA Testy jednostkowe 8 grudnia 2017 Krzysztof Pawłowski kpawlowski@pjwstk.edu.pl PO CO NAM TESTY? weryfikacja poprawności sprawdzanie regresji specyfikacja dokumentacja wymuszanie dobrego
TestNG: testowanie jednostkowe nowej generacji
TestNG: testowanie jednostkowe nowej generacji Bartosz Walter Instytut Informatyki Politechniki Poznańskiej 1 Wprowadzenie TestNG jest nowej generacji biblioteką do tworzenia testów jednostkowych w języku
Programowanie poprzez testy z wykorzystaniem JUnit
Programowanie poprzez testy z wykorzystaniem JUnit Programowanie ekstremalne (XP) XP zaproponowano w 1999 (K. Beck: Extreme Programming Explained ) XP dedykowane jest do projektów: O małym lub średnim
Testowanie. Ryszard Beczek & Piotr Miłkowski 1 04/11/07
Testowanie Ryszard Beczek & Piotr Miłkowski 1 O czym to będzie? Trzy słowa o testowaniu TDD JUnit TestNG JMeter Yawet Squish/Java 2 Jak testujemy? Zwykle aplikacje testujemy ręcznie Testy przeprowadzamy
Automatyzacja testowania oprogramowania. Automatyzacja testowania oprogramowania 1/36
Automatyzacja testowania oprogramowania Automatyzacja testowania oprogramowania 1/36 Automatyzacja testowania oprogramowania 2/36 Potrzeba szybkich rozwiązań Testowanie oprogramowania powinno być: efektywne
Wyjątki. Streszczenie Celem wykładu jest omówienie tematyki wyjątków w Javie. Czas wykładu 45 minut.
Wyjątki Streszczenie Celem wykładu jest omówienie tematyki wyjątków w Javie. Czas wykładu 45 minut. Wydaje się, że żaden użytkownik oprogramowania nie lubi, kiedy stosowany program nagle zawiesza się,
Testowanie aplikacji Java Servlets
Borland Developer Days 2004 2-3 czerwca 2004 Testowanie aplikacji Java Servlets Bartosz Walter mailto: Bartek.Walter@man.poznan.pl Agenda Aplikacje Java Servlets TM Jak testować aplikacje internetowe?
Programowanie w języku Java - Wyjątki, obsługa wyjątków, generowanie wyjątków
Programowanie w języku Java - Wyjątki, obsługa wyjątków, generowanie wyjątków mgr inż. Maciej Lasota Version 1.0, 13-05-2017 Spis treści Wyjątki....................................................................................
UML a kod w C++ i Javie. Przypadki użycia. Diagramy klas. Klasy użytkowników i wykorzystywane funkcje. Związki pomiędzy przypadkami.
UML a kod w C++ i Javie Projektowanie oprogramowania Dokumentowanie oprogramowania Diagramy przypadków użycia Przewoznik Zarzadzanie pojazdami Optymalizacja Uzytkownik Wydawanie opinii Zarzadzanie uzytkownikami
Programowanie zespołowe
Programowanie zespołowe Laboratorium 3 - podstawy testów jednostkowych mgr inż. Krzysztof Szwarc krzysztof@szwarc.net.pl Sosnowiec, 7 marca 2017 1 / 22 mgr inż. Krzysztof Szwarc Programowanie zespołowe
JAVA. Java jest wszechstronnym językiem programowania, zorientowanym. apletów oraz samodzielnych aplikacji.
JAVA Java jest wszechstronnym językiem programowania, zorientowanym obiektowo, dostarczającym możliwość uruchamiania apletów oraz samodzielnych aplikacji. Java nie jest typowym kompilatorem. Źródłowy kod
Wykład 8: klasy cz. 4
Programowanie obiektowe Wykład 8: klasy cz. 4 Dynamiczne tworzenie obiektów klas Składniki statyczne klas Konstruktor i destruktory c.d. 1 dr Artur Bartoszewski - Programowanie obiektowe, sem. 1I- WYKŁAD
Programowanie obiektowe. Literatura: Autor: dr inŝ. Zofia Kruczkiewicz
Programowanie obiektowe Literatura: Autor: dr inŝ. Zofia Kruczkiewicz Java P. L. Lemay, Naughton R. Cadenhead Java Podręcznik 2 dla kaŝdego Języka Programowania Java Linki Krzysztof Boone oprogramowania
Testowanie I. Celem zajęć jest zapoznanie studentów z podstawami testowania ze szczególnym uwzględnieniem testowania jednostkowego.
Testowanie I Cel zajęć Celem zajęć jest zapoznanie studentów z podstawami testowania ze szczególnym uwzględnieniem testowania jednostkowego. Testowanie oprogramowania Testowanie to proces słyżący do oceny
Dokumentacja do API Javy.
Dokumentacja do API Javy http://java.sun.com/j2se/1.5.0/docs/api/ Klasy i obiekty Klasa jest to struktura zawierająca dane (pola), oraz funkcje operujące na tych danych (metody). Klasa jest rodzajem szablonu
JUnit TESTY JEDNOSTKOWE. Waldemar Korłub. Platformy Technologiczne KASK ETI Politechnika Gdańska
JUnit TESTY JEDNOSTKOWE Waldemar Korłub Platformy Technologiczne KASK ETI Politechnika Gdańska Testy aplikacji 2 Ręczne testowanie Czasochłonne Powtarzalność trudna do uzyskania Nudne Testowanie automatyczne
Testowanie II. Cel zajęć. Pokrycie kodu
Cel zajęć Celem zajęć jest zapoznanie studentów z uzupełniającymi zagadnieniami dotyczącymi testowania wytwarzanego oprogramowania. W pierwszej części zajęć przedstawiona zostanie metoda oceny kompletności
TEMAT : KLASY DZIEDZICZENIE
TEMAT : KLASY DZIEDZICZENIE Wprowadzenie do dziedziczenia w języku C++ Język C++ możliwa tworzenie nowej klasy (nazywanej klasą pochodną) w oparciu o pewną wcześniej zdefiniowaną klasę (nazywaną klasą
1. Które składowe klasa posiada zawsze, niezależnie od tego czy je zdefiniujemy, czy nie?
1. Które składowe klasa posiada zawsze, niezależnie od tego czy je zdefiniujemy, czy nie? a) konstruktor b) referencje c) destruktor d) typy 2. Które z poniższych wyrażeń są poprawne dla klasy o nazwie
Kurs programowania. Wstęp - wykład 0. Wojciech Macyna. 22 lutego 2016
Wstęp - wykład 0 22 lutego 2016 Historia Simula 67 język zaprojektowany do zastosowan symulacyjnych; Smalltalk 80 pierwszy język w pełni obiektowy; Dodawanie obiektowości do języków imperatywnych: Pascal
Programowanie obiektowe
Programowanie obiektowe Laboratorium 1. Wstęp do programowania w języku Java. Narzędzia 1. Aby móc tworzyć programy w języku Java, potrzebny jest zestaw narzędzi Java Development Kit, który można ściągnąć
Programowanie obiektowe
Laboratorium z przedmiotu Programowanie obiektowe - zestaw 02 Cel zajęć. Celem zajęć jest zapoznanie z praktycznymi aspektami projektowania oraz implementacji klas i obiektów z wykorzystaniem dziedziczenia.
Programowanie obiektowe
Programowanie obiektowe III. Refleksja Małgorzata Prolejko OBI JA16Z03 Plan Klasa Class. Analiza funkcjonalności klasy. Podstawy obsługi wyjątków. Zastosowanie refleksji do analizy obiektów. Wywoływanie
Testy automatyczne. Korzystające z junit
Testy automatyczne Korzystające z junit Cytaty Kiedy zawiesza się program konkurencji, to jest awaria. Kiedy zawiesza się własny program, to jest drobiazg. Często po awarii pojawia się komunikat typu ID
PARADYGMATY PROGRAMOWANIA Wykład 4
PARADYGMATY PROGRAMOWANIA Wykład 4 Metody wirtualne i polimorfizm Metoda wirualna - metoda używana w identyczny sposób w całej hierarchii klas. Wybór funkcji, którą należy wykonać po wywołaniu metody wirtualnej
Java - tablice, konstruktory, dziedziczenie i hermetyzacja
Java - tablice, konstruktory, dziedziczenie i hermetyzacja Programowanie w językach wysokiego poziomu mgr inż. Anna Wawszczak PLAN WYKŁADU zmienne tablicowe konstruktory klas dziedziczenie hermetyzacja
76.Struktura oprogramowania rozproszonego.
76.Struktura oprogramowania rozproszonego. NajwaŜniejsze aspekty obiektowego programowania rozproszonego to: Współdziałanie (interoperability) modułów programowych na róŝnych maszynach. Wielokrotne wykorzystanie
Obszar statyczny dane dostępne w dowolnym momencie podczas pracy programu (wprowadzone słowem kluczowym static),
Tworzenie obiektów Dostęp do obiektów jest realizowany przez referencje. Obiekty w języku Java są tworzone poprzez użycie słowa kluczowego new. String lan = new String( Lancuch ); Obszary pamięci w których
Programowanie obiektowe zastosowanie języka Java SE
Programowanie obiektowe zastosowanie języka Java SE Wstęp do programowania obiektowego w Javie Autor: dr inŝ. 1 Java? Java język programowania obiektowo zorientowany wysokiego poziomu platforma Javy z
Wyjątki (exceptions)
Instrukcja laboratoryjna nr 6 Programowanie w języku C 2 (C++ poziom zaawansowany) Wyjątki (exceptions) dr inż. Jacek Wilk-Jakubowski mgr inż. Maciej Lasota dr inż. Tomasz Kaczmarek Wstęp Wyjątki (ang.
Wprowadzenie do projektu QualitySpy
Wprowadzenie do projektu QualitySpy Na podstawie instrukcji implementacji prostej funkcjonalności. 1. Wstęp Celem tego poradnika jest wprowadzić programistę do projektu QualitySpy. Będziemy implementować
Informatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018
Informatyka I Klasy i obiekty. Podstawy programowania obiektowego dr inż. Andrzej Czerepicki Politechnika Warszawska Wydział Transportu 2018 Plan wykładu Pojęcie klasy Deklaracja klasy Pola i metody klasy
Kurs programowania. Wykład 2. Wojciech Macyna. 17 marca 2016
Wykład 2 17 marca 2016 Dziedziczenie Klasy bazowe i potomne Dziedziczenie jest łatwym sposobem rozwijania oprogramowania. Majac klasę bazowa możemy ja uszczegółowić (dodać nowe pola i metody) nie przepisujac
Metody dostępu do danych
Metody dostępu do danych dr inż. Grzegorz Michalski Na podstawie materiałów dra inż. Juliusza Mikody Jak działa JDO Podstawowym zadaniem JDO jest umożliwienie aplikacjom Javy transparentnego umieszczenia
UML a kod. C++, Java i C#
UML a kod C++, Java i C# UML a kod w C++ i Javie Projektowanie oprogramowania! Dokumentowanie oprogramowania Diagramy przypadków użycia Klasy użytkowników i wykorzystywane funkcje Mogą sugerować podział
Dziedziczenie jednobazowe, poliformizm
Dziedziczenie jednobazowe, poliformizm 1. Dziedziczenie jednobazowe 2. Polimorfizm część pierwsza 3. Polimorfizm część druga Zofia Kruczkiewicz, ETE8305_6 1 Dziedziczenie jednobazowe, poliformizm 1. Dziedziczenie
XQTav - reprezentacja diagramów przepływu prac w formacie SCUFL przy pomocy XQuery
http://xqtav.sourceforge.net XQTav - reprezentacja diagramów przepływu prac w formacie SCUFL przy pomocy XQuery dr hab. Jerzy Tyszkiewicz dr Andrzej Kierzek mgr Jacek Sroka Grzegorz Kaczor praca mgr pod
Rozdział 4 KLASY, OBIEKTY, METODY
Rozdział 4 KLASY, OBIEKTY, METODY Java jest językiem w pełni zorientowanym obiektowo. Wszystkie elementy opisujące dane, za wyjątkiem zmiennych prostych są obiektami. Sam program też jest obiektem pewnej
Programowanie obiektowe
Programowanie obiektowe Laboratorium 3 i 4 - przypomnienie wiadomości o OOP na przykładzie Javy mgr inż. Krzysztof Szwarc krzysztof@szwarc.net.pl Sosnowiec, 8 marca 2017 1 / 20 mgr inż. Krzysztof Szwarc
Współpraca Integry z programami zewnętrznymi
Współpraca Integry z programami zewnętrznymi Uwaga! Do współpracy Integry z programami zewnętrznymi potrzebne są dodatkowe pliki. MoŜna je pobrać z sekcji Download -> Pozostałe po zalogowaniu do Strefy
Technologie i usługi internetowe cz. 2
Technologie i usługi internetowe cz. 2 Katedra Analizy Nieliniowej, WMiI UŁ Łódź, 15 luty 2014 r. 1 Programowanie obiektowe Programowanie obiektowe (z ang. object-oriented programming), to paradygmat programowania,
Obiekt klasy jest definiowany poprzez jej składniki. Składnikami są różne zmienne oraz funkcje. Składniki opisują rzeczywisty stan obiektu.
Zrozumienie funkcji danych statycznych jest podstawą programowania obiektowego. W niniejszym artykule opiszę zasadę tworzenia klas statycznych w C#. Oprócz tego dowiesz się czym są statyczne pola i metody
Platformy Technologiczne
i Platformy Technologiczne Laboratorium nr 5 Java: testy jednostkowe z biblioteką JUnit Projekt opracowany w ramach laboratorium nr 5 będzie wykorzystywany w czasie laboratorium nr 6 należy zachować przygotowaną
Informatyka I. Dziedziczenie. Nadpisanie metod. Klasy abstrakcyjne. Wskaźnik this. Metody i pola statyczne. dr inż. Andrzej Czerepicki
Informatyka I Dziedziczenie. Nadpisanie metod. Klasy abstrakcyjne. Wskaźnik this. Metody i pola statyczne. dr inż. Andrzej Czerepicki Politechnika Warszawska Wydział Transportu 2017 Dziedziczenie klas
Język JAVA podstawy. wykład 2, część 1. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna
Język JAVA podstawy wykład 2, część 1 1 Język JAVA podstawy Plan wykładu: 1. Rodzaje programów w Javie 2. Tworzenie aplikacji 3. Tworzenie apletów 4. Obsługa archiwów 5. Wyjątki 6. Klasa w klasie! 2 Język
Klasy Obiekty Dziedziczenie i zaawansowane cechy Objective-C
#import "Fraction.h" #import @implementation Fraction -(Fraction*) initwithnumerator: (int) n denominator: (int) d { self = [super init]; } if ( self ) { [self setnumerator: n anddenominator:
Podstawy Programowania Obiektowego
Podstawy Programowania Obiektowego Wprowadzenie do programowania obiektowego. Pojęcie struktury i klasy. Spotkanie 03 Dr inż. Dariusz JĘDRZEJCZYK Tematyka wykładu Idea programowania obiektowego Definicja
Aplikacje w środowisku Java
Aplikacje w środowisku Java Materiały do zajęć laboratoryjnych Klasy i obiekty - dziedziczenie mgr inż. Kamil Zieliński Katolicki Uniwersytet Lubelski Jana Pawła II 2018/2019 W ramach poprzedniego laboratorium
Podstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1
Podstawy programowania. Wykład Funkcje Krzysztof Banaś Podstawy programowania 1 Programowanie proceduralne Pojęcie procedury (funkcji) programowanie proceduralne realizacja określonego zadania specyfikacja
Wykład 8: Obsługa Wyjątków
Wykład 8: Obsługa Wyjątków Wyjątki Wyjątek to sytuacja nienormalna, która pojawia się w trakcie wykonania programu. W językach bez obsługi wyjątków, błędy są wykrywane i obsługiwane ręcznie, zwykle przez
Dziedziczenie. dr Jarosław Skaruz
Dziedziczenie dr Jarosław Skaruz http://jareks.ii.uph.edu.pl jaroslaw@skaruz.com Dziedziczenie specjalizacja Dziedziczenie generalizacja Generalizacja-specjalizacja jest takim związkiem pomiędzy klasami,
Programowanie obiektowe i zdarzeniowe wykład 4 Kompozycja, kolekcje, wiązanie danych
Programowanie obiektowe i zdarzeniowe wykład 4 Kompozycja, kolekcje, wiązanie danych Obiekty reprezentują pewne pojęcia, przedmioty, elementy rzeczywistości. Obiekty udostępniają swoje usługi: metody operacje,
Enkapsulacja, dziedziczenie, polimorfizm
17 grudnia 2008 Spis treści I Enkapsulacja 1 Enkapsulacja 2 Spis treści II Enkapsulacja 3 Czym jest interfejs Jak definuje się interfejs? Rozszerzanie interfejsu Implementacja interfejsu Częściowa implementacja
Java: kilka brakujących szczegółów i uniwersalna nadklasa Object
Java: kilka brakujących szczegółów i uniwersalna nadklasa Object Programowanie w językach wysokiego poziomu mgr inż. Anna Wawszczak PLAN WYKŁADU Konstrukcja obiektów Niszczenie obiektów i zwalnianie zasobów
Techniki programowania INP001002Wl rok akademicki 2018/19 semestr letni. Wykład 3. Karol Tarnowski A-1 p.
Techniki programowania INP001002Wl rok akademicki 2018/19 semestr letni Wykład 3 Karol Tarnowski karol.tarnowski@pwr.edu.pl A-1 p. 411B Plan prezentacji Abstrakcja funkcyjna Struktury Klasy hermetyzacja
Zadanie polega na stworzeniu bazy danych w pamięci zapewniającej efektywny dostęp do danych baza osób.
Zadanie: Zadanie polega na stworzeniu bazy danych w pamięci zapewniającej efektywny dostęp do danych baza osób. Na kolejnych zajęciach projekt będzie rozwijana i uzupełniana o kolejne elementy omawiane
Multimedia JAVA. Historia
Multimedia JAVA mgr inż. Piotr Odya piotrod@sound.eti.pg.gda.pl Historia 1990 rozpoczęcie prac nad nowym systemem operacyjnym w firmie SUN, do jego tworzenia postanowiono wykorzystać nowy język programowania
Instrukcja programowania IRSC OPEN
Instrukcja programowania IRSC OPEN Zennio IRSC OPEN (ZN1CL-IRSC) I. UWAGI WSTĘPNE Urządzenie IRSC OPEN umoŝliwia wykorzystanie w systemie KNX komend róŝnych pilotów zdalnego sterowania do obsługi urządzeń
Programowanie obiektowe
Programowanie obiektowe IV. Interfejsy i klasy wewnętrzne Małgorzata Prolejko OBI JA16Z03 Plan Właściwości interfejsów. Interfejsy a klasy abstrakcyjne. Klonowanie obiektów. Klasy wewnętrzne. Dostęp do
Obiektowy PHP. Czym jest obiekt? Definicja klasy. Składowe klasy pola i metody
Obiektowy PHP Czym jest obiekt? W programowaniu obiektem można nazwać każdy abstrakcyjny byt, który programista utworzy w pamięci komputera. Jeszcze bardziej upraszczając to zagadnienie, można powiedzieć,
Programowanie Obiektowe Ćwiczenie 4
Programowanie Obiektowe Ćwiczenie 4 1. Zakres ćwiczenia wyjątki kompozycja 2. Zagadnienia Założeniem, od którego nie należy odbiegać, jest by każdy napotkany problem (np. zatrzymanie wykonywanej metody)
PHP 5 język obiektowy
PHP 5 język obiektowy Wprowadzenie Klasa w PHP jest traktowana jak zbiór, rodzaj różnych typów danych. Stanowi przepis jak stworzyć konkretne obiekty (instancje klasy), jest definicją obiektów. Klasa reprezentuje
Dziedziczenie. Streszczenie Celem wykładu jest omówienie tematyki dziedziczenia klas. Czas wykładu 45 minut.
Dziedziczenie Streszczenie Celem wykładu jest omówienie tematyki dziedziczenia klas. Czas wykładu 45 minut. Rozpatrzmy przykład przedstawiający klasy Student oraz Pracownik: class Student class Pracownik
Aplikacje w środowisku Java
Aplikacje w środowisku Java Materiały do zajęć laboratoryjnych Klasy i obiekty - wprowadzenie mgr inż. Kamil Zieliński Katolicki Uniwersytet Lubelski Jana Pawła II 2018/2019 Klasa zbiór pól i metod Obiekt
Klasy. dr Anna Łazińska, WMiI UŁ Podstawy języka Java 1 / 13
Klasy Klasa to grupa obiektów, które mają wspólne właściwości, a obiekt jest instancją klasy. Klasa w języku Java może zawierać: pola - reprezentują stan obiektu (odniesienie do pola z kropką), methods
Aplikacje internetowe i rozproszone - laboratorium
Aplikacje internetowe i rozproszone - laboratorium Enterprise JavaBeans (EJB) Celem tego zestawu ćwiczeń jest zapoznanie z technologią EJB w wersji 3.0, a w szczególności: implementacja komponentów sesyjnych,
Języki i techniki programowania Ćwiczenia 2
Języki i techniki programowania Ćwiczenia 2 Autor: Marcin Orchel Spis treści: Język C++... 5 Przekazywanie parametrów do funkcji... 5 Przekazywanie parametrów w Javie.... 5 Przekazywanie parametrów w c++...
Kurs programowania. Wykład 1. Wojciech Macyna. 3 marca 2016
Wykład 1 3 marca 2016 Słowa kluczowe języka Java abstract, break, case, catch, class, const, continue, default, do, else, enum, extends, final, finally, for, goto, if, implements, import, instanceof, interface,
Analiza i projektowanie oprogramowania. Analiza i projektowanie oprogramowania 1/32
Analiza i projektowanie oprogramowania Analiza i projektowanie oprogramowania 1/32 Analiza i projektowanie oprogramowania 2/32 Cel analizy Celem fazy określania wymagań jest udzielenie odpowiedzi na pytanie:
Java podstawy jęyka. Wykład 2. Klasy abstrakcyjne, Interfejsy, Klasy wewnętrzne, Anonimowe klasy wewnętrzne.
Java podstawy jęyka Wykład 2 Klasy abstrakcyjne, Interfejsy, Klasy wewnętrzne, Anonimowe klasy wewnętrzne. Wyjątki: obsługa błędów Wydział Fizyki i Informatyki Stosowanej, Uniwersytetu Łódzkiego 12.03.2015
PROE wykład 2 operacje na wskaźnikach. dr inż. Jacek Naruniec
PROE wykład 2 operacje na wskaźnikach dr inż. Jacek Naruniec Zmienne automatyczne i dynamiczne Zmienne automatyczne: dotyczą kontekstu, po jego opuszczeniu są usuwane, łatwiejsze w zarządzaniu od zmiennych
Język JAVA podstawy. Wykład 4, część 1. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna
Język JAVA podstawy Wykład 4, część 1 1 Język JAVA podstawy Plan wykładu: 1. Podstawy modelowania obiektowego 2. Konstruktory 3. Dziedziczenie, związki pomiędzy klasami, UML 4. Polimorfizm 5. Klasy abstrakcyjne
Polimorfizm, metody wirtualne i klasy abstrakcyjne
Programowanie obiektowe Polimorfizm, metody wirtualne i klasy abstrakcyjne Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki Politechniki Wrocławskiej pawel.rogalinski pwr.wroc.pl Polimorfizm,
Laboratorium nr 5. Temat: Funkcje agregujące, klauzule GROUP BY, HAVING
Laboratorium nr 5 Temat: Funkcje agregujące, klauzule GROUP BY, HAVING Celem ćwiczenia jest zaprezentowanie zagadnień dotyczących stosowania w zapytaniach języka SQL predefiniowanych funkcji agregujących.
Interfejsy i klasy wewnętrzne
Interfejsy i klasy wewnętrzne mgr Tomasz Xięski, Instytut Informatyki, Uniwersytet Śląski Katowice, 2011 Interfejs klasy sposób komunikacji z jej obiektami (zestaw składowych publicznych). Określa on zestaw
Programowanie obiektowe
Programowanie obiektowe Literatura: Autor: dr inŝ. Zofia Kruczkiewicz Java P. L. Krzysztof Lemay, Naughton Barteczko R. Cadenhead JAVA, Java Podręcznik 2 wykłady dla kaŝdego Języka i ćwiczenia Programowania
Marcin Luckner Politechnika Warszawska Wydział Matematyki i Nauk Informacyjnych
Marcin Luckner Politechnika Warszawska Wydział Matematyki i Nauk Informacyjnych mluckner@mini.pw.edu.pl http://www.mini.pw.edu.pl/~lucknerm Programy w Javie składają się z pakietów Pakiety zawierają definicje
Programowanie obiektowe
Laboratorium z przedmiotu - zestaw 02 Cel zajęć. Celem zajęć jest zapoznanie z praktycznymi aspektami projektowania oraz implementacji klas i obiektów z wykorzystaniem dziedziczenia. Wprowadzenie teoretyczne.
Kompozycja i dziedziczenie klas
Związki między klasami: jest i zawiera Programowanie obiektowe Przkład: Pojazd Kompozycja i dziedziczenie klas Silnik Pojazd silnikowy Rower Wóz konny Paweł Rogaliński Instytut Informatyki, Automatyki
Pakiety i interfejsy. Tomasz Borzyszkowski
Pakiety i interfejsy Tomasz Borzyszkowski Pakiety podstawy W dotychczasowych przykładach nazwy klas musiały pochodzić z jednej przestrzeni nazw, tj. być niepowtarzalne tak, by nie doprowadzić do kolizji
Tutorial prowadzi przez kolejne etapy tworzenia projektu począwszy od zdefiniowania przypadków użycia, a skończywszy na konfiguracji i uruchomieniu.
AGH, EAIE, Informatyka Winda - tutorial Systemy czasu rzeczywistego Mirosław Jedynak, Adam Łączyński Spis treści 1 Wstęp... 2 2 Przypadki użycia (Use Case)... 2 3 Diagramy modelu (Object Model Diagram)...
Programowanie obiektowe - 1.
Programowanie obiektowe - 1 Mariusz.Masewicz@cs.put.poznan.pl Programowanie obiektowe Programowanie obiektowe (ang. object-oriented programming) to metodologia tworzenia programów komputerowych, która
Programowanie 2. Język C++. Wykład 3.
3.1 Programowanie zorientowane obiektowo... 1 3.2 Unie... 2 3.3 Struktury... 3 3.4 Klasy... 4 3.5 Elementy klasy... 5 3.6 Dostęp do elementów klasy... 7 3.7 Wskaźnik this... 10 3.1 Programowanie zorientowane
Klasy abstrakcyjne i interfejsy
Klasy abstrakcyjne i interfejsy Streszczenie Celem wykładu jest omówienie klas abstrakcyjnych i interfejsów w Javie. Czas wykładu 45 minut. Rozwiązanie w miarę standardowego zadania matematycznego (i nie
Wyjątki Monika Wrzosek (IM UG) Programowanie obiektowe 180 / 196
Wyjątki 180 / 196 Wyjątki W Javie istnieje mechanizm tzw. wyjątków (ang. exception), który pozwala na przechwytywanie błędów pojawiających się w programie. Kompilacja tab [ 1 0 ] = 100; spowoduje powstanie
9.5 Rozliczanie zaopatrzenia w przedmioty ortopedyczne i środki pomocnicze
Fragment instrukcji obsługi systemu SZOI przygotowanej przez P.I. Kamsoft - 09.02.2009 r. 9.5 Rozliczanie zaopatrzenia w przedmioty ortopedyczne i środki pomocnicze Obszar Sprawozdawczość/Zaopatrzenie
Język JAVA podstawy. wykład 2, część 2. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna
Język JAVA podstawy wykład 2, część 2 Jacek Rumiński 1 Język JAVA podstawy Plan wykładu: 1. Rodzaje programów w Javie 2. Tworzenie aplikacji 3. Tworzenie apletów 4. Obsługa archiwów 5. Wyjątki 6. Klasa
Zdalne wywołanie metod - koncepcja. Oprogramowanie systemów równoległych i rozproszonych Wykład 7. Rodzaje obiektów. Odniesienie do obiektu
Zdalne wywołanie metod - koncepcja Oprogramowanie systemów równoległych i rozproszonych Wykład 7 RMI (Remote Method Invocation) - obiektowe RPC, dostarcza klientowi interfejs do obiektu, implementacja
Oprogramowanie systemów równoległych i rozproszonych Wykład 7
Wykład 7 p. 1/2 Oprogramowanie systemów równoległych i rozproszonych Wykład 7 Dr inż. Tomasz Olas olas@icis.pcz.pl Instytut Informatyki Teoretycznej i Stosowanej Politechnika Częstochowska Zdalne wywołanie
D:\DYDAKTYKA\ZAI_BIS\_Ćwiczenia_wzorce\04\04_poprawiony.doc 2009-lis-23, 17:44
Zaawansowane aplikacje internetowe EJB 1 Rozróżniamy dwa rodzaje beanów sesyjnych: Stateless Statefull Celem tego laboratorium jest zbadanie różnic funkcjonalnych tych dwóch rodzajów beanów. Poszczególne
Komunikaty statystyczne medyczne
Komunikaty statystyczne-medyczne (raporty statystyczne SWX) zawierają informację o usługach medycznych wykonanych przez świadczeniodawcę. Przekazany przez świadczeniodawcę komunikat podlega sprawdzeniu
PROJEKT CZĘŚCIOWO FINANSOWANY PRZEZ UNIĘ EUROPEJSKĄ. Opis działania raportów w ClearQuest
PROJEKT CZĘŚCIOWO FINANSOWANY PRZEZ UNIĘ EUROPEJSKĄ Opis działania raportów w ClearQuest Historia zmian Data Wersja Opis Autor 2008.08.26 1.0 Utworzenie dokumentu. Wersja bazowa dokumentu. 2009.12.11 1.1
Wzorce Strukturalne. Adapter: opis. Tomasz Borzyszkowski
Adapter: opis Wzorce Strukturalne Tomasz Borzyszkowski Alternatywna nazwa: Wrapper (opakowanie) Rola obiektu Adapter: pełni wobec Klienta rolę otoczki, która umożliwia przetłumaczenie jego żądań na protokół
Informacje ogólne. Karol Trybulec p-programowanie.pl 1. 2 // cialo klasy. class osoba { string imie; string nazwisko; int wiek; int wzrost;
Klasy w C++ są bardzo ważnym narzędziem w rękach programisty. Klasy są fundamentem programowania obiektowego. Z pomocą klas będziesz mógł tworzyć lepszy kod, a co najważniejsze będzie on bardzo dobrze
Programowanie obiektowe Wykład 6. Dariusz Wardowski. dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/14
Dariusz Wardowski dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/14 Wirtualne destruktory class A int* a; A(int _a) a = new int(_a);} virtual ~A() delete a;} class B: public A double* b;
Klasa jest nowym typem danych zdefiniowanym przez użytkownika. Najprostsza klasa jest po prostu strukturą, np
Klasy Klasa jest nowym typem danych zdefiniowanym przez użytkownika Wartości takiego typu nazywamy obiektami Najprostsza klasa jest po prostu strukturą, np struct Zespolona { Klasy jako struktury z operacjami
Baza danych sql. 1. Wprowadzenie. 2. Repozytaria generyczne
Baza danych sql 1. Wprowadzenie Do tej pory operowaliście na listach. W tej instrukcji pokazane zostanie jak stworzyć bazę danych. W zadaniu skorzystamy z możliwości utworzenia struktury bazy danych z
Podstawy obsługi aplikacji Generator Wniosków Płatniczych
Podstawy obsługi aplikacji Generator Wniosków Płatniczych 1. Instalacja programu Program naleŝy pobrać ze strony www.simik.gov.pl. Instalację naleŝy wykonań z konta posiadającego uprawnienia administratora