Dependency Injection Tesztduplikátumok, Mock-ok, Fake-ek Feladat

Slides:



Advertisements
Hasonló előadás
Osztály leszármaztatás
Advertisements

1 Hernyák Zoltán Programozási Nyelvek II. Eszterházy Károly Főiskola Számítástudományi tsz.
C++ programozási nyelv Gyakorlat hét
Rendszerfejlesztés gyakorlat - © Fülöp Lajos
Programozás III KOLLEKCIÓK 2..
A webes tesztelés jövője
1 Hernyák Zoltán Programozási Nyelvek II. Eszterházy Károly Főiskola Számítástudományi tsz.
Adatbányászati technikák (VISZM185)
Öröklődés 2..
Junit testing.
RMI = Remote Method Invocation
© Kozsik Tamás Beágyazott osztályok A blokkstrukturáltság támogatása –Eddig: egymásba ágyazható blokk utasítások Osztálydefiníciók is egymásba.
Bevezetés a Java programozásba
Osztályok Garbage collection.  általában minden osztálynak vannak adattagjai és/vagy metódusai ◦ adattagok megadása:  [láthatóság] [static] [final]
UNIVERSITY OF SZEGED D epartment of Software Engineering UNIVERSITAS SCIENTIARUM SZEGEDIENSIS Programozás II. 5. Gyakorlat Öröklődés, virtuális függvények,
UNIVERSITY OF SZEGED D epartment of Software Engineering UNIVERSITAS SCIENTIARUM SZEGEDIENSIS Programozás II. 6. Gyakorlat const, static, dinamikus 2D.
Fejlett Programozási Technológiák II. Világos Zsolt 12. gyakorlat.
Tömbök ismétlés Osztályok Java-ban Garbage collection
Java programozási nyelv 3. rész – Osztályok I.
A C++ programozási nyelvSoós Sándor 1/15 C++ programozási nyelv Gyakorlat hét Nyugat-Magyarországi Egyetem Faipari Mérnöki Kar Informatikai Intézet.
A C++ programozási nyelvSoós Sándor 1/12 C++ programozási nyelv Gyakorlat - 8. hét Nyugat-Magyarországi Egyetem Faipari Mérnöki Kar Informatikai Intézet.
WSDL alapismeretek A WSDL (Web Services Description Language – Web szolgáltatások leíró nyelv) egy XML-alapú nyelv a Web szolgáltatások leírására és azok.
C# tagfüggvények.
C# tagfüggvények.
SPRING FRAMEWORK bemutatása
Szmetankó Gábor Greencode Kft.
OE-NIK HP Haladó Programozás WCF kivételkezelés. OE-NIK HP Haladó Programozás Windows Communication Foundation A szolgáltatás, a hoszt és az ügyfél elkészítése.
© Kozsik Tamás Csomagok. © Kozsik Tamás A program tagolása Típusdefiníciók (osztályok, interfészek) Metódusok Blokk utasítások Csomagok.
Regresszióanalízis 10. gyakorlat.
WEB MES (webes gyártásirányító rendszer) Kiss Miklós (G-5S8)
Ficsor Lajos Template-ek CPP8/ 1 Template-ek. Ficsor Lajos Template-ek CPP8/ 2 A template fogalma Kiindulási probléma: tetszőleges típusokon kellene ugyanolyan.
PHP I. Alapok. Mi a PHP? PHP Hypertext Preprocessor Szkriptnyelv –Egyszerű, gyors fejlesztés –Nincs fordítás (csak értelmező) Alkalmazási lehetőségek:
Objektum orientált programozás a gyakorlatban
1 Hernyák Zoltán Programozási Nyelvek II. Eszterházy Károly Főiskola Számítástudományi tsz.
Hernyák Zoltán Programozási Nyelvek II.
1 Hernyák Zoltán Programozási Nyelvek II. Eszterházy Károly Főiskola Számítástudományi tsz.
1 Hernyák Zoltán Programozási Nyelvek II. Eszterházy Károly Főiskola Számítástudományi tsz.
1 Hernyák Zoltán Programozási Nyelvek II. Eszterházy Károly Főiskola Számítástudományi tsz.
1 Hernyák Zoltán Programozási Nyelvek II. Eszterházy Károly Főiskola Számítástudományi tsz.
1 Hernyák Zoltán Programozási Nyelvek II. Eszterházy Károly Főiskola Számítástudományi tsz.
1 Hernyák Zoltán Programozási Nyelvek II. Eszterházy Károly Főiskola Számítástudományi tsz.
1 Hernyák Zoltán Programozási Nyelvek II. Eszterházy Károly Főiskola Számítástudományi tsz.
1 Hernyák Zoltán Programozási Nyelvek II. Eszterházy Károly Főiskola Számítástudományi tsz.
Javascript Microsoft által készített kiegészítése Statikus típusosság Nagy projektek Windows 8 fejlesztésénél WinRT egy részét ebben írták Nyílt forráskódú,
V 1.0 Szabó Zsolt, Óbudai Egyetem, Programozási Paradigmák és Technikák Programozási eszközök Interfészek Generikus.
V 1.0 Szabó Zsolt, Óbudai Egyetem, Programozási Paradigmák és Technikák Programozási eszközök Interfészek Generikus.
Android alkalmazások tesztelése
Java programozási nyelv Metódusok
Generics Krizsán Zoltán. Bemutató A.NET 2.0 verziótól. A.NET 2.0 verziótól. Típusparaméter Típusparaméter Más nyelvben ez a template (sablon). Más nyelvben.
Programozás III KOLLEKCIÓK.
Programozás III UNIT TEST. És tényleg: Honnan lehet tudni, hogy működik-e vagy sem?
Java web programozás 11..
1 Objektum orientált programozás Öröklődés: többszörös öröklődés, konstruktorok, destruktorok, overloading Nagy Szilvia.
Enterpise JavaBeans Simon Balázs
Programozás III KOLLEKCIÓK.
Programozás III KIVÉTEL.
ProgramozásProgramozás célja hosszabb számítások elvégzése ill. kiíratása akkor érdemes programot írni, ha sok számolni való van illetve ha ugyanazt az.
Objektumorientált alapjai ISZAM III.évf. részére Bunkóczi László.
Programozás III KIVÉTEL. KIVÉTELKEZELÉS Hibátlan program nincs!!! eddig hiba esetén leállt a program. Példa ilyen hibákra: ─ ArrayBoundsOfException (tömb.
1Szegedi Tudományegyetem Természettudományi és Informatikai KarAntal Gábor Programozás I. 6. gyakorlat.
TÁMOP /1-2F JAVA programozási nyelv NetBeans fejlesztőkörnyezetben I/13. évfolyam Osztályok, objektumok definiálása és alkalmazása. Saját.
Krizsán Zoltán, iit C# osztályok 2 Adattagok  Osztály hatáskörben definiált változó.  Formája: [attribútum] [módosító] típus azonosító [=kezdő érték][,
Alkalmazásfejlesztés gyakorlat
Dependency Injection Moq Feladat
Hernyák Zoltán Programozási Nyelvek II.
Web programozás és haladó fejlesztési technikák
Web programozás és haladó fejlesztési technikák – C#
Web programozás és haladó fejlesztési technikák
Dependency Injection Tesztduplikátumok, Mock-ok, Fake-ek Feladat
Unit tesztelés Swift-ben
Előadás másolata:

Dependency Injection Tesztduplikátumok, Mock-ok, Fake-ek Feladat Web programozás és haladó fejlesztési technikák Dependency Injection Tesztduplikátumok, Mock-ok, Fake-ek Feladat 1

Jól tesztelni nehéz Legyenek a tesztek gyorsak Lassú tesztek folyamatos futtatása nem lehetséges => hibák késői kiderülését okozhatja Legyenek lehetőleg egymástól függetlenek Sorrend, időzítés stb. nem hathat ki az eredményre Ránézésre olvasható nevekkel A jól elkészített tesztlista dokumentálja a kód képességeit (requirement-listának fogható fel) Nem kell és nem is szabad minden inputlehetőséget lefedni Sokszor példákkal tesztelnek Corner case-ek megtalálása fontosabb Egyszerre egyetlen művelet, és egy osztály tesztelése Mindig függetlenül az éles adattól, ami változhat – tehát nem olvasunk éles adatbázist, éles settingsfájlt, stb. Osztályok függőségeit is helyettesítjük: Dependency Injection + tesztduplikátumok (test doubles) Ránézésre olvasható nevekkel: + ránézésre olvasható teszt is legyen Az egymástól való függetlenítés miatt akár kódduplikáció is simán megengedett

Dependency Injection Az osztályok függőségeit kívülről biztosítjuk – interfészek formájában A DI lehetővé teszi a fejlesztés előrehaladtával a függőség lecserélését – az interfész megtartása mellett Lehetővé teszi a „valódi” unit- („egység-”) tesztelést is Tesztelésnél szándékosan cseréljük a függőséget egy ismert, egyszerű, e célra létrehozott objektumra Osztály függetlenítése a függőségeitől („Mindig függetlenül az éles adattól” ... „Egyszerre egyetlen művelet, és egy osztály tesztelése”) Gyorsaság Komplex osztály helyett nagyon egyszerű csereobjektum, csak azokkal az aspektusokkal, amelyekről a teszt szól Függetlenség 1 teszt => 1 csereobjektum Ha a tesztet osztály esetleg írni akar az objektumba, az se gond Technikái: fake függőségek, mockolás, stb. A DI nem (elsősorban) teszt célú dolog, de a tesztelhetőség egy lényeges előny. A DI-t teljesen betartó kód írása bonyolult, a Main()-nek ismernie kéne minden függőséget? => IoC containerek

Constructor Injection interface IMyDependency { string DoSomething(); } class MyClass private IMyDependency dependency; public MyClass(IMyDependency dependency) this.dependency = dependency; // metódusaiban: dependency.DoSomething() // használata IMyDependency myDependency; // értékadás... MyClass myClass = new MyClass(myDependency);

Method Injection, Setter Injection class MyClass { public void DoSomethingUsingDependency(IMyDependency dependency) // ... dependency.DoSomething() ... } class MyClass { public IMyDependency Dependency { get; set; } // metódusaiban: dependency.DoSomething() } Constructor Injection – gyakori, ha sok helyen kell a függőség Method Injection – gyakori, ha egy helyen kell a függőség Setter Injection – ritka Mindenhol ellenőrizni kell, hogy be lett-e már állítva Többszálúság még több gondot okoz (nem lett-e újra null?) Most már használhatunk test double-öket!

Fake-ek Azonos interfészt implementál a helyettesítendő objektummal, de semmilyen, vagy csak szándékosan egyszerűsítő, tesztcélú logikát tartalmaz

Mock-ok Azonos interfészt implementál a helyettesítendő objektummal – nincs logika, fix adat Általában lehetőséget ad a végrehajtódó logika megfigyelésére is Expectation-ök: „a DoSomething() függvény pontosan egyszer hívódott” Mocking framework segítségével szokás készíteni Mocking framework képességeitől függően a mock, fake, stub stb. különbség elmosódhat Nagyon gyakori, hogy egyszerűen fake-nek használják a mockokat (és nincs expectation-ellenőrzés) Az egyik legelterjedtebb .NET mocking framework: Moq Mock<IEmailSender> mockMailSender = new Mock<IEmailSender>(); // mock elvárt viselkedésének beállítása... NewsletterService service = new NewsletterService(mockMailSender.Object);

Mock elvárt viselkedésének beállítása Egy mock objektum bármely függvénye bármilyen hívást enged, nem dob exceptiont, és default értéket ad vissza Setup által módosítható ez a működés Onnantól csak az így meghatározott hívások megengedettek! Egy mock objektum propertyje nem jegyzi meg az értékét, és default értéket ad vissza Setup/SetupAllProperties által módosítható ez a működés Mock<ISubscriberRepository> repositoryMock = new Mock<ISubscriberRepository>(); Mock<IEmailSender> senderMock = new Mock<IEmailSender>(); // különféle elvárt viselkedések beállítása, paraméterektől függően repositoryMock.Setup(m => m.Subscribers).Returns(expectedSubscribers); repositoryMock.Setup(m => m.Subscribers).Returns(Enumerable.Empty<Subscriber>()); repositoryMock.Setup(m => m.Subscribers).Throws<NullReferenceException>(); senderMock.Setup( m => m.SendEmail("a@a.hu", "to", "subject", "body")).Returns(true); m => m.SendEmail(null, It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>())) .Throws<NullReferenceException>(); ARRANGE fázisban csinálod ezt. A fenti Setup-ok egyszerre nyilván nem fognak működni, csak példák. Ha egyszer setupoltál, akkor csak a konkrétan megadott módokon tudod hívni a függvényt, különben exception!!!

Logika ellenőrzése mockkal (csak Setup után) // ARRANGE Mock<IEmployeeBusinessLogic> mbl = new Mock<IEmployeeBusinessLogic>(); // ... Setup a később ellenőrzendő függvényekre, propertykre... // ACT ... // ASSERT // 1x hívódott a@a.hu-ra senderMock.Verify( m => m.SendEmail("a@a.hu", It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>()), Times.Once); // sosem hívódott nullal m => m.SendEmail(null, It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>()), Times.Never); // 0x volt 1-nél nagyobb log loggerMock.Verify( m => m.Log(It.Is<int>(i => i > 1), It.IsAny<string>()), Times.Never); ASSERT fázisban csinálod ezt

Példa

Feladat Hozzunk létre az EMP táblához egy üzleti logikát Repository segítségével éri el az adatokat Hozzuk létre a repository elvárt működését leíró interfészeket A logika legyen képes munkakörre szűrni A logika legyen képes a munkakörönkénti átlagfizetések meghatározására A logika teszteléséhez NE használjunk tényleges adatbázist! A Moq segítségével hozzunk létre az Arrange fázisban egy mockolt repository-t A repository adatlekérő metódusa az aktuális tesztnek megfelelő adathalmazt adjon vissza A tesztelés során vizsgáljuk, hogy a logika megfelelő eredményt ad -e, illetve megfelelően használja –e a Repository publikus adatlekérő metódusát