Základy programovaní 3 - Java. Unit testy. Petr Krajča. Katedra informatiky Univerzita Palackého v Olomouci. 26.,27.



Podobné dokumenty
Testování, ladění a dokumentace programů

Testování software. Jaroslav Žáček

Java testovací třída

JAVA Unit testing Java, zimní semestr

Agenda. Smysl teoretických cvičení Klasifikace Obecná pravidla Bugzilla Klasické problémy Poznámky k jednotlivým pojmům Antipatterns Testování testů

Struktura třídy, operátory, jednoduché algoritmy, junit. Programování II 2. cvičení Alena Buchalcevová

Obsah přednášky 7. Základy programování (IZAPR) Přednáška 7. Parametry metod. Parametry, argumenty. Parametry metod.

Testování software. Jaroslav Žáček

Agenda. Docházka Návrat k minulému praktickému cvičení Zápočtové práce. Dokumentace. Dotazy, přání, stížnosti. Co, jak a proč dokumentovat

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Java - výjimky. private void vstup() throws IOException {... }

Vývoj řízený testy Test Driven Development

Obsah přednášky. Vývoj aplikací řízený testy. Extrémní programování (XP) Požadavky na nástroje pro XP. Testování aplikací

Anywhere - IT-break. Milan Lempera UnitTest.cz

1. Téma 12 - Textové soubory a výjimky

KTE / ZPE Informační technologie

Výčtový typ strana 67

Programové konvence, dokumentace a ladění. Programování II 2. přednáška Alena Buchalcevová

Jak testovat software v praxi. aneb šetříme svůj vlastní čas

3. Je defenzivní programování technikou skrývání implementace? Vyberte jednu z nabízených možností: Pravda Nepravda

Vývoj aplikací řízený testy. Miroslav Beneš

PB161 Programování v jazyce C++ Přednáška 7

PB161 Programování v jazyce C++ Přednáška 7

Komponenty v.net. Obsah přednášky

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

1. Úvodní informace. BI-EP1 Efektivní programování Martin Kačer

Testování. Zadání příkladu. Vytvoření kostry třídy. Obsah:

Algoritmizace a programování

Webové služby a XML. Obsah přednášky. Co jsou to webové služby. Co jsou to webové služby. Webové služby a XML

Textové soubory. alg9 1

Soubor jako posloupnost bytů

Úvod do programovacích jazyků (Java)

Typický prvek kolekce pro české řazení

Quo vadis programování? Automatizace vyhodnocování studentských úloh

Java - řazení objektů

Algoritmizace a programování

Motivační příklad reálný svět. výroba (assembly line)

Úvod do programování - Java. Cvičení č.4

Řídicí struktury. alg3 1

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Stream API. Petr Krajča. Základy programovaní 4 (Java) Katedra informatiky Univerzita Palackého v Olomouci

20. Projekt Domácí mediotéka

Aplikace je program určený pro uživatele. Aplikaci je možné rozdělit na části:

George J. Klir. State University of New York (SUNY) Binghamton, New York 13902, USA

Statické proměnné a metody. Tomáš Pitner, upravil Marek Šabo

Java a XML. 10/26/09 1/7 Java a XML

Úvod do programování v jazyce Java

Principy objektově orientovaného programování

Enterprise Java Beans 3.0

Softwarové komponenty a Internet

III/2 Inovace a zkvalitnění výuky prostřednictvím ICT

Metodiky pro automatické testování webové aplikace. Ondřej Melkes, Martin Komenda

Práce s textem. Třída Character. Třída Character. Třída Character. reprezentuje objekty zapouzdřující hodnotu typu char (boxing / unboxing)

8. přednáška: Soubory a proudy

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Class loader. každá třída (java.lang.class) obsahuje referenci na svůj class loader. Implementace class loaderu

Jakub Čermák Microsoft Student Partner

8 Třídy, objekty, metody, předávání argumentů metod

3. přednáška. Obsah: Řídící struktury sekvence, if-else, switch, for, while, do-while. Zpracování posloupnosti

Java/QE Akademie - Osnova

Testování Java EE aplikací Petr Adámek

