INŻYNIERIA OROGRAMOWANIA TESTOWANIE JEDNOSTKOWE 2015/2016

Podobne dokumenty
Testowanie I. Celem zajęć jest zapoznanie studentów z podstawami testowania ze szczególnym uwzględnieniem testowania jednostkowego.

Maciej Oleksy Zenon Matuszyk

Michał Olejnik. 22 grudnia 2009

Język programowania. Andrzej Bobyk

Automatyzacja testowania oprogramowania. Automatyzacja testowania oprogramowania 1/36

Wykład 8. Testowanie w JEE 5.0 (1) Autor: Zofia Kruczkiewicz. Zofia Kruczkiewicz

Testowanie oprogramowania. Testowanie oprogramowania 1/34

Porównanie metod i technik testowania oprogramowania. Damian Ryś Maja Wojnarowska

Testowanie II. Cel zajęć. Pokrycie kodu

Testy poziom po poziomie

LABARATORIUM 9 TESTY JEDNOSTKOWE JUNIT 3.8

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

Technologie obiektowe

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

Kurs programowania. Wstęp - wykład 0. Wojciech Macyna. 22 lutego 2016

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

Zespół: Agata Chrobak Kornel Jakubczyk Tomek Klukowski Przemek Kosiak. Projekt SZOP Plan testów

Technologie i usługi internetowe cz. 2

METODY PROGRAMOWANIA

Programowanie poprzez testy z wykorzystaniem JUnit

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

Program szkolenia: Test Driven Development (TDD) using Spock or JUnit 5

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

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

Podstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1

Zawód tester, czyli na czym polega testowanie. Katarzyna Łabinska Justyna Sacha - Gawlik

Aplikacje w środowisku Java

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

PHP 5 język obiektowy

Testowanie oprogramowania. Wykład 1 dlaczego testowanie jest niezbędne czym jest testowanie ogólne zasady testowania

Platformy Technologiczne

Programowanie obiektowe

Informatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018

Materiały do zajęć VII

Podstawy Programowania Obiektowego

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

TEMAT : KLASY DZIEDZICZENIE

Testy automatyczne. Korzystające z junit

Java Język programowania

Testowanie oprogramowania

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

Programowanie obiektowe - 1.

Enkapsulacja, dziedziczenie, polimorfizm

Programowanie obiektowe. Literatura: Autor: dr inŝ. Zofia Kruczkiewicz

Testowanie elementów programowalnych w systemie informatycznym

Wykład 8: klasy cz. 4

Fuzzing OWASP The OWASP Foundation Piotr Łaskawiec J2EE Developer/Pentester

Kumulowanie się defektów jest możliwe - analiza i potwierdzenie tezy

Zaawansowane programowanie w języku C++ Klasy w C++

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

Programowanie zespołowe

Wstęp do programowania obiektowego. Wykład 2

Dlaczego testowanie jest ważne?

Krótkie wprowadzenie do ModelSim i Quartus2

Programowanie obiektowe

Klasy i obiekty cz II

INŻYNIERIA OPROGRAMOWANIA TESTOWANIE INTEGRACYJNE

12) Wadą modelu kaskadowego jest: Zagadnienia obowiązujące na egzaminie z inżynierii oprogramowania: 13) Wadą modelu opartego na prototypowaniu jest:

Multimedia JAVA. Historia

Techniki efektywnego testowania kodu dla programistów Java (Spock

TESTOWANIE OPROGRAMOWANIA

JAVA. Java jest wszechstronnym językiem programowania, zorientowanym. apletów oraz samodzielnych aplikacji.

Testowanie oprogramowania. Piotr Ciskowski

znajdowały się różne instrukcje) to tak naprawdę definicja funkcji main.

Całościowe podejście do testowania automatycznego dla programistów. (TDD, BDD, Spec. by Example, wzorce, narzędzia)

Języki i techniki programowania Ćwiczenia 2

Marcin Luckner Politechnika Warszawska Wydział Matematyki i Nauk Informacyjnych

Programowanie kontraktowe w Javie

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

PRZEWODNIK PO PRZEDMIOCIE

Dziedziczenie. dr Jarosław Skaruz

Zaawansowane programowanie w języku C++

Dokumentacja do API Javy.

Projektowanie oprogramowania. Wykład Weryfikacja i Zatwierdzanie Inżynieria Oprogramowania Kazimierz Michalik

