PISANIE TESTÓW Z WYKORZYSTANIEM BIBLIOTEKI TESTNG

Podobne dokumenty
Testowanie jednostkowe. Jacek Starzyński, ZETiIS PW

Programowanie poprzez testy z wykorzystaniem JUnit

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

Programowanie zespołowe

TestNG: testowanie jednostkowe nowej generacji

METODY PROGRAMOWANIA

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

Michał Sierzputowski. Zautomatyzuj swoje testy automatyczne oparte o Selenium

JUNIT. Terminologia. Organizacja testów

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

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

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

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

LABARATORIUM 9 TESTY JEDNOSTKOWE JUNIT 3.8

Testowanie II. Cel zajęć. Pokrycie kodu

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

Programowanie kontraktowe w Javie

Ocena i testowanie kodu

Techniki efektywnego testowania kodu dla programistów Java (Spock

TESTOWANIE OPROGRAMOWANIA

Java. Wykład. Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ

Zaawansowane aplikacje WWW - laboratorium

Programowanie obiektowe

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

Automatyczne testowanie aplikacji Android

Zaawansowane aplikacje internetowe - laboratorium Architektura CORBA.

Podstawy języka Java. przygotował:

Testy automatyczne. Korzystające z junit

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.

1. Czynności przygotowujące aplikację działającą na platformie Java SE Biblioteka5 (należy ją pobrać z załącznika z p.1)

Platformy Technologiczne

Programowanie obiektowe

Programowanie w Javie cz. 1 Wstęp. Łódź, 24 luty 2014 r.

Automaty do zadań specjalnych. Olga Maciaszek-Sharma, Artur Kotow Wersja 1,

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

Testy jednostkowe - zastosowanie oprogramowania JUNIT 4.0 Zofia Kruczkiewicz

KLASY, INTERFEJSY, ITP

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

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

Ćwiczenie 1. Kolejki IBM Message Queue (MQ)

JAVA W SUPER EXPRESOWEJ PIGUŁCE

Testowanie i logowanie. 1. Testowanie aplikacji JUnit. 2. Tworzenie logów: pakiet java.util.logging.

Obiektowe programowanie rozproszone Java RMI. Krzysztof Banaś Systemy rozproszone 1

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

Podejście obiektowe do budowy systemów rozproszonych

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

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

Remote Method Invocation 17 listopada Dariusz Wawrzyniak (IIPP) 1

Języki Programowania II Wykład 3. Java podstawy. Przypomnienie

Framework testowy dla języka Java

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

Architektury Usług Internetowych. Laboratorium 2. Usługi sieciowe

Programowanie obiektowe

Automatyzacja testowania oprogramowania. Automatyzacja testowania oprogramowania 1/36

Zaawansowane aplikacje internetowe - laboratorium Architektura CORBA.

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

Testowanie aplikacji Java Servlets

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

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

Aplikacje RMI Lab4

Aplikacje RMI

Test-Driven Development

Java jako język programowania

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

Programowanie obiektowe

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

Javadoc. Piotr Dąbrowiecki Sławomir Pawlewicz Alan Pilawa Joanna Sobczyk Alina Strachocka

Remote Method Invocation 17 listopada 2010

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

1. Po uruchomieniu przeglądarki Mozilla FireFox, należy uruchomić stronę

Wywoływanie metod zdalnych

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

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

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

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

Obliczenia równoległe i rozproszone w JAVIE. Michał Kozłowski 30 listopada 2003

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

Swing Application Framework czyli tam i z powrotem. Copyright Piotr Kochański & Erudis,

Słowa kluczowe jak góry lodowe

Wielowątkowość. Programowanie w środowisku rozproszonym. Wykład 1.

Akademia ETI. Wprowadzenie do programowania w Javie PG Java User Group Przemysław Kulesza

Programowanie obiektowe

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

Ćwiczenie 1. Przygotowanie środowiska JAVA

Multimedia JAVA. Historia

Tworzenie i wykorzystanie usług

1. Co można powiedzieć o poniższym kodzie? public interface I { void m1() {}; static public void m2() {}; void abstract m3();

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

Remote Method Invocation 17 listopada rozproszonych. Dariusz Wawrzyniak (IIPP) 1

Platformy Programistyczne Podstawy języka Java

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

Współbieżność w środowisku Java

Programowanie obiektowe

RMI-2. Java Remote Method Invocation (RMI) na podstawie m.in. podręcznika firmy Sun Microsystems SYSTEMY ROZPROSZONE

Google Web Toolkit. Piotr Findeisen

ZAPOZNANIE SIĘ Z TWORZENIEM

Git, Bitbucket, IntelliJ IDEA

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

Automatyzacja testów aplikacji webowych w Selenium podstawy. Natalia Krawczyk

Db4o obiektowa baza danych wersja.net

Transkrypt:

PISANIE TESTÓW Z WYKORZYSTANIEM BIBLIOTEKI TESTNG Janusz Marchewa Kraków, 21.10.2006 r.

Plan prelekcji Dlaczego TestNG? Porównanie z JUnit 3.8.1 i JUnit 4 Dodatkowe zalety TestNG Migracja istniejących testów do TestNG

Dlaczego TestNG? JUnit był przez lata bezkonkurencyjny, ale: zarządzanie złożonym zestawem testów było czasochłonne i często irytujące czas ujawnił pewne wady projektowe tej biblioteki biblioteka nie była przez długi czas rozwijana, co pogłębiło frustrację części użytkowników Potrzeba stworzenia alternatywy Narodziny Testing, the Next Generation

Główny autor Cedric Beust Dawniej Sun Microsystems, BEA Systems Obecnie pracownik Google Uczestniczył w pracach nad różnymi JSR, m.in. JSR-175 (adnotacje) i JSR-220 (EJB3) Współautor Professional Java Server Programming J2EE, 1.3 Edition

Sfrustrowany Cedric... Powody swoich frustracji biblioteką JUnit zaczął podawać na blogu już w 2003 roku Niektóre z nich: nowy obiekt każdej klasy dziedziczącej z junit.framework.testcase jest tworzony tyle razy, ile metod testujących posiada ta klasa brak możliwości zmiany listy uruchamianych testów bez przekompilowania kodu brak możliwości zdefiniowania zależności pomiędzy testami

...staje się coraz bardziej sfrustrowany... I podaje kolejne wady JUnit: brak prostego sposobu na tymczasowe wyłączenie niektórych testów brak niezależnego systemu logowania informacji o wykonywanych testach mało intuicyjne listy parametrów metod dokonujących asercji

...aż decyduje się napisać TestNG Nowa biblioteka miała czerpać najlepsze rozwiązania z JUnit i NUnit Od samego początku miała wykorzystywać adnotacje (JSR-175) Pierwsza wersja w kwietniu 2004 roku Wrzesień 2006: wersja 5.2 Jak wypada na tle JUnit?

Przykłady: planowanie konferencji

Przykłady: planowanie konferencji

Prosty przykład (JUnit 3.8.1) import junit.framework.testcase; public class LectureComparatorTest extends TestCase { private LectureComparator lecturecomparator = new LectureComparator(); public void testcomparelecturetoitself() { Lecture lecture = new Lecture(); int comparisonresult = lecturecomparator.compare( lecture, lecture ); assertequals( 0, comparisonresult );

Prosty przykład (TestNG) import org.testng.assertjunit; import org.testng.annotations.test; // obsługa adnotacji wymaga pliku testng-x.y-jdk15.jar public class LectureComparatorTest { private LectureComparator lecturecomparator = new LectureComparator(); @Test public void comparelecturetoitself() { Lecture lecture = new Lecture(); int comparisonresult = lecturecomparator.compare( lecture, lecture ); // może być również: assert comparisonresult == 0; AssertJUnit.assertEquals( 0, comparisonresult );

Wykorzystanie JDK 1.4 (TestNG) import org.testng.assertjunit; // obsługa komentarzy JavaDoc wymaga biblioteki testng-x.y-jdk14.jar public class LectureComparatorTest { private LectureComparator lecturecomparator = new LectureComparator(); /** * @testng.test */ public void comparelecturetoitself() { Lecture lecture = new Lecture(); int comparisonresult = lecturecomparator.compare( lecture, lecture ); // może być również: assert comparisonresult == 0; AssertJUnit.assertEquals( 0, comparisonresult );

Konfiguracja TestNG - testng.xml <!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd"> <suite verbose="2" name="jdd2006 Suite"> <test name="lecturecomparator Test" annotations="jdk5"> <classes> <class name="equilibrium.jdd2006.testng.lecturecomparatortest"> <methods> <include name="comparelecturetoitself"/> </methods> </class> </classes> </test> </suite>

Uruchamianie TestNG z poziomu konsoli $ java org.testng.testng sciezka-do-pliku-testng.xml [kolejne pliki] z poziomu Anta <path id="classpath.build"> <!-- niezbędne biblioteki, w tym TestNG (...) --> <pathelement location="${build.dir"/> </path> <taskdef resource="testngtasks" classpathref="classpath.build"/> <target name="testng-all"> <testng classpathref="classpath.build" outputdir="${report.dir"> <xmlfileset dir="${build.dir" includes="testng.xml"/> </testng> </target> z poziomu IDE (Eclipse, IntelliJ IDEA, NetBeans)

Prosty przykład (JUnit 4) import static org.junit.assert.assertequals; import org.junit.test; public class LectureComparatorTest { private LectureComparator lecturecomparator = new LectureComparator(); @Test public void comparelecturetoitself() { Lecture lecture = new Lecture(); int comparisonresult = lecturecomparator.compare( lecture, lecture ); assertequals( 0, comparisonresult );

Sprawdzanie wyrzucanych wyjątków (JUnit 3.8.1) public void testcomparelectureswithunsetcategory() { Lecture firstlecture = new Lecture(); Lecture secondlecture = new Lecture(); try { lecturecomparator.compare( firstlecture, secondlecture ); fail(); catch ( NullPointerException e ) { asserttrue( true );

Sprawdzanie wyrzucanych wyjątków (TestNG) @Test( expectedexceptions = { NullPointerException.class ) public void comparelectureswithunsetcategory() { Lecture firstlecture = new Lecture(); Lecture secondlecture = new Lecture(); lecturecomparator.compare( firstlecture, secondlecture );

Sprawdzanie wyrzucanych wyjątków (JUnit 4) @Test( expected = NullPointerException.class ) public void comparelectureswithunsetcategory() { Lecture firstlecture = new Lecture(); Lecture secondlecture = new Lecture(); lecturecomparator.compare( firstlecture, secondlecture );

Inicjalizowanie testów i sprzątanie po nich (JUnit 3.8.1) public class ConferenceManagerTest extends TestCase { private ConferenceManager conferencemanager; public ConferenceManagerTest() { System.out.println( "Inicjalizacja obiektu klasy ConferenceManager" ); conferencemanager = new ConferenceManager(); protected void setup() throws Exception { super.setup(); System.out.println( "Przydział zasobów dla metody testującej" ); protected void teardown() throws Exception { System.out.println( "Zwolnienie zasobów użytych w metodzie testującej" ); super.teardown(); public void testmethod1() { System.out.println( "Test pierwszej metody klasy ConferenceManager" ); public void testmethod2() { System.out.println( "Test drugiej metody klasy ConferenceManager" );

Inicjalizowanie testów i sprzątanie po nich (TestNG) public class ConferenceManagerTest { private ConferenceManager conferencemanager; @BeforeClass private void initconferencemanager() { System.out.println( "Inicjalizacja obiektu klasy ConferenceManager" ); conferencemanager = new ConferenceManager(); @BeforeMethod private void setuptestmethod() { System.out.println( "Przydział zasobów dla metody testującej" ); @AfterMethod private void teardowntestmethod() { System.out.println( "Zwolnienie zasobów użytych w metodzie testującej" ); @Test public void method1() { System.out.println( "Test pierwszej metody klasy ConferenceManager" ); @Test public void method2() { System.out.println( "Test drugiej metody klasy ConferenceManager" );

Inicjalizowanie testów i sprzątanie po nich (JUnit 4) public class ConferenceManagerTest { private static ConferenceManager conferencemanager; @BeforeClass public static void initconferencemanager() { System.out.println( "Inicjalizacja obiektu klasy ConferenceManager" ); conferencemanager = new ConferenceManager(); @Before public void setuptestmethod() { System.out.println( "Przydział zasobów dla metody testującej" ); @After public void teardowntestmethod() { System.out.println( "Zwolnienie zasobów użytych w metodzie testującej" ); @Test public void method1() { System.out.println( "Test pierwszej metody klasy ConferenceManager" ); @Test public void method2() { System.out.println( "Test drugiej metody klasy ConferenceManager" );

Wyłączanie niektórych testów JUnit 3.8.1: public class ConferencePlannerTest extends TestCase { private ConferencePlanner conferenceplanner; public void _testplanconferenceday() { // test nieadekwatny do kodu, tymczasowo wyłączony TestNG na poziomie testng.xml lub: public class ConferencePlannerTest { private ConferencePlanner conferenceplanner; @Test( enabled = false ) public void planconferenceday() { // test nieadekwatny do kodu, tymczasowo wyłączony

Wyłączanie niektórych testów JUnit 4: public class ConferencePlannerTest { private ConferencePlanner conferenceplanner; @Ignore @Test public void planconferenceday() { // test nieadekwatny do kodu, tymczasowo wyłączony

Zaawansowane możliwości TestNG Grupowanie testów Metody zapewniające dane dla testów Definiowanie zależności pomiędzy testami Szybkie uruchamianie tylko tych testów, które poprzednio zakończyły się błędem...

Grupowanie testów @Test( groups = "unittests" ) public void comparelecturetoitself() { Lecture lecture = new Lecture(); int comparisonresult = lecturecomparator.compare( lecture, lecture ); AssertJUnit.assertEquals( 0, comparisonresult ); <!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd"> <suite name="jdd2006 Suite" verbose="2"> <test name="unit Tests" annotations="jdk5"> <groups> <run> <include name="unittests"/> </run> </groups> <packages> <package name="equilibrium.jdd2006.testng"/> </packages> </test> </suite>

Metody zapewniające dane dla testów @Test( dataprovider = "lectureandexpectedcomparisonresultprovider" ) public void comparelectures( Lecture firstlecture, Lecture secondlecture, int expectedcomparisonresult ) { int comparisonresult = lecturecomparator.compare( firstlecture, secondlecture ); AssertJUnit.assertEquals( expectedcomparisonresult, comparisonresult ); @DataProvider( name = "lectureandexpectedcomparisonresultprovider" ) private Object[][] providelecturesandexpectedcomparisonresults() { return new Object[][] { { buildlecture( 1, 3, 4 ), buildlecture( 2, 1, 1 ), -1, { buildlecture( 5, 2, 1 ), buildlecture( 3, 5, 4 ), 1, ; private Lecture buildlecture( int lecturecategorypriority, int lecturerpriority, int lecturepriority ) { // budowanie obiektu Lecture z podanymi priorytetami

Definiowanie zależności pomiędzy testami public class ConferenceManagerTest { private ConferenceManager conferencemanager; @Test public void checkconfiguration() { conferencemanager = new ConferenceManager(); // test sprawdzający poprawność konfiguracji @Test( dependsonmethods = { "checkconfiguration" ) public void planconference() { // test metody odpowiedzialnej za zaplanowanie całej konferencji

Szybkie uruchamianie tylko testów zakończonych błędem TestNG w momencie uruchomienia zestawu testów tworzy w katalogu wyjściowym plik testng-failed.xml (lub testng-failures.xml) Plik ten zawiera konfigurację uruchomieniową tylko tych testów, które poprzednio zakończyły się błędem Tak zdefiniowana konfiguracja zawiera również te testy, które nie zostały uruchomione z powodu niespełnienia zależności

Dodatkowe zalety TestNG w kontekście......testów integracyjnych...programowania sterowanego testami (test driven development)...badania pokrycia kodu przez testy (code coverage)...wykorzystania rozszerzeń biblioteki JUnit

TestNG a testy integracyjne TestNG ułatwia tworzenie i utrzymanie testów integracyjnych Szczególnie przydatne są metody zapewniające dane (@DataProvider) Do wydzielenia testów integracyjnych można wykorzystać mechanizm grupowania Przydatne może być też definiowanie zależności i szybkie uruchamianie tylko tych testów, które zakończyły się błędem

TestNG a TDD TestNG upraszcza tworzenie testów, wpływa pozytywnie na proces red-green-refactor Dzięki metodom zapewniającym dane można bez problemów przekazać różne zestawy danych do pojedynczego testu nie musimy już pisać osobnego przypadku testowego Wykorzystanie adnotacji ułatwia pisanie testów do nieistniejącego kodu (mniej błędów kompilacji)

TestNG a code coverage TestNG współpracuje z istniejącymi narzędziami do badania pokrycia kodu przez testy Integracja przeprowadzana na poziomie zadania Anta wymaga uwzględnienia specyfiki zarówno TestNG, jak i narzędzia do badania pokrycia kodu przez testy Przykład (Cobertura, Emma): http://www-128.ibm.com/developerworks/forums/ dw_thread.jsp?forum=812&thread=110765&cat=10

TestNG a rozszerzenia JUnit Wiele rozszerzeń może po drobnych zmianach współpracować z TestNG http://thediscoblog.com/2006/03/27/ using-junit-extensions-in-testng/ Jeśli nie jest to możliwe, to zapewne dane rozszerzenie jest zbyt mocno uzależnione od JUnit, tak jak np. JMock: http://themindstorms.blogspot.com/2006/07/ jmock-for-testng-or-junit-free-jmock.html http://themindstorms.blogspot.com/2006/08/ more-on-jmock-and-testng.html

Migracja testów do TestNG Opcja pierwsza (łagodna): uruchamianie testów JUnit za pomocą TestNG i stopniowa migracja kodu <!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd"> <suite name="jdd2006 Suite" verbose="2"> <test name="unit Tests" annotations="jdk5" junit="true"> <packages> <package name="equilibrium.jdd2006.junit3x"/> </packages> </test> </suite>

Migracja testów do TestNG Opcja druga (radykalna): wykorzystanie dołączonego do TestNG konwertera $ java org.testng.junitconverter -overwrite -annotation -srcdir test W obu przypadkach nie obędzie się bez ręcznej ingerencji w kod testów, jednak bez wątpienia taka migracja w dużym stopniu zautomatyzowana stanowi kolejną zaletę TestNG

Podsumowanie TestNG

Więcej informacji http://testng.org http://www-128.ibm.com/developerworks/java/library/ j-cq08296/?ca=dgr-lnxw07junit4vstestng http://www.theserverside.com/tt/articles/ article.tss?l=migratingtotestng http://www.realsolve.co.uk/site/tech/ blog.php?name=philzoio&mydate=20050826 http://www-128.ibm.com/developerworks/java/library/ j-testng/ http://membres.lycos.fr/testng http://www.devx.com/java/article/31983/

Dziękujemy za uwagę!