Vytváření a použití knihoven tříd

Čipové karty Lekařská informatika

JUnit příklad na použití

Nástroje pro průběžnou integraci a testování

Algoritmizace a programování. Terminálový vstup a výstup

3 KTE / ZPE Informační technologie

RMI Remote Method Invocation

Platforma Java. Petr Krajča. Katedra informatiky Univerzita Palackého v Olomouci. Petr Krajča (UP) KMI/PJA: Seminář V. 27. říjen, / 15

Bridge. Známý jako. Účel. Použitelnost. Handle/Body

Ročníkový projekt. Jaroslav Žáček

zswi/pc-testování.d 10. května

IB111 Programování a algoritmizace. Objektově orientované programování (OOP)

III/2 Inovace a zkvalitnění výuky prostřednictvím ICT

Výchozí a statické metody rozhraní. Tomáš Pitner, upravil Marek Šabo

1. Programování proti rozhraní

ÚVODNÍ ZNALOSTI. datové struktury. správnost programů. analýza algoritmů

Teoretické minimum z PJV

Datové struktury. alg12 1

Programování v Javě I. Únor 2009

INSTALACE PRODUKTU ONTOPIA KNOWLEDGE SUITE

Z. Kotala, P. Toman: Java ( Obsah )

PHP framework Nette. Kapitola Úvod. 1.2 Architektura Nette

17. Projekt Trojúhelníky

Instalace produktu Ontopia. ver (open-source verze)

1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme:

RMI - Distribuované objekty v Javě

Seznamy a iterátory. Kolekce obecně. Rozhraní kolekce. Procházení kolekcí

9. přednáška - třídy, objekty

Náklady na odstranění chyby stoupají, v čím pozdější fázi životního cyklu aplikace je chyba nalezena.

Programování v Javě I. Leden 2008

NetBeans platforma. Evropský sociální fond Praha & EU: Investujeme do vaší budoucnosti

Google Web Toolkit. Martin Šurkovský, SUR března Katedra informatiky

Pokud zadání nerozumíte nebo se vám zdá nejednoznačné, zeptejte se. Pište čitelně, nečitelná řešení nebudeme uznávat.

Řízení reálných projektů, agilní metodiky

Abstraktní datové typy: zásobník

Objektové programování

Univerzita Palackého v Olomouci Radek Janoštík (Univerzita Palackého v Olomouci) Základy programování 4 - C# 10.4.

UJO Framework. revoluční architektura beans. verze

Transkript:

Základy programovaní 3 - Java Unit testy Petr Krajča Katedra informatiky Univerzita Palackého v Olomouci 26.,27. listopad, 2014 Petr Krajča (UP) Unit testy 26.,27. listopad, 2014 1 / 14

Testování zásadní část vývojového cyklu často z mnoho důvodů podceňovaná protože: není na to čas,,vždyt mě to funguje, zkoušel jsem to zákazník to stejně nepozná, když to trochu ošidíme testování je nudné, psát kód je větší zábava atd. řada přístupů k testování od modelu vodopád až k testy řízenému vývoji TDD od ad hoc testů k automatickým při volbě správného přístupu je postačující/vhodné/nutné používat zdravý rozum Petr Krajča (UP) Unit testy 26.,27. listopad, 2014 2 / 14

Druhy testů ad hoc testování unit (jednotkové) testy testování nejmenších částí kódu integrační testy testuje rozhraní mezi jednotlivými částmi systému systémové testy ověřují funkčnost systému jako celku a další akceptační, regresní testy; alfa, beta testování Omezení nelze otestovat vše lze pouze dokázat přítomnost chyby, ne správnost programu problémy s testováním interagujících částí (UI, databáze, atd.) Petr Krajča (UP) Unit testy 26.,27. listopad, 2014 3 / 14

Druhy testů ad hoc testování unit (jednotkové) testy testování nejmenších částí kódu integrační testy testuje rozhraní mezi jednotlivými částmi systému systémové testy ověřují funkčnost systému jako celku a další akceptační, regresní testy; alfa, beta testování Omezení nelze otestovat vše lze pouze dokázat přítomnost chyby, ne správnost programu problémy s testováním interagujících částí (UI, databáze, atd.) Petr Krajča (UP) Unit testy 26.,27. listopad, 2014 3 / 14

