Szűgyi Zalán. Unit tesztek Java és C++ környezetben

Hasonló dokumentumok
A legalacsonyabb szintű tesztelés. A programot felépítő egységek tesztelése Unit: egy rendszer legkisebb önálló egységként tesztlehető része.

JUnit. JUnit használata. IDE támogatás. Parancssori használat. Teszt készítése. Teszt készítése

JUnit.

public class HelloWorld extends TestCase { public void testmultiplication() { // Testing if 3*2=6: assertequals ("Multiplication", 6, 3*2);

Unit Teszt. Tóth Zsolt. Miskolci Egyetem. Tóth Zsolt (Miskolci Egyetem) Unit Teszt / 22

Sikeres végrehajtás(pass): ez azt jelenti, hogy a teszt rendben lefutott, és az ellenőrzési feltételek mind teljesültek.

Programozási nyelvek II. JAVA

Programozási technológia 2.

BME Irányítástechnika és Informatika Tanszék A programozás alapjai

Kivételkezelés, beágyazott osztályok. Nyolcadik gyakorlat

Budapes( Műszaki és Gazdaságtudományi Egyetem Méréstechnika és Információs Rendszerek Tanszék. Tesztelés és profiling

Eseményvezérelt alkalmazások fejlesztése I 11. előadás. Szoftverek tesztelése

A JUnit alapú egységteszteléshez felhasználandó annotációk leírásait az alábbi URL-en találja meg:

Unit tesztelés. Honfi Dávid, Micskei Zoltán. Integrációs és ellenőrzési technikák (VIMIA04) Méréstechnika és Információs Rendszerek Tanszék

Programozás I. 1. gyakorlat. Szegedi Tudományegyetem Természettudományi és Informatikai Kar

Unit tesztelés. Honfi Dávid, Micskei Zoltán. Integrációs és ellenőrzési technikák (VIMIA04) Méréstechnika és Információs Rendszerek Tanszék

TESZTELÉS A SZOFTVER ÉLETCIKLUSÁN ÁT TESZTSZINTEK

Webes alkalmazások fejlesztése 10. előadás. Webszolgáltatások tesztelése (ASP.NET Core) Cserép Máté

Alapszintű tesztelői tanfolyam Boda Béla CTO, Neuron Software

Szoftvertesztelés Alapok

A feladatok megoldásához felhasználandó annotációk leírásait az alábbi URL-en találja meg:

Az osztályok csomagokba vannak rendezve, minden csomag tetszőleges. Könyvtárhierarhiát fed: Pl.: java/util/scanner.java

Modern unit és integrációs tesztelés

Programozási technológia II 7. előadás. Verifikáció és validáció Giachetta Roberto

Objektum Orientált Programozás. 11. Kivételkezelés 44/1B IT MAN

Kivételek kezelése (exception handling) Hibakezelés old style. Kivételkezelés

Objektumorientált programozás C# nyelven

OOP: Java 8.Gy: Abstract osztályok, interfészek

Bevezetés a programozásba Előadás: Objektumszintű és osztályszintű elemek, hibakezelés

Széchenyi István Egyetem. Programozás III. Varjasi Norbert

Szoftvertechnológia alapjai Java előadások

Java Remote Method Invocation API

Pelda öröklődésre: import java.io.*; import java.text.*; import java.util.*; import extra.*;

DIPLOMAMUNKA. Bodogan Judit Mária

Programozás C++ -ban 2007/7

OBJEKTUM ORIENTÁLT PROGRAMOZÁS JAVA NYELVEN. vizsgatételek

Programozás I. 5. gyakorlat. Szegedi Tudományegyetem Természettudományi és Informatikai Kar

Segédanyag: Java alkalmazások gyakorlat

Gelle Kitti Algoritmusok és adatszerkezetek gyakorlat - 07 Hasítótáblák

Programozási nyelvek II. JAVA

JNDI - alapok. Java Naming and Directory Interface

OOP: Java 8.Gy: Gyakorlás

és az instanceof operátor

Java VIII. Az interfacei. és az instanceof operátor. Az interfészről általában. Interfészek JAVA-ban. Krizsán Zoltán

Mi a különbség az extends és az implements között. Mikor melyiket kell használni? Comperable-t megvalósító oasztályokban össze lehet hasonlitani

Programozási nyelvek II. JAVA EA+GY 1. gyakolat

Collections. Összetett adatstruktúrák

Helyes-e az alábbi kódrészlet? int i = 1; i = i * 3 + 1; int j; j = i + 1; Nem. Igen. Hányféleképpen lehet Javaban megjegyzést írni?

Szoftverminőségbiztosítás

Segédanyag: Java alkalmazások gyakorlat

Programozási nyelvek Java

OOP: Java 11.Gy: Enumok, beágyazott osztályok. 13/1 B ITv: MAN

Java I. A Java programozási nyelv

Java bevezet o Kab odi L aszl o Kab odi L aszl o Java bevezet o

Szoftvertechnológia 10. előadás. Verifikáció és validáció. Giachetta Roberto. Eötvös Loránd Tudományegyetem Informatikai Kar

BME MOGI Gépészeti informatika 8.

Név: Neptun kód: Pontszám:

JAVA PROGRAMOZÁS 3.ELŐADÁS

Programozási nyelvek II. JAVA EA+GY 1. gyakolat

Szkriptelési feladat megoldása

Java IX. telkezelés a Java-ban

Java VI. Egy kis kitérő: az UML. Osztály diagram. Általános Informatikai Tanszék Utolsó módosítás:

- 1 - Konstansok használata. Döntsük el, van-e fordítási idejű hiba az alábbi programrészletekben! a) const char * str="zh"; str[0]++;

Java és web programozás

Metamodellezés. Simon Balázs BME IIT, 2011.

Java IX. telkezelés a Java-ban

Abstract osztályok és interface-ek. 7-dik gyakorlat

Programozási technológia

Programozás alapjai II. (3. ea) C++

Megoldások a mintavizsga kérdések a VIMIAC04 tárgy ellenőrzési technikák részéhez kapcsolódóan (2017. május)

Objektumorientált programozás C# nyelven III.

Szoftvertechnolo gia gyakorlat

OOP: Java 4.Gy: Java osztályok

Tesztelés a fejlesztés különböző fázisaiban

Osztályok. 4. gyakorlat

Programozás I. Első ZH segédlet

C# Nyelvi Elemei. Tóth Zsolt. Miskolci Egyetem. Tóth Zsolt (Miskolci Egyetem) C# Nyelvi Elemei / 18

List<String> l1 = new ArrayList<String>(); List<Object> l2 = l1; // error

C# osztályok. Krizsán Zoltán

SZÁMÍTÓGÉPES ADATBÁZIS-KEZELÉS. A MySQL adatbáziskezelő PHP folytatás JDBC, ODBC

1. Mi a fejállományok szerepe C és C++ nyelvben és hogyan használjuk őket? 2. Milyen alapvető változókat használhatunk a C és C++ nyelvben?

Segédanyag: Java alkalmazások gyakorlat

Programozás alapjai II. (3. ea) C++

Programozás alapjai II. (3. ea) C++ Panaszok kezelése. Hol tartunk?

Java programozási nyelv 6. rész Java a gyakorlatban

Webes alkalmazások fejlesztése

Felhasználó által definiált adattípus

A megjelenő ablakban a Work with feliratú mezőbe gépeljük be az EclEmma plugin elérési útját:

7. K: JAVA alapok Konzultáció

Programozási nyelvek Java

Programozás alapjai 2. Hibakeresés, tesztelés

Programozás alapjai 2. Hibakeresés, tesztelés. Hibakeresés módszerei. Nyomkövető kiírások. madártávlatból

Objektumorientált programozás C# nyelven

Java RMI Áttekintés. Miskolci Egyetem Általános Informatikai Tanszék. Utolsó módosítás: Ficsor Lajos. javarmi / 1

Concurrency in Swing

Ficsor Lajos Általános Informatikai Tanszék Miskolci Egyetem

Szálkezelés. Melyik az a hívás, amelynek megtörténtekor már biztosak lehetünk a deadlock kialakulásában?

(Teszt)automatizálás. Bevezető

Számítástechnika II. BMEKOKAA Előadás. Dr. Bécsi Tamás

Java RMI Áttekintés. A Java RMI. A Java RMI architektúrája. Ficsor Lajos. Általános Infromatikai Tanszék Miskolci Egyetem 1.

Átírás:

Szűgyi Zalán Unit tesztek Java és C++ környezetben

Tartalom Tesztelésről: unit tesztek teszt esetek JUnit Konfigurálás Keretrendszer API gtest Konfigurálás Keretrendszer API

Tesztelés Programok tesztelése (ISO/IEC TR 19759:2005) Unit test Integration test System test Acceptence test

Unit test Egy modult önmagában tesztel Segít minél előbb megtalálni a hibákat Segít a refaktorálásban Öndokumentálás Interfészek elválasztása az implementációtól

JUnit Unit teszt keretrendszer Java környezethez Open source Min. rendszer követelmények: JDK 1.5+ Integrálható: Eclipse Maven Ant

JUnit konfigurálás letölthető: http://junit.org export PATH=$PATH:<java install path>/bin/ export CLASSPATH=$CLASSPATH:\ <junit path>/junit4.10.jar:. A 4.11-es verzióhoz a hamcrest-core.jar is szükséges

Példa teszteset (TestJunit.java) import org.junit.test; import static org.junit.assert.assertequals; public class TestJunit { @Test public void testadd() { String str = "Junit is working fine"; assertequals( "Junit is working fine", str); } }

Példa tesztkörnyezet (TestRunner.java) import org.junit.runner.junitcore; import org.junit.runner.result; import org.junit.runner.notification.failure; public class TestRunner { public static void main(string[] args) { Result result = JUnitCore.runClasses(TestJunit.class); } } for (Failure failure: result.getfailures()){ System.out.println(failure.toString()); } System.out.println(result.wasSuccessful());

Fordítás, futtatás Fordítás: javac TestJunit.java TestRunner.java Futtatás: java TestRunner Kimenet: true

A tesztelés lépései 1. Adott egy osztály, amit tesztelni szeretnénk 2. Készítsünk egy Test Case osztályt A teszt metódusokat annotáljuk @Test annotációval A tesztfeltételeket ellenőrízzük az assert API segítségével.

A tesztelés lépései (folyt.) 3. A teszteket futtató osztály elkészítése JUnitCore.runClasses(... ) Result objektum getfailures() wassuccessful()

Assert API assertequals assertarrayequals assertfalse asserttrue assertsame assertnotsame assertthat fail assertnull assertnotnull http://junit.sourceforge.net/javadoc/

Egyszerű példa MiniMath.java osztály factorial TestMiniMath.java tesztosztály TestRunner.java futtató környezet forrás: java/minimath

Több teszteset Gyakori, hogy egy osztályt sok tesztes tesztel Közös erőforrások közös inicializálás Annotációk: Before BeforeClass Ignore After AfterClass

Példa több tesztesetre MiniMath.java osztály factorial gcd TestMiniMath.java tesztosztály Annotációk TestRunner.java futtató környezet forrás: java/minimath2

Test Suite Több összetartozó teszt-osztályokban definiált tesztesetek futtatása @RunWith és @Suite annotációk import org.junit.runner.runwith; import org.junit.runners.suite; @RunWith(Suite.class) @Suite.SuiteClasses({ TestJunit1.class, TestJunit2.class }) public class JunitTestSuite {}

Példa Test Suite-re MiniMath.java osztály factorial gcd TestMiniMath1.java és TestMiniMath2.java tesztosztályok Annotációk TestSuiteMath.java TestRunner.java futtató környezet forrás: java/minimath3

Timeout a tesztekben Megadhatjuk, hogy maximum meddig futhasson az adott teszteset millisec időtúllépés esetén --> fail @Test(timeout=1000)

Példa timeout-ra MiniMath.java osztály factorial gcd fibonacci TestMiniMath.java tesztosztály @Test(timeout=1000) TestRunner.java futtató környezet forrás: java/minimath4

Kivétel dobás tesztelése Azt szeretnénk ellenőrízni, hogy dobott-e kivételt az adott metódus @Test(expected = <givenexception>.class)

Példa kivételdobás tesztelésére MiniMath.java osztály factorial negatív számra ArithmeticException-t dob gcd fibonacci TestMiniMath.java tesztosztály @Test(expected = ArithmeticException.class) TestRunner.java futtató környezet forrás: java/minimath5

Mock Unit teszt egy osztályt önállóan tesztel Valóságban egy osztály felhasználhatja több osztály szolgáltatásait Mock-olás: Ezen osztályok tagfüggvényeinek hívását lecseréljük Dummy értékeket adunk vissza Az osztály tesztelése nem függ a többi osztálytól (pl. nem kell hozzá adatbázis kapcsolat)

Mock keretrendszer Java környezethez Egyszerű API Verifikáció Stub-ok Polimorfizmust használ, statikus, final metódusokat nem tudunk mock-olni vele Junit támogatás

Telepítés, beállítások Letölthető: http://code.google.com/p/mockito/downloads/list Adjuk hozzá a CLASSPATH-hoz a mockito-all-1.9.5.jar-t

Egyszerű verifikáció import static org.mockito.mockito.*; //mock creation List mockedlist = mock(list.class); //using mock object mockedlist.add("one"); mockedlist.clear(); //verification verify(mockedlist).add("one"); verify(mockedlist).clear();

Stub-olás //A konkrét osztályt kell mock-olni nem elég az interfészt LinkedList mockedlist = mock(linkedlist.class); //stub when(mockedlist.get(0)).thenreturn("first"); when(mockedlist.get(1)).thenthrow(new RuntimeException()); // kiírja hogy first System.out.println(mockedList.get(0)); // runtime exception System.out.println(mockedList.get(1)); // null, mert a 999 nincs stub-olva System.out.println(mockedList.get(999));

Program: Példa Person: egy dolgozót ír le PersonPersister: dolgozót ment el és tölt be egy adatbázisból Factory: gyár osztály, itt dolgoznak a dolgozók TestFactory: Factory unit tesztje (nem akarunk adatbázist kezelni a tesztben) Mock-olja a PersonPersister-t TestRunner: futtató környezet forrás: java/mocktest1

Argumentum matcherek Ha nem konkrét értékekkel hanem általánosabban akarunk megadni egy argumentumok egy fvhívás mockolásakor: when(mockedlist.get(anyint())). thenreturn("element");

Matcherek anyboolean, anyint, anydouble, anycollection, anylist, anymap, contain, startswith, endswith, matches isnull, isnotnull http://docs.mockito.googlecode.com/hg/latest /org/mockito/matchers.html

Függvényhívások számának ellenőrzése mocledlist.add("once"); mockedlist.add("twice"); mockedlist.add("twice"); mockedlist.add("three times"); mockedlist.add("three times"); mockedlist.add("three times");

Függvényhívások számának ellenőrzése folyt. //A kövektező két sor ekvivalens (a times(1) a default) verify(mockedlist).add("once"); verify(mockedlist, times(1)).add("once"); //konkrét fvhívásszám ellenőrzése verify(mockedlist, times(2)).add("twice"); verify(mockedlist, times(3)).add("three times"); //never() egy alias a times(0)-ra verify(mockedlist, never()).add("never happened"); //atleast()/atmost() verify(mockedlist, atleastonce()).add("three times"); verify(mockedlist, atleast(2)).add("five times"); verify(mockedlist, atmost(5)).add("three times");

Példa verify(mockedpersonpersister, times(2)). load(anystring()); vs verify(mockedpersonpersister).load("jozsi"); verify(mockedpersonpersister).load("dezso"); forrás: java/mocktest2

Redundáns hívások ellenőrzése mockedlist.add("one"); mockedlist.add("two"); //egy add fv-hívást elvár verify(mockedlist).add("one"); //minden továbbit megtilt verifynomoreinteractions(mockedlist);

gtest gmock

Konfigurálás Érdemes rögtön a gmock-ot letölteni, mert az tartalmazza a gtest-et is. Kitömörítés után: g++ -I${GTEST_DIR}/include -I${GTEST_DIR} \ -I${GMOCK_DIR}/include -I${GMOCK_DIR} \ -c ${GTEST_DIR}/src/gtest-all.cc g++ -I${GTEST_DIR}/include -I${GTEST_DIR} \ -I${GMOCK_DIR}/include -I${GMOCK_DIR} \ -c ${GMOCK_DIR}/src/gmock-all.cc ar -rv libgmock.a gtest-all.o gmock-all.o

Teszteset fordításához Fordításhoz megadni: -I${GTEST_DIR}/include -I${GMOCK_DIR}/include -L${GMOCK_DIR}/lib -lgmock -lpthread testfile.cpp

Példa JUnit-nál megismert első példa C++-os környezetben: minimath.cpp minimath.h test.cpp forrás: cpp/minimath1

ASSERT API (fatal) ASSERT_TRUE ASSERT_FALSE ASSERT_EQ ASSERT_NE ASSERT_STREQ ASSERT_STRNE ASSERT_STRCASEEQ ASSERT_STRCASENE ASSERT_LT ASSERT_GT ASSERT_GE

EXPECT API (non fatal) EXPECT_TRUE EXPECT_FALSE EXPECT_EQ EXPECT_NE EXPECT_STREQ EXPECT_STRNE EXPECT_STRCASEEQ EXPECT_STRCASENE EXPECT_LT EXPECT_GT EXPECT_GE

Fixture-ök Ha több tesztesetet közösen szeretnénk inicializálni, közös erőforrásaik vannak... Annotációk helyett fixture osztály: ::testing::test-ből származik adattagjai elérhetőek a tesztekből TEST helyett TEST_F makró első paramétere kötelezően az osztály neve

Fixture-ök folyt. Virtuális tagfüggvények: SetUp: minden teszteset előtt lefut (mint a @Before annotáció JUnitban) TearDown: minden testeset után lefut (mint az @After annotáció JUnitban) forrás: cpp/minimath2

Mocking Virtuális fv-eken, vagy templateken Expectation EXPECT_CALL Argument matcher-ek (konkrét érték vagy _, using ::testing::_ Kardinalitás (Times(n)) Akciók

Példa int n = 100; EXPECT_CALL(Point, GetX()).Times(4).WillRepeatedly(Return(n++));

Példa JMock példa gmock-al forrás: cpp/mocktest1

Linkek JUnit http://www.tutorialspoint.com/junit/ http://junit.org http://junit.sourceforge.net/javadoc/ http://code.google.com/p/mockito/ http://docs.mockito.googlecode.com/hg/la test/org/mockito/

Linkek gtest http://code.google.com/p/googletest/ http://code.google.com/p/googlemock/