Klasa jest nowym typem danych zdefiniowanym przez użytkownika. Najprostsza klasa jest po prostu strukturą, np

REFERAT PRACY DYPLOMOWEJ

Możliwe strategie tworzenia niezawodnego oprogramowania:

Testowanie II. Celem zajęć jest zapoznanie studentów z oceną jakości testów przy wykorzystaniu metryk pokrycia kodu testami (ang. code coverage).

Programowanie obiektowe

Zakres tematyczny dotyczący podstaw programowania Microsoft Office Excel za pomocą VBA

Testowanie i walidacja oprogramowania

Wykład VII. Programowanie III - semestr III Kierunek Informatyka. dr inż. Janusz Słupik. Wydział Matematyki Stosowanej Politechniki Śląskiej

Programowanie obiektowe

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

Spring Web MVC, Spring DI

Techniki programowania INP001002Wl rok akademicki 2018/19 semestr letni. Wykład 3. Karol Tarnowski A-1 p.

Czym są właściwości. Poprawne projektowanie klas

Opis metody pracy Komisji podczas Kwalifikacji TestingCup 2017

Java - tablice, konstruktory, dziedziczenie i hermetyzacja

Konwerter Plan testów. Jakub Rauch Tomasz Gołębiowski Adam Busch Bartosz Franaszek 1 czerwca 2008

Programowanie obiektowe

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

Historia modeli programowania

Instrukcja laboratoryjna

Testy jednostkowe Wybrane problemy testowania metod rekurencyjnych

Tworzenie przypadków testowych

Instrukcja laboratoryjna cz.3

Dziedziczenie jednobazowe, poliformizm

INŻYNIERIA OPROGRAMOWANIA TESTOWANIE SYSTEMOWE

Przypadki testowe. Spis treści. Plan testów. From Sęp. Wstęp. 2 Plan testów

Transkrypt:

INŻYNIERIA OROGRAMOWANIA TESTOWANIE JEDNOSTKOWE 2015/2016

Czemu testowanie jest ważne? 1994 gra Król Lew Błąd Excela 2007 (ile to jest 850*77,1?) 1987 Therac-25 (race condition, dokumentacja) i Cobalt60 (początek XX w) 1962 Sonda Mariner I samozniszczenie w 294 s ( najdroższy łącznik w historii ) zagrożenie bezpieczeństwa cywilnego 1998 Sonda Mars Climate Orbiter (różne systemy metryczne w różnych zespołach programistów) koszt 125 mln $ 1996 Rakieta Ariane 5 (błąd konwersji liczby 64-bitowej na 16 bitową) Procedura samozniszczenia po 39 s, koszt 500 mln $

Cele testowania (wg sylabusa ISTQB) Znajdowanie usterek Nabieranie zaufania do poziomu jakości Dostarczanie informacji do podejmowania decyzji (liczba błędów, odsetek pokrytych wymagań) Zapobieganie defektom (przez sam fakt projektowania testów)

Podstawowe pojęcia Obiekt testowany wyizolowana instancja klasy, która podlega testom Przypadek testowy weryfikacja poprawności konkretnego (pojedynczego) zachowania 1 metody w określonych warunkach. Dla każdej metody istnieje 1 lub więcej przypadków testowych, po jednym dla każdego rodzaju zachowania metody. Klasa testująca klasa z przypadkami testowymi dotyczącymi jednego obiektu testowanego

Testowanie to proces uruchamiania oprogramowania i jego obserwacji w poszukiwaniu błędów, nie zaś proces sprawdzania jego poprawności, gdyż nie jest to możliwe. Dlaczego? Zbyt wiele wartości parametrów wejściowych (poprawnych i niepoprawnych) Zbyt wiele możliwości przejścia przez kod Trudno oczekiwać sprawdzenia poprawności każdego programu lub złożonych interfejsów TESTOWANIE MA NA CELU ZNALEZIENIE JAK NAJWIĘKSZEJ LICZBY BŁEDÓW I PÓŹNIEJSZE ICH USUNIĘCIE