Ideální test s nějakou formou testování se setkal asi každý bylo to dobře provedené testování? byl to produktivně strávený čas? nemohl by to udělat někdo jiný? = automatické testování Dobrý (automatický) test rychle napsaný = nechceme s nimi ztrácet čas srozumitelný = chceme testům rozumět rychlý = chceme dělat testy často (kdykoliv je to potřeba) Proč (automaticky) testovat aplikace? ověření, že všechno dělá, co má možnost zjistit, že změna v jedné části nerozbila jinou část příležitost změnit implementaci bez změny rozhraní (refactoring) forma dokumentace Petr Krajča (UP) Unit testy 26.,27. listopad, 2014 4 / 14

Ideální test s nějakou formou testování se setkal asi každý bylo to dobře provedené testování? byl to produktivně strávený čas? nemohl by to udělat někdo jiný? = automatické testování Dobrý (automatický) test rychle napsaný = nechceme s nimi ztrácet čas srozumitelný = chceme testům rozumět rychlý = chceme dělat testy často (kdykoliv je to potřeba) Proč (automaticky) testovat aplikace? ověření, že všechno dělá, co má možnost zjistit, že změna v jedné části nerozbila jinou část příležitost změnit implementaci bez změny rozhraní (refactoring) forma dokumentace Petr Krajča (UP) Unit testy 26.,27. listopad, 2014 4 / 14

Ideální test s nějakou formou testování se setkal asi každý bylo to dobře provedené testování? byl to produktivně strávený čas? nemohl by to udělat někdo jiný? = automatické testování Dobrý (automatický) test rychle napsaný = nechceme s nimi ztrácet čas srozumitelný = chceme testům rozumět rychlý = chceme dělat testy často (kdykoliv je to potřeba) Proč (automaticky) testovat aplikace? ověření, že všechno dělá, co má možnost zjistit, že změna v jedné části nerozbila jinou část příležitost změnit implementaci bez změny rozhraní (refactoring) forma dokumentace Petr Krajča (UP) Unit testy 26.,27. listopad, 2014 4 / 14

Unit testy testují se nejmenší části programu (obsahující nějakou logiku) nejčastěji jednotlivé metody/funkce na základě jejich specifikace očekáváme určite chování (contract) např. na základě vstupů očekáváme specifikovaný výstup/změnu stavu objektu testy by měli být,,hloupé a neobsahovat vlastní,,logiku (různé výpočty, if, for, switch) = riziko vytvoření špatného testu měly by být testovány i mezní případy Petr Krajča (UP) Unit testy 26.,27. listopad, 2014 5 / 14

Frameworky psaní testů by mělo být co nejpohodlnější třídy obsahující metody provádějící jednotlivé testy vyznačeny s pomocí anotací jestli je daný test splněn je dáno pomocí jednotlivých tvrzení (assertions) assertequals(expected, actual) asserttrue(condition)... pro zjednodušení se používají frameworky JUnit, NUnit, atd. = možnost integrace v IDE Petr Krajča (UP) Unit testy 26.,27. listopad, 2014 6 / 14

