METODY PROGRAMOWANIA

Podobne dokumenty
Programowanie zespołowe

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

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

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

Testowanie II. Cel zajęć. Pokrycie kodu

Platformy Technologiczne

Testy automatyczne. Korzystające z junit

Programowanie poprzez testy z wykorzystaniem JUnit

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

Techniki efektywnego testowania kodu dla programistów Java (Spock

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

LABARATORIUM 9 TESTY JEDNOSTKOWE JUNIT 3.8

Testowanie jednostkowe. Jacek Starzyński, ZETiIS PW

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

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

Wprowadzenie do Behaviordriven

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

Sexy unit testy. czyli o kilku praktykach w testach jednostkowych

Testy jednostkowe - zastosowanie oprogramowania JUNIT 4.0 Zofia Kruczkiewicz

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.

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

JUNIT. Terminologia. Organizacja testów

Test-Driven Development

Programowanie w języku Java - Wyjątki, obsługa wyjątków, generowanie wyjątków

Testowanie aplikacji. Kurs języka Ruby

Automatyczne testowanie aplikacji Android

Programowanie kontraktowe w Javie

Język JAVA podstawy. Wykład 3, część 3. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

Automatyzacja testowania oprogramowania. Automatyzacja testowania oprogramowania 1/36

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

Michał Sierzputowski. Zautomatyzuj swoje testy automatyczne oparte o Selenium

Technologia programowania

Metody Metody, parametry, zwracanie wartości

Programowanie obiektowe

Programowanie obiektowe

Testowanie aplikacji Java Servlets

Podstawy programowania III WYKŁAD 6

Słowa kluczowe jak góry lodowe

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

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

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

TESTOWANIE OPROGRAMOWANIA

BEAN VALIDATION. Waldemar Korłub. Narzędzia i aplikacje Java EE KASK ETI Politechnika Gdańska

Programowanie w Ruby

Weryfikacja i walidacja. Metody testowania systemów informatycznych

IMIĘ i NAZWISKO: Pytania i (przykładowe) Odpowiedzi

Programowanie obiektowe

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

Specyfikacje formalne

Wyjątki Monika Wrzosek (IM UG) Programowanie obiektowe 180 / 196

Programowanie obiektowe

Inżynieria Programowania - Testowanie oprogramowania cz.2

INŻYNIERIA OROGRAMOWANIA TESTOWANIE JEDNOSTKOWE 2015/2016

Testowanie oprogramowania

Programowanie warstwy klienta w aplikacji JavaEE

Aplikacje w środowisku Java

Kurs programowania. Wykład 1. Wojciech Macyna. 3 marca 2016

Języki i metody programowania Java. Wykład 2 (część 2)

JAVA W SUPER EXPRESOWEJ PIGUŁCE

Wykład 3 Składnia języka C# (cz. 2)

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

Zdalne wywołanie metod - koncepcja. Oprogramowanie systemów równoległych i rozproszonych Wykład 7. Rodzaje obiektów. Odniesienie do obiektu

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

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

Behavior Driven Development (BDD)

WYJĄTKI. Jest ona jednak czasochłonna i prowadzi do duŝego zapotrzebowania na zasoby systemu.

TEMAT : KLASY DZIEDZICZENIE

Kompilacja javac prog.java powoduje wyprodukowanie kilku plików o rozszerzeniu.class, m.in. Main.class wykonanie: java Main

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

Zagadnienia. Inżynieria Oprogramowania

Definicje klas i obiektów. Tomasz Borzyszkowski

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

Języki i metody programowania Java INF302W Wykład 3 (część 1)

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

Aplikacje w środowisku Java

Podstawy i języki programowania

PISANIE TESTÓW Z WYKORZYSTANIEM BIBLIOTEKI TESTNG

JAVA. Platforma JSE: Środowiska programistyczne dla języka Java. Wstęp do programowania w języku obiektowym. Opracował: Andrzej Nowak

Korporacyjna Magistrala Usług na przykładzie Mule ESB

JUnit. Pragmatyczne testy jednostkowe w Javie

Dokumentacja techniczna API systemu SimPay.pl

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

Michał Olejnik. 22 grudnia 2009

Typy metod: konstruktory, destruktory, selektory, zapytania, iteratory.

Testowanie oprogramowania cz. 2. Marian Jureczko

Oprogramowanie systemów równoległych i rozproszonych Wykład 7

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

Klasy abstrakcyjne, interfejsy i polimorfizm

Throwable. Wyjatek_1(int x_) { x = x_; } int podaj_x()

Programowanie Zespołowe

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

Zad.30. Czy można utworzyć klasę, która implementuje oba interfejsy?

Java podstawy jęyka. Wykład 2. Klasy abstrakcyjne, Interfejsy, Klasy wewnętrzne, Anonimowe klasy wewnętrzne.

TESTOWANIE APLIKACJI KORPORACYJNYCH

Metaprogramowanie w Ruby

Języki i techniki programowania Ćwiczenia 2

Język JAVA podstawy. wykład 2, część 1. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

Programowanie obiektowe

Testowanie jednostkowe

Transkrypt:

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 stylu programowania

RODZAJE TESTOW testy akceptacyjne testy Integracyjne testy jednostkowe

TESTY JEDNOSTKOWE testy na poziomie klas/metod używają zaślepek (ang. mocks) sprawdzają funkcjonalną poprawność i kompletność mają wysoki poziom szczegółowości

TDD Test Driven Development - metodologia wytwarzania oprogramowania oparta na testach Testy są pisane na początku Krótkie iteracje Nacisk na wymagania i przypadki testowe Łatwe ulepszanie kodu (refactoring)

TDD

ZASADY FIRST Robert C. Martin (Uncle Bob) w Clean Code pisze, że testy powinny spełniać następujące warunki: Fast (szybkie) Independent (niezależne) Repeatable (powtarzalne) Self-validating (samowalidujące) Timely (napisane w odpowiednim czasie)

TESTY JEDNOSTKOWE - DOBRE PRAKTYKI Jeden test testuje jedną rzecz Konkretne komunikaty w razie niepowodzenia testu Logika w kodzie produkcyjnym nie powinna być tylko na potrzeby testu Powinny być proste w zrozumieniu Brak instrukcji warunkowych, pętli, obsługi wyjątków Jakość kodu testów powinna być równie wysoka, jeśli nie wyższa niż kodu produkcyjnego

JUNIT framework do pisania przypadków testowych dla języka Java open source testy definiowane przy użyciu adnotacji (ang. annotation)

JUNIT - ADNOTACJE @Test @BeforeClass @Before @AfterClass @After

Adnotacja @BeforeClass @BeforeClass public static void setupclass() { // kod wykonany przed pierwszą // metodą testową }

Adnotacja @Before @Before public void setup() { // kod wykonany przed każdą // metodą testową }

Adnotacja @AfterClass @AfterClass public static void teardownclass() { // kod wykonany po ostatniej // metodzie testowej }

Adnotacja @After @After public void teardown() { // kod wykonany po każdej // metodzie testowej }

Adnotacja @Test @Test public void test1() { // kod pierwszego testu } @Test public void test2() { // kod drugiego testu }

Adnotacja @Ignore @Ignore @Test public void test() { // ten test się nie wykona }

TIMEOUT Jeśli test wykonuje się za długo możemy wymusić jego niepowodzenie. @Test(timeout=1000) public void testwithtimeout() { // jeśli wykonywanie tego testu nie // zakończy się po 1 s. test // zakończy się niepowodzeniem }

GLOBALNY TIMEOUT Możemy ustawić timeout dla wszystkich metod testowych w klasie public class GlobalTimeOut { @Rule public Timeout globaltimeout = new Timeout(1000); @Test public void testwithtimeout() { // jeśli wykonywanie tego testu nie // zakończy się po 1 s. test // zakończy się niepowodzeniem } }

WYJĄTKI Możemy testować czy kod rzucił wyjątkiem @Test(expected=RuntimeException.class) public void testexception() { // test powiedzie się tylko wtedy, // gdy kod rzuci wyjątkiem // RuntimeException }

JUNIT - ASERCJE import static org.junit.assert.* asserttrue( błąd - wyrażenie nie jest prawdziwe, true) assertfalse( błąd - wyrażenie nie jest fałszywe, false)

JUNIT - ASERCJE import static org.junit.assert.* assertequals( błąd - napisy nie są taki same, napis, napis ); assertsame( błąd - liczby nie są równe, 1, 1) assertarrayequals( błąd - tablice nie są takie same, tab1, tab2)

STRUCTURE OF JUNIT TEST @Test public void shouldreturnaverage() { // Given List<Integer> list = Arrays.asList(1, 2, 3, 4, 5); } // When double res = avgcalculator.calc(list); // Then assertequals( Wrong average, 3.0, res);

JAK NAZYWAĆ TESTY? MethodName_StateUnderTest_ExpectedBehavior isadult_agelessthan18_false MethodName_ExpectedBehavior_StateUnderTest isadult_false_agelessthan18 test[feature being tested] testisnotanadultifagelessthan18 Feature to be tested IsNotAnAdultIfAgeLessThan18

JAK NAZYWAĆ TESTY? Should_ExpectedBehavior_When_StateUnderTest Should_ThrowException_When_AgeLessThan18 When_StateUnderTest_Expect_ExpectedBehavior When_AgeLessThan18_Expect_isAdultAsFalse Given_Preconditions_When_StateUnderTest_Then_ExpectedBehavior Given_UserIsAuthenticated_When_InvalidAccountNumberIsUsedToWithdra wmoney_then_transactionswillfail Źródło: https://dzone.com/articles/7-popular-unit-test-naming

MOCKITO Klasa powinna być testowana bez zależności Zależności do innych klas zastępujemy zaślepkami (ang. mock) Mockito - framework to tworzenia zaślepek

DLACZEGO ZAŚLEPKI? Chcemy testować tylko naszą klasę Zależność może jeszcze nie być zaimplementowana

JAK UTWORZYĆ ZAŚLEPKĘ? Adnotacja pola klasy @Mock private List<Integer> mockedlist; Deklaracja zmiennej List<Integer> mockedlist = mock(list.class);

INTERAKCJE Z ZAŚLEPKĄ mockedlist.get(0); mockedlist.clear(); verify(mockedlist).get(0); verify(mockedlist).clear();

KONFIGUROWANIE ZAŚLEPKI Domyślnie metody wołane na zaślepce zwracają null Możemy przypisać wartość używając poniższej konstrukcji: when(mocklist.get(0)).thenreturn(1);

KONFIGUROWANIE ZAŚLEPKI Możemy przypisać wartości zwracane przy kolejnych wywołaniach tej samej metody when(mocklist.get(0)).thenreturn(1).thenreturn(2);

KONFIGUROWANIE ZAŚLEPKI Możemy wywołać rzucenie wyjątku przy wołaniu metody: when(mocklist.get(0)).thenthrow(new RuntimeException());

DOPASOWYWANIE ARGUMENTÓW when(mocklist.get(anyint())).thenreturn(1);

WERYFIKACJA WYWOŁANIA ZAŚLEPKI verify(mocklist).get(anyint()); verify(mocklist).get(0);

WERYFIKACJA LICZBY WYWOŁAŃ verify(mocklist, times(2)).get(anyint()); verify(mocklist, atleast(2)).get(anyint()); verify(mocklist, atmost(2)).get(anyint()); domyślna wartość to times(1)

WERYFIKACJA KOLEJNOŚCI WYWOŁAŃ kolejność weryfikacji wywołań ma znaczenie verify(mocklist).add( first el ); verify(mocklist).add( second el );

PRZECHWYTYWANIE ARGUMENTÓW ArgumentCaptor<Person> arg = ArgumentCaptor.forClass(Person.class); verify(mock).dosomething(arg.capture()); Person person = arg.getvalue(); assertequals( Joe, person.getname());

ASSERTJ Biblioteka służąca do definiowania asercji Asercje przypominają język naturalny

ASSERTJ - PRZYKŁADY Zwykłe asercje z JUnit: assertnotnull(list); assertequals(3, list.size()); mogą być zastąpione przez: assertthat(list).isnotnull().hassize(3);

ASSERTJ - WIĘCEJ PRZYKŁADÓW assertthat(birthday).istoday(); assertthat(adate).isequalto( 2013-08-08 ); assertthat(amap).containskeys(key1, key2, key3); Więcej przykładów: http://joel-costigliola.github.io/assertj/assertj-core-featureshighlight.html