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

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

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.

Adatbázisok webalkalmazásokban

Objektumorientált programozás C# nyelven

Programozási nyelvek Java

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

Webes alkalmazások fejlesztése 8. előadás. Webszolgáltatások megvalósítása (ASP.NET WebAPI)

JavaServer Pages (JSP) (folytatás)

Delegátumok C#-ban Krizsán Zoltán iit

Java Programozás 4. Gy: Java GUI. Tipper, MVC kalkulátor

C# nyelv alapjai. Krizsán Zoltán 1. Objektumorientált programozás C# alapokon tananyag. Általános Informatikai Tanszék Miskolci Egyetem

CREATE TABLE student ( id int NOT NULL GENERATED ALWAYS AS IDENTITY PRIMARY KEY, name varchar(100) NOT NULL, address varchar(100) NOT NULL )

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

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

Java Programozás 11. Ea: MVC modell

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

Objektumorientált programozás C# nyelven III.

Algoritmusok és adatszerkezetek II.

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

Programozási nyelvek II. JAVA

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

Az új be- és kimenet könyvtár

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

ANDROID ALKALMAZÁSFEJLESZTÉS

Java és web programozás

Java Programozás 6. Gy: Java alapok. Adatkezelő 2.rész

C#, OOP. Osztályok tervezése C#-ban

BME MOGI Gépészeti informatika 4.

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

Adatbázis alapú rendszerek gyakorlat Adatbázis alapú alkalmazásfejlesztés Java, C# környezetben

Programozási technológia 2.

Java-ról Kotlinra. Ekler Péter AutSoft BME AUT. AutSoft

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

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?

Feladatok cím szerint

Objektumorientált programozás C# nyelven

Kivételek. A program végrehajtása során ritkán bekövetkező események Nem a fő végrehajtási ág ; logikailag alacsonyabbrendű feladat jelzése

MVC. Model View Controller

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

ZH mintapélda. Feladat. Felület

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

FELÜLET...13 PROJEKTTERV...14

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

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

Java Programozás 9. Gy: Java alapok. Adatkezelő 5.rész

JUnit.

Osztályok. 4. gyakorlat

Overview. Service. Application Activity Activity 2 Activity 3. Fragment. Fragment. Fragment. Frag ment. Fragment. Broadcast Receiver

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

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

Segédanyag: Java alkalmazások gyakorlat

C# nyelvhez kapcsolódó programozási feladatok

Grafikus felhasználói felületek. Abstract Window Toolkit, a java.awt és java.awt.event csomagok

SDI ALKALMAZÁS I. Workspace / ResourceView / Toolbar / IDR_MAINFRAME. Workspace / ResourceView / Menu / IDR_MAINFRAME

A WEB programozása - JSP1 dr.gál Tibor őszi félév

Emlékeztető: a fordítás lépései. Szimbólumtábla-kezelés. Információáramlás. Információáramlás. Információáramlás.

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

Programozási nyelvek II.: JAVA

117. AA Megoldó Alfréd AA 117.

Elemi Alkalmazások Fejlesztése II.

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

JAVA PROGRAMOZÁS 3.ELŐADÁS

Symfony kurzus 2014/2015 I. félév. Security: authentication, authorization, user provider, role-ok, access control, FOS user bundle

SZERVER OLDALI JAVASCRIPT. 12. hét Unit és integrációs tesztek, mocha, assert struktúrák, TDD / DBB

Kalapácsvetés 2016 szöveges

Szerializáció. Tóth Zsolt. Miskolci Egyetem. Tóth Zsolt (Miskolci Egyetem) Szerializáció / 22

7. K: JAVA alapok Konzultáció

Webes alkalmazások fejlesztése 4. előadás. Megjelenítés és tartalomkezelés (ASP.NET)

Bánsághi Anna

Programozás II. labor

RIA Rich Internet Application

Webes alkalmazások fejlesztése 4. előadás. Megjelenítés és tartalomkezelés (ASP.NET) Cserép Máté.

BME MOGI Gépészeti informatika 8.

Java Programozás 1. Gy: Java alapok. Ismétlés ++

Access adatbázis elérése OLE DB-n keresztül

Java programozási nyelv 4. rész Osztályok II.

XML adatkezelés I. Az SAX szabvány. Dr. Kovács László Miskolci Egyetem Általános Informatikai Tanszék. XML adatok kezelési lehetőségei

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

Hello World Servlet. Készítsünk egy szervletet, amellyel összeadhatunk két számot, és meghívásakor üdvözlőszöveget ír a konzolra.

