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

Podobne dokumenty
Testowanie II. Cel zajęć. Pokrycie kodu

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

Zaawansowane aplikacje WWW - laboratorium

Sposoby tworzenia projektu zawierającego aplet w środowisku NetBeans. Metody zabezpieczenia komputera użytkownika przed działaniem apletu.

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

Budowa aplikacji wielowarstwowych zastosowanie szablonów. Laboratorium 2 Programowanie komponentowe Zofia Kruczkiewicz

Programowanie obiektowe

Programowanie Obiektowe Ćwiczenie 4

- Narzędzie Windows Forms. - Przykładowe aplikacje. Wyższa Metody Szkoła programowania Techniczno Ekonomiczna 1 w Świdnicy

Politechnika Gdańska Katedra Optoelektroniki i Systemów Elektronicznych

Programowanie zespołowe

2) W wyświetlonym oknie należy zaznaczyć chęć utworzenia nowej aplikacji (wygląd okna może się różnić od powyższego); kliknąć OK

Java Programowanie Obiektowe Ćwiczenie 1- wprowadzenie

Klasy i obiekty cz II

D:\DYDAKTYKA\ZAI_BIS\_Ćwiczenia_wzorce\04\04_poprawiony.doc 2009-lis-23, 17:44

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

Aplikacje internetowe i rozproszone - laboratorium

Ćwiczenie 1. Przygotowanie środowiska JAVA