Biała skrzynka Potrzebna kompletna wiedza nt. budowy kodu Instrukcje warunkowe: a==b (2 testy) a>b (3 testy) instrukcje złożone dużo Zagnieżdżenia w pętlach mogą powodować lawinowy wzrost liczby przypadków testowych Pętle uruchomienie 0-krotne, 1-krotne, max-krotne Ogromna liczba możliwości powoduje że nie można tych testów przeprowadzić w całości Najłatwiejsze do wykonania w trakcie implementacji Linia kodu jest pokryta testem wówczas, gdy istnieje test którego działanie powoduje jej wykonanie. Zautomatyzowane środowiska testujące i raportujące pokrycie kodu: Rozbudowane typu Clover Proste (Coverlipse, plugin do Eclipse).

Czarna skrzynka Poszukiwanie: nieprawidłowych lub brakujących funkcji, błędów interfejsu, błędów w strukturach danych lub dostępie do zewnętrznych zasobów błędów wymagań funkcjonalnych i niefunkcjonalnych (efektywność), błędów inicjalizacji i finalizacji działania programu

Test jednostkowy (modułowy, komponentowy, podstawowy, programisty) Krótki program (fragment kodu) sprawdzający poprawność działania pojedynczych elementów programu (metod, obiektów). Metoda stosowana zarówno w programowaniu obiektowym jak i proceduralnym Testowanie jednostkowe odbywa się na bardzo niskim poziomie: pojedynczych klas i metod wywoływanych w określonym kontekście i z zadanymi parametrami. Przedmiotem testu jest wykonanie fragmentu kodu, a następnie porównanie rezultatów (stan, wynik liczbowy, zwrócony wyjątek ) z wynikami oczekiwanymi, także negatywnymi (niepowodzenie w działaniu oprogramowania również podlega testowaniu).

WAŻNE! TESTY JEDNOSTKOWE WYKONUJE PROGRAMISTA LUB TESTER JEDNOSTKOWY NIE JEST URUCHAMIANY CAŁY SYSTEM (PROGRAM) A JEDYNIE WYBRANY OBIEKT/METODA Przypadki testowe dotyczące jednego obiektu testowanego są zebrane wewnątrz jednej klasy testującej: 1klasa testowana = 1 klasa testująca

Analiza ścieżek Określany jest punkt początkowy oraz punkt końcowy dla przeprowadzenia testów, a następnie badany jest przebieg możliwych ścieżek pomiędzy nimi. Istnieją dwie opcje: każda możliwa ścieżka w każdej funkcji została przetestowana ścieżki są niemożliwe do sprawdzenia z powodu istnienia pętli, wówczas stosowane są 2 grupy testów: Boundary test działania w pętli nie są wykonywane lub działania w każdej pętli są wykonywane raz dodatkowo wszystkie ścieżki wewnątrz pętli są raz wykonane (zwracana wartość 0 lub 1 przejście). Interior test działania we wnętrzu pętli uważa się za przetestowane, jeśli zostały wykonane wszystkie ścieżki, które są możliwe przy dwukrotnym powtórzeniu pętli (zwracana wartość- 2 przejścia).

Klasy równoważności Jest to zbiór danych o podobnym sposobie przetwarzania, używanych do przeprowadzenia testu. Wykonanie testu z użyciem kilku elementów zbioru, powoduje uznanie całej klasy za poprawną i zwalnia nas od testowania wszystkich elementów w np. 1000-elementowym zbiorze.

Testowanie wartości brzegowych Rozwinięciem testów z użyciem klas równoważności jest testowanie wartości brzegowych. Wartość brzegowa to wartość znajdująca się wewnątrz, pomiędzy lub tuż przy granicy danej klasy równoważności.

Testowanie składniowe Polega na sprawdzeniu poprawności wprowadzanych danych do systemu: wymuszone wartości pól (bazy danych) autokorekty (MS Office) Zasada "garbage in garbage out brak mechanizmu walidacji danych na wejściu brak testów na tolerancje systemu na błędne dane

Testowanie mutacyjne Technika automatycznego badania, na ile dokładnie testy jednostkowe sprawdzają kod programu. Polega na automatycznym wielokrotnym wprowadzaniu małych losowych błędów w programie i uruchamianiu za każdym razem testów jednostkowych, które powinny te błędy wykryć. Testowanie mutacyjne wymaga dużej mocy obliczeniowej

TESTOWANIE METOD PRYWATNYCH (?)