OAF Gregorics Tibor: Minta dokumentáció a 3. házi feladathoz 1.

Viczián István IP Systems JUM XIX szeptember 18.

PHP II. WEB technológiák. Tóth Zsolt. Miskolci Egyetem. Tóth Zsolt (Miskolci Egyetem) PHP II / 19

Programozás C++ -ban 2007/4

abkezel.java import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.sql.*; public class abkezel extends JFrame {

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

Segédanyag: Java alkalmazások gyakorlat

OOP #14 (referencia-elv)

Java IX. telkezelés a Java-ban

Java és web programozás

Java IX. telkezelés a Java-ban

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)

Kivételkezelés, naplózás. Exception handling, logging

Segédanyag: Java alkalmazások gyakorlat

Programozási technológia

Torna. A torna.csv UTF-8 kódolású állományban soronként egy versenyző eredményeit tároljuk. Az adatokat pontosvessző választja el egymástól.

INFORMATIKAI ALAPISMERETEK

Johanyák Zsolt Csaba: Képnézegető program oktatási segédlet

Objektumorientált programozás C# nyelven

Programozás BMEKOKAA146. Dr. Bécsi Tamás 1. Előadás

Java Programozás 8. Gy: Java alapok. Adatkezelő 4.rész

Átírás:

Modern unit és integrációs tesztelés HOUG Orákulum - 2016. április Viczián István Java fejlesztő - IP Systems @vicziani at Twitter http://jtechlog.hu

Miről lesz szó? 1 / 26 Automatizált tesztelés fontossága Unit és integrációs tesztek Élő dokumentáció Példaprojekt: https://github.com/vicziani/spring-training

Gyors 2 / 26