Příklad použití (1/2) public class Counter { private int state = 0; public Counter() { super(); public void add() { this.state++; public int getvalue() { return this.state; Petr Krajča (UP) Unit testy 26.,27. listopad, 2014 7 / 14

@Test public void basictest2() { Counter c = new Counter(); c.add(); c.add(); Assert.assertEquals(2, c.getvalue()); Petr Krajča (UP) Unit testy 26.,27. listopad, 2014 8 / 14 Příklad použití (2/2) import org.junit.assert; import org.junit.test; public class CounterTest { @Test public void basictest1() { Counter c = new Counter(); c.add(); Assert.assertEquals(1, c.getvalue());

Možné vylepšení a úskaĺı společná inicializace: metody označené @Before společný,,úklid : metody označené @After Co všechno testovat? všechny funkce mající veřejné rozhraní (public metody) nemá smysl testovat soukromé metody ALE! testy by měly projít většinu řádků kódu nemá smysl testovat funkci primitivních getterů/setterů ALE! má smysl testovat důsledky jejich změny Kdy psát unit testy? pokud to jde, před psaním kódu pokud to nejde, je dobré ověřit, že nový test funguje při objevení chyby a před její opravou Petr Krajča (UP) Unit testy 26.,27. listopad, 2014 9 / 14

Možné vylepšení a úskaĺı společná inicializace: metody označené @Before společný,,úklid : metody označené @After Co všechno testovat? všechny funkce mající veřejné rozhraní (public metody) nemá smysl testovat soukromé metody ALE! testy by měly projít většinu řádků kódu nemá smysl testovat funkci primitivních getterů/setterů ALE! má smysl testovat důsledky jejich změny Kdy psát unit testy? pokud to jde, před psaním kódu pokud to nejde, je dobré ověřit, že nový test funguje při objevení chyby a před její opravou Petr Krajča (UP) Unit testy 26.,27. listopad, 2014 9 / 14

Možné vylepšení a úskaĺı společná inicializace: metody označené @Before společný,,úklid : metody označené @After Co všechno testovat? všechny funkce mající veřejné rozhraní (public metody) nemá smysl testovat soukromé metody ALE! testy by měly projít většinu řádků kódu nemá smysl testovat funkci primitivních getterů/setterů ALE! má smysl testovat důsledky jejich změny Kdy psát unit testy? pokud to jde, před psaním kódu pokud to nejde, je dobré ověřit, že nový test funguje při objevení chyby a před její opravou Petr Krajča (UP) Unit testy 26.,27. listopad, 2014 9 / 14

Přetečení do integračních testů každý unit test by měl testovat jednu věc = problém těsně propojených komponent unit test by neměl interagovat s okoĺım (sít, souborový systém, databáze) = zpomalení testů, nutnost připravit prostředí, není zaručené, že test uspěje, když má vytvoření maket objektů oddělení integračních testů = možnost použít stejné nástroje jak pro unit testy pokud je potřeba složitá inicializace = zřejmě špatný unit test Petr Krajča (UP) Unit testy 26.,27. listopad, 2014 10 / 14

Nevhodný test (1/2) Metoda třídy Board public List<Move> getalllegalmoves(piece p) { List<Move> result = LinkedList<Move>(); for (int i = 0; i < 8; i++) for (int j = 0; j < 8; j++) { Move m = new Move(p.getPosition(), new Position(i, j)); if (this.islegalmove(m)) result.add(m); return result; Petr Krajča (UP) Unit testy 26.,27. listopad, 2014 11 / 14

Nevhodný test (2/2) @Test public void testalllegalmoves1() { Board b = createboard(); Piece p = b.getpiece(...); List<Move> moves = b.getalllegalmoves(p); for (Move m: moves) Assert.assertTrue(b.isLegalMove(m)); Petr Krajča (UP) Unit testy 26.,27. listopad, 2014 12 / 14

Testování práce se soubory (1/2) Jako integrační test @Before public void setup() throws IOException { Board b = createboard(); b.saveboard("/tmp/foo"); @After public void teardown() throws IOException { File f = new File("/tmp/foo"); f.delete(); @Test public void loadtest1() { Board b = Board.loadBoard("/tmp/foo"); //... Petr Krajča (UP) Unit testy 26.,27. listopad, 2014 13 / 14

Testování práce se soubory (2/2) Problémy 1 magické hodnoty 2 testují se dvě různé věci: uložení i načtení 3 zápis na disk může selhat (práva, zaplnění, atd.) Řešení 1 použití konstant 2 místo uložení pomocí saveboard zapsat test přímo 3 upravit čtení, aby nepotřebovalo přístup na disk public static Board load(inputstream stream) {... Board b1 = Board.load(new FileInputStream("/tmp/blah"); Board b2 = Board.load(new StringInputStream("<?xml..."); Petr Krajča (UP) Unit testy 26.,27. listopad, 2014 14 / 14