Wprowadzenie do testów jednostkowych. Marcin Dziedzic, Wiktor Żołnowski



Podobne dokumenty
METODY PROGRAMOWANIA

Programowanie zespołowe

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

Testy automatyczne. Korzystające z junit

Programowanie poprzez testy z wykorzystaniem JUnit

Platformy Technologiczne

Techniki efektywnego testowania kodu dla programistów Java (Spock

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

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

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

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

Testowanie aplikacji mobilnych na platformie Android - architektura, wzorce, praktyki i narzędzia

Budowa aplikacji webowej w oparciu o Maven2 oraz przykłady testów jednostkowych. Wykonał Marcin Gadamer

Testowanie II. Cel zajęć. Pokrycie kodu

LABARATORIUM 9 TESTY JEDNOSTKOWE JUNIT 3.8

WYKORZYSTANIE JĘZYKA GROOVY W TESTACH JEDNOSTKOWYCH, INTEGRACYJNYCH I AUTOMATYCZNYCH. Mirosław Gołda, Programista Java

TESTOWANIE OPROGRAMOWANIA

Inżynieria Programowania - Testowanie oprogramowania cz.2

Program szkolenia: Receptury testowania automatycznego - problemy, strategie, taktyki, techniki, narzędzia

Zwinna współpraca programistów i testerów z wykorzystaniem BDD i. by Example (JBehave/Spock/SpecFlow)

Wprowadzenie do Behaviordriven

Behavior Driven Development (BDD)

NAJLEPSZE STRATEGIE SKUTECZNYCH PROGRAMISTÓW. TECHNIKI PRACY Z KODEM KOD: NSKOD

Automatyzacja testowania oprogramowania. Automatyzacja testowania oprogramowania 1/36

Testowanie jednostkowe. Jacek Starzyński, ZETiIS PW

Laboratorium Informatyka (I) AiR Ćwiczenia z debugowania

Testowanie oprogramowania

Programowanie Zespołowe

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

Spring Framework - wprowadzenie i zagadnienia zaawansowane

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

Program szkolenia: Wzorce projektowe i ich implementacja w C# oraz testowanie automatyczne

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

Michał Olejnik. 22 grudnia 2009

Programowanie obiektowe

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

Testy jednostkowe - zastosowanie oprogramowania JUNIT 4.0 Zofia Kruczkiewicz

JUNIT. Terminologia. Organizacja testów

Testowanie aplikacji JAVA Laboratorium 8 (Tabele w scenariuszach JBehave. Projekt z podstaw BDD oraz atrap.)

Testowanie aplikacji Java Servlets

Programowanie w Ruby

Automatyczne testowanie aplikacji Android

Projektowanie obiektowe oprogramowania Wykład 4 wzorce projektowe cz.i. wzorce podstawowe i kreacyjne Wiktor Zychla 2017

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

Programowanie obiektowe

Sexy unit testy. czyli o kilku praktykach w testach jednostkowych

Web frameworks do budowy aplikacji zgodnych z J2EE

Programowanie kontraktowe w Javie

Programowanie dla początkujących w 24 godziny / Greg Perry, Dean Miller. Gliwice, cop Spis treści

Tester oprogramowania 2014/15 Tematy prac dyplomowych

PLAN WYNIKOWY PROGRAMOWANIE APLIKACJI INTERNETOWYCH. KL III TI 4 godziny tygodniowo (4x30 tygodni =120 godzin ),

Krótka Historia. Co to jest NetBeans? Historia. NetBeans Platform NetBeans IDE NetBeans Mobility Pack Zintegrowane moduły. Paczki do NetBeans.

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

Testowanie aplikacji. Kurs języka Ruby

Scala - programowanie obiektowo-funkcyjne

Projektowanie obiektowe oprogramowania Wykład 4 wzorce projektowe cz.i. wzorce podstawowe i kreacyjne Wiktor Zychla 2015

ANGULARJS TWORZENIE APLIKACJI INTERNETOWYCH

Projektowanie obiektowe oprogramowania Testowanie oprogramowania Wykład 13 Wiktor Zychla 2014

Bezpieczenstwo aplikacji

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

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

Aplikacja webowa w Javie szybkie programowanie biznesowych aplikacji Spring Boot + Vaadin

Programowanie obiektowe

Zaawansowane programowanie w języku C++

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

Słowa kluczowe jak góry lodowe

OSGi Agata Hejmej

Programowanie obiektowe

HP Service Anywhere Uproszczenie zarządzania usługami IT

Programowanie w Javie nazwa przedmiotu SYLABUS A. Informacje ogólne

Podczas dziedziczenia obiekt klasy pochodnej może być wskazywany przez wskaźnik typu klasy bazowej.

Programowanie obiektowe zastosowanie języka Java SE

Marcin Luckner Politechnika Warszawska Wydział Matematyki i Nauk Informacyjnych

Być może jesteś doświadczonym programistą, biegle programujesz w Javie,

INŻYNIERIA OROGRAMOWANIA TESTOWANIE JEDNOSTKOWE 2015/2016

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

Instrukcja tworzenia aplikacji EE na bazie aplikacji prezentowanej na zajęciach lab.4 z PIO umożliwiająca przez sieć dostęp wielu użytkownikom.

programowanie w oparciu o platformę netbeans w praktyce

Języki i techniki programowania Ćwiczenia 3 Dziedziczenie

Kompleksowe tworzenie aplikacji klasy Desktop z wykorzystaniem SWT i

Dokumentacja do API Javy.

Programowanie współbieżne i rozproszone

Programowanie obiektowe

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

1 Atrybuty i metody klasowe

JAVA W SUPER EXPRESOWEJ PIGUŁCE

1. Robert C. Martin: Clean Code: A Handbook of Agile Software Craftsmanship (Czysty Kod: Podręcznik Dobrego Programisty)

Technologia programowania

Full Stack JavaScript z Angular i Nest. Dni: 5. Opis: Adresaci szkolenia

Dekoratora używa się wstawiając linijkę zaczynającą się przed definicją dekorowanego obiektu (klasy czy funkcji).

Analiza i projektowanie aplikacji Java

INŻYNIERIA OPROGRAMOWANIA TESTOWANIE INTEGRACYJNE

Programowanie obiektowe

Automatyzacja Testowania w WEB 2.0

Produktywne tworzenie aplikacji webowych z wykorzystaniem Groovy i

JAX-RS czyli REST w Javie. Adam Kędziora

Acceptance Test Driven Development wspierane przez narzędzie ROBOT Framework. Edyta Tomalik Grzegorz Ziemiecki

Klasy abstrakcyjne i interfejsy

Transkrypt:

Wprowadzenie do testów jednostkowych Marcin Dziedzic, Wiktor Żołnowski

Część I: Koncepcja testów jednostkowych

Co to jest test jednostkowy wg Wiki? Test jednostkowy (ang. unit test) to w programowaniu metoda testowania tworzonego oprogramowania poprzez wykonywanie testów weryfikujących poprawność działania pojedynczych elementów (jednostek) programu - np. metod lub obiektów.

Czym naprawdę jest test jednostkowy? Testem najmniejszego elementu systemu w izolacji Dokumentacją z przykładami użycia Kodem, równie ważnym jak kod produkcyjny Najtańszym możliwym sposobem eliminacji błędów Metodą weryfikacji założeń Efektywnym sposobem projektowania ( o tym później )

Czym z pewnością NIE jest test jednostkowy? Weryfikacją działania systemu jako całości Lekarstwem na wszystkie problemy

Dlaczego programiści zaniedbują testy jednostkowe? Nie ma na nie czasu Panuje przeświadczenie, że testy są nudne i bezcelowe Brak kompetencji w pisaniu testów Zbytnia wiara we własne umiejętności I tak ktoś to przetestuje, przecież mamy testerów Testy są napisane niechlujnie a ich utrzymanie jest kłopotliwe

Po co nam 'testerom' testy jednostkowe? Pomoże przy tworzeniu testów automatycznych Bez tego nie ma mowy o zrozumieniu TDD i BDD Umożliwi lepsze poznanie systemu Umożliwi dokonywanie rzetelnych przeglądów kodu Umożliwi weryfikację założeń Umożliwi ocenę stopnia przetestowania aplikacji Szybko zlokalizujecie błąd jeśli coś zacznie się psuć Zwiększy waszą wartość na rynku pracy

Charakterystyka dobrego testu jednostkowe F.I.R.S.T Szybkie (Fast) Niezależne (Independent) Powtarzalne (Repeatable) Samo kontrolujące się (Self-Validating) O czasie (Timely)

A poza tym... Być prosty Powinien pokazywać intencje Projektować architekturę rozwiązania na najniższym poziomie

Część II: Nieśmiertelny JUnit

Co to jest Junit? Framework umożliwiający pisanie testów - nie tylko jednostkowych

Dlaczego JUnit? Powszechnie używany a zatem świetnie przetestowany Ekstremalnie prosty w użyciu Zaspokaja praktycznie wszystkie potrzeby, nie tylko te związane z testami jednostkowymi Każde nowoczesne Java IDE wspiera go out-of-the-box Ciągle rozwijany Dojrzały Doczekał się implementacji w wielu językach (Junit, Nunit, PhpUnit, JSUnit) Stawia na niezależność testów (jedna z zasad F.I.R.S.T)

Junit 4.x adnotacje @Test @Test(expected=NullPointerException.class) @Test(timeout=10) @Before, @After @BeforeClass, @AfterClass + statyczna metoda @Ignore @Parametrized @RunWith, @Suit

Junit 4.x asercje asserttrue(condition) assertfalse(condition) assertnull(object) assertnotnull(object) assertequals(expected, actual) assertnotequals(expected, actual) assertsame(expected, actual) assertnotsame(expected, actual) assertarrayequals(expected, actual)

Jak wyglądało to w wersji 3? Klasa z testem musiała dziedziczyć z TestCase Nazwy testów musiały zaczynać się od 'test' Metody wykonywane przed testami definiowaliśmy jako @Override Wszystkie asercje były zdefiniowane bezpośrednio w klasie testu Nie istniała możliwość parametryzacji Brakowało adnotacji

Cześć III: Zwinny a raczej płynny Fest-Assert

Co to jest Fest-Assert? Biblioteka, która dostarcza płynnego interfejsu (fluent interface) do tworzenia asercji

Co wyróżnia Fest-Assert? Fluent interface płynny styl pisania asercji Stawia na czytelność assertthat(sauron).isnotin(fellowshipofthering); assertthat(frodo.getage()).isequalto(33); Zrozumiałe komunikaty błędów actual value:<'sauron'> should not be in:<['frodo', 'Sauron']> expected:<3[3]> but was:<3[4]>

Co wyróżnia Fest-Assert? Posiada wbudowane asercje do weryfikacji Typów prymitywnych Tablic Kolekcji Zawartości plików Wyrzuconych wyjątków Zbuforowanych zdjęć BufferedImage Jest łatwo rozszerzalna poprzez Condition i GenericAssert

Fest-Assert użycie W Junit napisalibyśmy by assertequals(2, list.size()); asserttrue(list.contains(element1)); asserttrue(list.contains(element2)); Po refaktoryzacji assertcontainsonlyelements(list, element1, element2)

Fest-Assert użycie Zamiast tego możemy napisać assertthat(list).hassize(2).contains(element1, element2); Lub nawet prościej assertthat(list).containsexactly(element1, element2);

Część IV: Wstęp do mockowania

Co to jest mock? Jest to obiekt, który imituje zachowanie innego obiektu w kontrolowany sposób.

Co otrzymujemy dzięki zastosowaniu mocków? Izolujemy testowaną klasę od innych elementów systemu Testy są znacznie szybsze Możemy symulować zachowania innych obiektów Możemy symulować sytuacje wyjątkowe Możemy weryfikować czy odpowiednie metody zostały wywołane i z jakimi parametrami Możliwość rozpoczęcia prac bez gotowego zaplecza bazy danych, usług zewnętrznych

Obawy związane z mockowaniem Mocki będą ciężkie w utrzymaniu Mocki nie pozwolą nam na dokładne przetestowanie systemu Nie sprawdzimy czy nasza baza danych funkcjonuje poprawnie Nie sprawdzimy czy nasze usługi funkcjonują poprawnie

Typy mocków

Stuby (własnoręcznie wyrzeźbione klasy)

Stuby (własnoręcznie wyrzeźbione klasy) Nie mamy łatwego sposobu aby dostosowywać ich zachowanie pomiędzy testami Dodajemy niepotrzebną warstwę złożoności do systemu, którą musimy utrzymywać Tworzymy zbędny kod, który potem musimy utrzymywać

Expect - Run Verify (Record - Replay)

Expect - Run Verify (Record - Replay) Test jest podzielony na trzy części: Utworzenie mocka i nagranie oczekiwań (stubujemy) Uruchomienie mocka Weryfikacja jego zachowania Przez co: Praktycznie stubujemy Zawczasu musimy myśleć o wewnętrznej implementacji Dodajemy wiele niepotrzebnych linii kodu

Arrange - Act - Assert

Arrange - Act - Assert Test jest podzielony na trzy części: Utworzenie mocka Wykonanie testu Opcjonalna weryfikacja wykonanych metod Eliminuje to parę problemów: Nie musimy myśleć o szczegółach przed implementacją Nie musimy stubować metod nic nie zwracających Ograniczamy ilość potrzebnego kodu, zajmujemy się tylko tym co istotne

Przypomnijcie mi bo nie pamiętam, co to jest? Stub Record Replay Arrange - Act - Assert

Część V: Mockito

Co to jest Mockito? Mockito to framework do mockowania napisany w Javie przez Szczepana Fabera wraz z przyjaciółmi.

We decided during the main conference that we should use JUnit 4 and Mockito because we think they are the future of TDD and mocking in Java" Dan North

Dlaczego właśnie Mockito? Jest trendy, wszyscy chcą jej teraz używać :-) Bardzo prosta w użyciu Posiada minimalistyczne API Umożliwia wybiórczą weryfikację wywołań metod Wyraźnie odseparowuje deklaracje zachowań od ich weryfikacji Nie posiada kodu wspierającego framework record(), replay() Umożliwia mockowanie zarówno klas i interfejsów

import static org.mockito.mockito.*; mock(java.lang.class<t> classtomock) when(t methodcall) verify(t mock) spy(t object) doreturn(java.lang.object tobereturned) dothrow(java.lang.throwable tobethrown) doanswer(answer answer) times(int wantednumberofinvocations) atleast(int minnumberofinvocations) atmost(int maxnumberofinvocations)