import java.util.*; public class ListExample { public static void main(string args[]) { List<String> lista1= new ArrayList<String> ();

METODY PROGRAMOWANIA

Metody Metody, parametry, zwracanie wartości

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

dr inż. Piotr Czapiewski Tworzenie aplikacji w języku Java Laboratorium 1

Testy jednostkowe - zastosowanie oprogramowania JUNIT 4.0 Zofia Kruczkiewicz

Kurs języka Python. Wykład 11. Marcin Młotkowski. 4 stycznia Kontrola poprawności podczas biegu programu. 2 Testowanie oprogramowania

Ćwiczenie 1. Kolejki IBM Message Queue (MQ)

1. Co można powiedzieć o poniższym kodzie (zakładając, że zaimportowano wszystkie niezbędne klasy)?

ASP.NET MVC. Podstawy. Zaawansowane programowanie internetowe Instrukcja nr 3

Java pierwszy program w Eclipse «Grzegorz Góralski strona własna

WSNHiD, Programowanie 2 Lab. 2 Język Java struktura programu, dziedziczenie, abstrakcja, polimorfizm, interfejsy

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

Po uruchomieniu programu nasza litera zostanie wyświetlona na ekranie

Języki i metody programowania Java Lab2 podejście obiektowe

Laboratorium 1. I. Zainstaluj program Eclipse (wersja C/C++ w odpowiednim systemie operacyjnym

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

Microsoft.NET: ASP.NET MVC + Entity Framework (Code First)

Narzędzia i aplikacje Java EE. Usługi sieciowe Paweł Czarnul pczarnul@eti.pg.gda.pl

Programowanie obiektowe

Zastosowanie komponentów EJB typu Session

Wprowadzenie do laboratorium. Zasady obowiązujące na zajęciach. Wprowadzenie do narzędzi wykorzystywanych podczas laboratorium.

Programowanie kontraktowe w Javie

Zaawansowane aplikacje internetowe

Pętle. for, while, do... while, foreach. Materiał pomocniczy do kursu Podstawy programowania Autor: Grzegorz Góralski ggoralski.

Katalog książek cz. 2

Podstawy języka C++ Maciej Trzebiński. Praktyki studenckie na LHC IFJ PAN. Instytut Fizyki Jądrowej Polskiej Akademii Nauk. M. Trzebiński C++ 1/16

TESTOWANIE OPROGRAMOWANIA

Aplikacje w środowisku Java

Ćwiczenia 9 - Swing - część 1

Zaawansowane aplikacje internetowe - laboratorium Web Services (część 1).

Testy automatyczne. Korzystające z junit

Załącznik 1 instrukcje instalacji

KLASY, INTERFEJSY, ITP

Diagram stanów Laboratorium 9

Tak przygotowane pliki należy umieścić w głównym folderze naszego programu. Klub IKS

Leszek Stasiak Zastosowanie technologii LINQ w

Instrukcja laboratoryjna

Wyrażenie include(sciezka_do_pliku) pozwala na załadowanie (wnętrza) pliku do skryptu php. Plik ten może zawierać wszystko, co może się znaleźć w

Języki i metody programowania Java Lab1 Zofia Kruczkiewicz

Aktywności są związane z ekranem i definiują jego wygląd. Dzieje się to poprzez podpięcie do aktywności odpowiedniego widoku.

Programowanie poprzez testy z wykorzystaniem JUnit

LINQ TO SQL w dużym skrócie jest to zintegrowany język zapytao pozwalający na mapowanie relacyjnych baz danych na model obiektowy.

Laboratorium 8 Diagramy aktywności

Wykład 7: Pakiety i Interfejsy

JAVA W SUPER EXPRESOWEJ PIGUŁCE

Tworzenie i wykorzystanie usług sieciowych

Wykład 2 Wybrane konstrukcje obiektowych języków programowania (1)

Zofia Kruczkiewicz, Programowanie obiektowe - java, wykład 2 1

Wprowadzenie do technologii JavaServer Faces 2.1 na podstawie

Wprowadzenie do technologii JavaServer Faces 2.1 na podstawie

Instrukcje wyboru. Tworzenie programu, Schematy blokowe, Instrukcje wyboru, Operatory logiczne

Programowanie w Javie

Platformy Programistyczne Podstawy języka Java


Instytut Sterowania i Systemów Informatycznych Uniwersytet Zielonogórski. Zaawansowane Systemy Decyzyjne. Laboratorium

Podstawy języka C++ Maciej Trzebiński. Instytut Fizyki Jądrowej Polskiej Akademii Nauk. Praktyki studenckie na LHC IVedycja,2016r.

2. W oknie dialogowym Choose Toolbox Items w zakładce.net Framework Components naciskamy przycisk Browse...

Piotr Dwieczkowski. Code coverage. Mierzenie pokrycia kodu, teoria oraz praktyka w C/C++

Programowanie obiektowe

Instalujemy środowisko. Hello World! Odczyt/zapis informacji do komponentów na formie. onclick()

Platformy Technologiczne

Systemy Rozproszone. Spis treści. Temat projektu: Regułowy system analizujacy logi. autorzy: Rafał Sadłowski, Sebastian Falkus, Michał Różycki

Polimorfizm, metody wirtualne i klasy abstrakcyjne

Badania poziomu bezpieczeństwa portalu dostępowego do infrastruktury projektu PL-Grid

Programowanie obiektowe

Programowanie obiektowe i zdarzeniowe wykład 4 Kompozycja, kolekcje, wiązanie danych

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

Wykład 12. Programowanie serwera MS SQL 2005 w C#

Refaktoryzacja. Na podstawie

Laboratorium 01: Poznanie środowiska programowania w języku Java [2h]

MVC w praktyce tworzymy system artykułów. cz. 1

Część XV C++ Ćwiczenie 1

Kurs programowania. Wykład 13. Wojciech Macyna. 14 czerwiec 2017

KLASA UCZEN Uczen imię, nazwisko, średnia konstruktor konstruktor Ustaw Wyswietl Lepszy Promowany

Programowanie - instrukcje sterujące

Visual Basic Debugging and Error Handling

Wątki. Definiowanie wątków jako klas potomnych Thread. Nadpisanie metody run().

Program szkoleniowy. 24 h dydaktycznych (18 h zegarowych) NAZWA SZCZEGÓŁY CZAS

Systemy operacyjne na platformach mobilnych

Instrukcje wyboru. Tworzenie programu, Schematy blokowe, Instrukcje wyboru, Operatory logiczne

Transkrypt:

Testowanie II Cel zajęć Celem zajęć jest zapoznanie studentów z oceną jakości testów przy wykorzystaniu metryk pokrycia kodu testami (ang. code coverage). Pokrycie kodu testami Jak już była mowa na poprzednich zajęciach testy nie są w stanie zagwarantować, że w oprogramowaniu nie ma błędów. Trzeba jednak się zastanowić, czy można zrobić coś, aby nasze testy znajdowały jak największą liczbę błędów? Czy można w jakiś sposób sprawdzić jakość naszych testów (przez jakość rozumiemy tutaj znalezienie jak największej ilości błędów)? Jednym ze sposobów mierzenia jakości testów jest sprawdzanie pokrycia kodu. Możemy wyróżnić między innymi: a) pokrycie wyrażeń/linii (ang. statement/line coverage) Sprawdza, czy sterowanie przeszło przez każde wyrażenie dostępne w kodzie. public int additems(list items) { if (items!= null) { list.addall(items); return list.size(); następujący test gwarantuje 100% pokrycia wyrażeń: public void testadditems() { assertequals(3, someobject.additems(new ArrayList())); b) pokrycie decyzji (ang. decision coverage) Sprawdza, czy każde wyrażenie logiczne przyjęło wartość true i false. Całe wyrażenie logiczne jest brane w tym przypadku pod uwagę, bez względu na podwyrażenia logiczne połączone operatorami AND (&&) lub OR ( ). public int additem(object item) { if (item!= null) { list.add(items); return list.size(); następujący test gwarantuje 50% pokrycia decyzji, gdyż warunek w instrukcji warunkowej przyjmuje jedynie wartość true: public void testadditems() { assertequals(1, someobject.additem(new Object()));

c) pokrycie warunków (ang. condition coverage) Podobobne do pokrycia decyzji, bierze jednak pod uwagę wartośći jakie przyjmują podwyrażenia logiczne. d) pokrycie ścieżek (ang. path coverage) Weryfikuje, czy każda możliwa ścieżka wykonania została sprawdzona. public int calculate() { int result = 0; if (a > 0) { result += a; if (b > 0) { result += b; return result; następujący test gwarantuje 25% pokrycia ścieżek, gdyż tylko jedna z czterech możliwych ścieżek została sprawdzona: public void testcalculate() { object.a = 2; assertequals(2, object.calculate()); dopiero następujący test gwarantuje 100% pokrycia ścieżek: public void testcalculate() { object.a = 2; assertequals(2, object.calculate()); object.a = 0; assertequals(0, object.calculate()); object.a = 3; object.b = 1; assertequals(4, object.calculate()); object.a = 0; object.b = 1; assertequals(1, object.calculate()); e) pokrycie metod (ang. methid coverage) Sprawdza, czy wszystkie dostępne metody zostały wywołane podczas testowania. f) pokrycie klas (ang. class coverage) Sprawdza, czy wszystkie klasy zostały zainicjalizowane chociaż raz.

Wybrane problemy Sprawdzanie pokrycia kodu testami daje nam pewną informację o jakości naszych testów, nie możemy jednak polegać na nim całkowicie. Poniżej przedstawione jest kilka sytuacji pokazujących, że takie podejście może być czasem mylące: a) 100% pokrycia nie gwarantuje jakości! public List addobject(list list, Object o) { list.add(o); return list; następujący test gwarantuje 100% pokrycia wyrażeń, decyzji, warunków, metod, klass, ale nic tak naprawdę nie testuje, bo nie ma w nim żadnej instrukcji assert*: public void testaddobject() { object.addobject(new ArrayList(), new Object()); object.addobject(null, null); public int multiply(int x, int y) { return x + y; następujący test gwarantuje 100% pokrycia wyrażeń, decyzji, warunków, metod, klass, ale źle dobrane dane wejściowe powodują, że test nie wykrywa błędu: public void testadd() { assertequals(4, object.multiply(2, 2)); b) Czasami 100% pokrycie nie może być osiągnięte! public List<String> addobject(list<string> list, String newname) { for (String name : list) { System.out.println(name); System.out.println("-----------"); list.add(newname); return list; nie możliwe jest stworzenie testu ze 100% pokryciem ścieżek. c) Co z testowaniem pętli? Czy wystarczy jeśli kod pętli został wykonany tylko raz?

Badanie pokrycia kodu przy pomocy narzędzia EclEmma EclEmma to wtyczka do Eclipse'a pozwalająca nam sprawdzić pokrycie kodu testami. 1. Zaimportuj projekt z pliku CodeCoverage4Students.zip (File->Import->Existing Project Into Workspace). 2. W widoku Package Explorer znajdź plik BootsTest.java, kliknij na nim PPM i wybierz opcję Coverage As -> JUnit Test: 3. Zostanie uruchomiony test. W widoku JUnit widzimy, że test przeszedł, co jednak z pokryciek kodu testami? W widoku Coverage (jeśli widok nie pojawił się automatycznie możemy go otworzyć przez Window->Show View->Other...) widzimy statystyki. Dodatkowo gdy otworzymy nasze klasy zauważym, że nasz kod został oznaczony kolorami. I tak: kolor zielony onacza, że linia została całkowicie pokryta kolor żółty oznacza, że linia została częściowo pokryta kolor czerwony oznacza, że linia w ogóle nie została wykonana W naszym przykładzie testujemy klasę Boots, a dokładniej jej metodę printsummary, która jest zdefiniowana w klasie Item. Otwórzmy zatem klasę Item i spójrzy na metodę printsummary: public String printsummary() { String summary = ""; if (type == THIS_YEAR) { summary += "NEW!\n"; if (producername!= null && producername.length() > 0) { summary += "Producer: " + producername + "\n"; int totaldiscountamount = 0; for (Discount discount : currentdiscountslist) { totaldiscountamount += discount.getpercentage(); if (totaldiscountamount > 0) { if (totaldiscountamount > 30) { totaldiscountamount = 30; summary += "Discount: " + totaldiscountamount + "%\n"; summary += "Final Price: " + (price * (1 - (totaldiscountamount / 100))) + "\n"; summary += printdetails(); return summary; Możemy zauważyć, że nasz test nie przechodzi przez wszystkie linie kodu metody oraz nie sprawdza wszystkich wartości wyrażeń logicznych. Należałoby dopisać dodatkowe testy, tak aby pokrycie było jak największe.

Ćwiczenie Wyobraźmy sobie sytuację, że jesteśmy w trakcie pisania systemu dla sklepu interentowego zajmującego się sprzedażą sprzętu narciarskiego. Częśc systemu mamy już napisaną, brakuje nam jednak kilku testów. Naszym zadaniem będzie dopisanie testów dla istniejących klas, tak aby znaleźć istniejące błędy oraz aby pokrycie kody testami było jak największe. 1. Jeśli jeszcze twego wcześniej nie zrobiłeś to zaimportuj projekt z pliku CodeCoverage4Students.zip (File->Import->Existing Project Into Workspace). 2. Przejrzyj kod znajdujący się w katalogu src, a następnie napisz dla niego testy i sprawdź dla nich pokrycie kodu. Opis metod znajduje się w komentarzach JavaDoc. 3. Po napisaniu testów popraw znalezione błędy.