Tesztelendő unit 3 / 26 Coord public static Coord parse(string s) { String[] items = s.split(","); if (items.length!= 2) { throw new IllegalArgumentException( String.format("Invalid coordinate: %s", s)); double lat = Double.parseDouble(items[0].trim()); double lon = Double.parseDouble(items[1].trim()); return new Coord(lat, lon);

Unit teszt 4 / 26 CoordTest @Test public void shouldparse() { String position = "47.4811281,18.9902207"; Coord coord = Coord.parse(position); assertthat(coord.getlat(), is(47.4811281)); assertthat(coord.getlon(), is(18.9902207));

Unit teszt Hamcresttel 5 / 26 CoordTest @Test public void shouldparseassertwithmatcher() { String position = "47.4811281,18.9902207"; assertthat(coord.parse(position), iscoord(is(47.4811281), is(18.9902207)));

Unit teszt rule-lal 6 / 26 CoordTest @Rule public ExpectedException thrown = ExpectedException.none(); @Test public void shoudthrowillegalargumentexception() { String position = "abc"; thrown.expect(illegalargumentexception.class); thrown.expectmessage(is("invalid coordinate: abc")); Coord.parse(position);

Paraméterezett unit teszt 7 / 26 CoordParametrizedTest @Parameterized.Parameters(name = "{index: Coord.parse for {0 throws {1") public static Collection<Object[]> data() { return Arrays.asList(new Object[][] { { null, NullPointerException.class, { "", IllegalArgumentException.class, { "1", IllegalArgumentException.class, { "1,2,3", IllegalArgumentException.class, { "1,a", NumberFormatException.class, { "a,1", NumberFormatException.class, { ",1", NumberFormatException.class, { ",,", IllegalArgumentException.class );

Biztosítja a struktúrát 8 / 26

Nem unit tesztelhető 9 / 26 public Page<LocationDto> listlocations(pageable pageable) { return new LocationRepositoryImpl().findAll(pageable).map(new LocationDtoConverter());

Tesztelhető 10 / 26 LocationService public class LocationService { private LocationRepository locationrepository; @Autowired public LocationService(LocationRepository locationrepository) { this.locationrepository = locationrepository; public Page<LocationDto> listlocations(pageable pageable) { return locationrepository.findall(pageable).map(new LocationDtoConverter());

Teszt Mockitoval 11 / 26 LocationServiceTest @RunWith(MockitoJUnitRunner.class) public class LocationServiceTest { @Mock LocationRepository locationrepository; @InjectMocks LocationService locationservice; @Test public void shouldcallsave() { locationservice.createlocation( new CreateLocationDto("Budapest", "47.4811281,18.9902207")); verify(locationrepository).save( (Location) argthat(hasproperty("name", is("budapest"))));

Biztonságos 12 / 26

Refaktoring 13 / 26 Olvashatóság Komplexitás csökkentése Kód befogadás Teszt - refaktoring - teszt

Unit vagy integrációs teszt? 14 / 26

Integrációs teszt 15 / 26 Teszt piramis? Minden teszteset előtt adatbázis törlés Alapadatok feltöltése az alkalmazáson keresztül

Integrációs teszt controlleren 16 / 26 LocationControllerIntegrationTest @Test public void aftersaveshouldquery() { CreateLocationDto createlocationdto = new CreateLocationDto("Budapest", "47.4811281,18.9902207"); locationcontroller.postsavelocation(createlocationdto, new BeanPropertyBindingResult(createLocationDto, "createlocationdto"), new PageRequest(0, 50), new RedirectAttributesModelMap()); ModelAndView modelandview = locationcontroller.getlistlocations(new PageRequest(0, 50)); List<LocationDto> locations = ((Page<LocationDto>) modelandview.getmodelmap().get("locations")).getcontent(); assertthat(locations, hassize(1)); assertthat(locations, hasitem(locationwithname(is("budapest")).withlat(is(47.4811281)).withlon(is(18.9902207))));

Integrációs teszt Spring Mock MVC-vel 17 / 26 LocationControllerMockMvcIntegrationTest @Test public void aftersaveshouldquery() throws Exception { mockmvc.perform(post("/").param("name", "Budapest").param("position", "47.4811281,18.9902207")).andExpect(status().is3xxRedirection()); mockmvc.perform(get("/")).andexpect(status().isok()).andexpect(model().attribute("locations", hasitem(locationwithname(is("budapest")).withlat(is(47.4811281)).withlon(is(18.9902207)))));

Integrációs teszt, assert a renderelt view-n 18 / 26 LocationControllerMockMvcIntegrationTest mockmvc.perform(get("/")).andexpect(status().isok()).andexpect(content().string(containsstring("budapest")));

Integrációs teszt rest controlleren 19 / 26 LocationRestControllerIntegrationTest @Test public void aftersaveshouldquery() { locationrestcontroller.postsavelocation( new CreateLocationDto("Budapest", "47.4811281,18.9902207")); List<LocationDto> locations = locationrestcontroller.getlistlocations( new PageRequest(0, 50)).getContent(); assertthat(locations, hassize(1)); assertthat(locations, hasitem(locationwithname(is("budapest")).withlat(is(47.4811281)).withlon(is(18.9902207))));

Integrációs teszt Mock Mvc-vel 20 / 26 LocationRestControllerMockMvcIntegrationTest @Test public void aftersaveshouldquery() throws Exception { mockmvc.perform(post("/api/locations").param("name", "Budapest").param("position", "47.4811281,18.9902207")).andExpect(status().isOk()); mockmvc.perform(get("/api/locations")).andexpect(status().isok()).andexpect(jsonpath("$.content[0].name", is("budapest"))).andexpect(jsonpath("$.content[0].lat", is(47.4811281))).andexpect(jsonpath("$.content[0].lon", is(18.9902207)));

Integrációs tesztelés driverrel 21 / 26 LocationRestControllerDriverIntegrationTest @Test public void aftersaveshouldquery() { locationdriver.newlocation().withname("budapest").withposition("47.4811281,18.9902207").create().listlocations().locationssize(1).haslocation(locationwithname(is("budapest")).withlat(is(47.4811281)).withlon(is(18.9902207)));

Élő dokumentáció 22 / 26

Concordion 23 / 26 HTML dokumentáció, mögötte integrációs tesztek Hiba esetén színezés Szétválik a dokumentációs és kód Szétválik a funkció leírása és a példa Nem kötött formátum Dokumentáció generálható

Concordion HTML 24 / 26 Location.html <p concordion:execute="savelocation(#name, #position)"> Felveszek egy új helyet <span concordion:set="#name">budapest</span> névvel <span concordion:set="#position">47.4811281, 18.9902207</span> koordinátával.</p> <p><span concordion:execute="querybyname(#name)"/> Ha lekérdezem a megadott névvel, a szélességi fok <span concordion:assertequals="getlat()">47.4811281</span>, és a hosszúsági fok <span concordion:assertequals="getlon()">18.9902207</span> lesz.</p>

Concordion Java teszt 25 / 26 LocationTest public void savelocation(string name, String position) { locationdriver.newlocation().withname(name).withposition(position).create(); public void querybyname(string name) { locationdto = locationdriver.listlocations().findbyname(name); public double getlat() { return locationdto.lat; public double getlon() { return locationdto.lon;