W większości przypadków, klasę powinno się dać przetestować poprzez wywołanie jej metod publicznych. Jeżeli za prywatną lub chronioną metodą kryje się duża funkcjonalność, to być może jest to sygnał ostrzegawczy, który mówi ci, że w rzeczywistości ukryta jest tam odrębna klasa, która chciałaby wydostać się na zewnątrz /Thomas D. Hunt A, Pragmatic Unit Testing /

Czy to jest dopuszczalne? TAK. 1. Testuj wszystko, co może nie działać 2. Przetestowanie kodu jest ważniejsze niż zgodność z konwencją programowania obiektowego 3. Co jest ważniejsze: testy czy enkapsulacja?

Czy to jest dopuszczalne? I NIE. 1. Chęć testowania metod prywatnych jest próbą rozwiązania problemu z designem klasy, a więc ucieczką od problemu 2. Jeżeli coś jest zbyt trudne do przetestowania, prawdopodobnie jest to kwestia złej implementacji (code smell) 3. Przy programowaniu obiektowym nie powinno się zaglądać w szczegóły implementacyjne klasy 4. Metody prywatne są dużo częściej zmieniane niż publiczne, stąd ich testy są niemiarodajne 5. Podejście code first a podejście test first 6. Testując metody prywatne narażamy się na testowanie implementacji co przy zmianie kodu może wymusić zmianę testów.

TDD Testowanie całego kodu jedynie przez wywołanie metod interfesju, metody prywatne są wynikiem refaktoryzacji metod istniejących, dlatego też traktuje się je jako już przetestowane: Przykład: 1. Napisanie testu metody A 2. Napisanie metody A 3. REFAKTORYZACJA 4. Napisanie testu metody B 5. Napisanie metody B 6. REFAKTORYZACJA. Jeżeli metoda A i B mają część wspólną należy ją wyłączyć (extract method) w postaci (prywatnej) metody C. Skoro metoda C została wyodrębniona z 2 klas publicznych a więc przetestowanych, to traktuje się ją jako przetestowaną (pomimo jej prywatnego charakteru)

Jak testować metody prywatne? METODA 1. REFLEKSJA Zmiana modyfikatora dostępu (tylko na czas testów). Zaletą jest brak jakichkolwiek zmian w kodzie, wadą jest utrudniony refaktoring. Przykład z JUnit-addons (dodatek do JUnit)

Jak testować metody prywatne? METODA 1. DOMYŚLNY MODYFIKATOR DOSTĘPU Pozwala na dostęp do klasy tylko klasom z tego samego pakietu. Wystarczy, że testy są w tym samym pakiecie co klasa testowana, by po zmianie modyfikatora metod prywatnych na domyślne, mogły być one w ramach tego pakietu testowane. Wada: konieczność modyfikacji kodu źródłowego i dość znaczące odsłonięcie szczegółów implementacji klasy

Przykład: publizize.exe w VisualStudio class Klasa1 { private int PrywatneA; private int PrywatneBB; private event EventHandler Zdarzenie; } Uruchamiamy Visual Studio Command Prompt i wpisujemy: publicize.exe NazwaBiblioteki.dll W wygenerowanej bibliotece prywatne pola (PrywatneA, PrywatneB) będą dostępne jako publiczne. Wygenerowana biblioteka (NazwaBiblioteki_Accessor.dll) nazywana jest Private Accessor. Po podłączeniu do projektu, możemy przekonać się, że prywatne pola zostały zastąpione publicznymi: ClassLibrary1.Klasa_Accessor klasa; klasa.prywatnea = 3; klasa.prywatneb = 6;

Metody niepolecane (ale skuteczne) METODA 3 ASPECTJ czyli ARMATA NA WRÓBLE (niepolecane) Technologia jak i idea programowania aspektowego jest słabo znana i rozpowszechniona, stąd problemy w poprawianiu testów w nim pisanych przez następców METODA 4 (niepolecana) Umieszczenie kodu testującego w wewnętrznej klasie statycznej (wewnątrz klasy testowanej). Będzie miała ona dostęp do metod prywatnych, ale nastąpi wymieszanie kodu z testami, testy wejdą w skład programu wynikowego. KOD TESTUJĄCY W TEJ SAMEJ KLASIE CO KOD TESTOWANY METODA 5 Zadeklarować metodę jako protected i dziedziczyć w innej klasie która obuduje metodę prywatną metodą publiczną (Wrapper)