Dependency Injection Moq Feladat

Slides:



Advertisements
Hasonló előadás
M OBILROBOT - PROGRAMOZÓ VERSENY Készítette: Szomjas Oroszlánok Team.
Advertisements

ADATSZERZÉS, INFORMÁCIÓ HASZNOSULÁS Biztonságtudatos vállalati kultúra Készítette: Jasenszky Nándor egyetemi szakoktató NKE NBI TEH tanszék.
FOL függvényjelekkel Zsebibaba anyja A 2 harmadik hatványa a oszlopában az első blokk Ezek is nevek, de nem in- konstansok Azért, mert összetettek Predikátum:
A képzett szakemberekért SZMBK KERETRENDSZER 2.1. előadás.
Bevezetés a C# nyelvbe Az alapok összefoglalása Farkas Csaba.
Az akkreditáció szerepe a megváltozott munkaképességű munkavállaló személyének társadalmi reintegrációjában Készítette: Dézsi Gabriella Melinda Budapest,
ISKOLAKÉSZÜLTSÉG – AZ ADAPTÍV VISELKEDÉS FEJLETTSÉGE dr. Torda Ágnes gyógypedagógus, klinikai gyermek-szakpszichológus Vizsgálóeljárás az iskolába lépéshez.
A FELNŐTTKÉPZÉSI A FELNŐTTKÉPZÉSI INTÉZMÉNYEK HATÉKONYSÁGÁNAK VIZSGÁLATA Felnőttképzők Szövetsége Borsi Árpád Budapest, december 10.
Hogyan teljesíthetjük a HpT 13§B követelményeit Egy vállalati Compliance Adatbázis terve Dr Lőrincz István Associator Kft.
Vetésforgó tervezése és kivitelezése. Vetésforgó Vetésterv növényi sorrend kialakításához őszi búza250 ha őszi árpa50 ha lucerna ebből új telepítés 300.
Informatikai rendszerek általános jellemzői 1.Hierarchikus felépítés Rendszer → alrendszer->... → egyedi komponens 2.Az elemi komponensek halmaza absztrakciófüggő.
EU pályázati programok A szervezet / változások 1.A pályázók adminisztrációs terheinek csökkentése a projektfejlesztési, pályázati szakaszban.
BEST-INVEST Független Biztosításközvetítő Kft.. Összes biztosítási díjbevétel 2004 (600 Mrd Ft)
Gazdasági jog IV. Előadás Egyes társasági formák Közkeresleti társaság, betéti társaság.
Palotás József elnök Felnőttképzési Szakértők Országos Egyesülete
DIGITÁLIS VÁSÁRLÁSOK, GENERÁCIÓS KÜLÖNBSÉGEK
A szerkezetátalakítási programban bekövetkezett változások
Valószínűségi kísérletek
Adatbázis normalizálás
Alhálózat számítás Osztályok Kezdő Kezdete Vége Alapértelmezett CIDR bitek alhálózati maszk megfelelője A /8 B
Scilab programozás alapjai
Egyszerű kapcsolatok tervezése
Kockázat és megbízhatóság
Programozás III. Gyakorlás.
PHP - függvények.
HÉL (Hasonló értelmű licit)
Sz&p prof.
Az integrált áramkörök (IC-k) típusai és tervezése
Kommunikáció a könyvvizsgálatban
Programozás I. Gyakorlás egydimenziós tömbökkel Többdimenziós tömbök
CSOPORT - A minőségellenőrök egy megfelelő csoportja
Colorianne Reinforce-B
Komplex természettudomány 9.évfolyam
Visual Studio Code Metrics
Animációk.
Adatbázis-kezelés (PL/SQL)
MEGKEZDTÜK A FELKÉSZÜLÉST A TANULÓI LAPTOP PROGRAMRA
2. Bevezetés A programozásba
Az élesség beállítása vagy fókuszálás
☺ Programozási környezetek Validátorok Fazekas Judit PTI 2010.
Kvantitatív módszerek
Közigazgatási alapvizsga a Probono rendszerben
Regressziós modellek Regressziószámítás.
Rendszerfejlesztés gyakorlat
Természettudományi kiselőadás címe
STRUKTURÁLT SERVEZETEK: funkció, teljesítmény és megbízhatóság
Rendszerfejlesztés gyakorlat
Tilk Bence Konzulens: Dr. Horváth Gábor
Tájékoztató az Önkormányzati ASP Projektről
Kalickás forgórészű aszinkronmotor csillag-delta indítása
Készítette: Zelenka Gábor
Sajben - Kenyeres Márta munkaközösség-vezető
Informatikai gyakorlatok 11. évfolyam
B M Java Programozás 4. Gy: Java GUI IT A N Tipper, MVC kalkulátor
Online jegyzőkönyv kitöltési segédlet
Környezeti Kontrolling
Új pályainformációs eszközök - filmek
TÁRGYI ESZKÖZÖK ELSZÁMOLÁSA
B M Java Programozás 9. Gy: Java alapok IT A N Adatkezelő 5.rész
Dependency Injection Tesztduplikátumok, Mock-ok, Fake-ek Feladat
A szállítási probléma.
I. HELYZETFELMÉRÉSI SZINT FOLYAMATA 3. FEJLESZTÉSI FÁZIS 10. előadás
Foglalkoztatási és Szociális Hivatal
B M Java Programozás 2. Gy: Java alapok IT A N Adatszerkezetek
Kérdőív a Pénzmosás és terrorizmus finanszírozása megelőzésének és megakadályozásának ellenőrzésére Készítette: Dancsné Veres Mária 2/24/2019.
Dependency Injection Tesztduplikátumok, Mock-ok, Fake-ek Feladat
Ki mit tud?- művészeti nap december 15. szombat
JAVA programozási nyelv NetBeans fejlesztőkörnyezetben I/13. évfolyam
A részekre bontás tilalma és annak gyakorlati alkalmazása
Algoritmusok.
Előadás másolata:

Dependency Injection Moq Feladat Haladó Programozás Dependency Injection Moq Feladat OE-NIK HP 1

Jól tesztelni nehéz (ismétlés) 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 + fake függőségek, mockolás... (=> Moq) 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); OE-NIK HP

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?) OE-NIK HP

Példa class MainWindowViewModel : INotifyPropertyChanged { private IEmployeeBusinessLogic employeeBusinessLogic; // ... private Employee selectedEmployee; public Employee SelectedEmployee get { return selectedEmployee; } set selectedEmployee = value; RemainingVacationDays = employeeBusinessLogic.CalcRemainingVacationDays(value); OnPropertyChanged(); } private int remainingVacationDays; public int RemainingVacationDays get { return remainingVacationDays; } set { remainingVacationDays = value; OnPropertyChanged(); } OE-NIK HP

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 class FakeEmployeeBusinessLogic : IEmployeeBusinessLogic { public int CalcRemainingVacationDays(Employee employee) if (employee == null) throw new NullReferenceException(); return 30; } OE-NIK HP

Fake-ek [TestFixture] class MainWindowViewModelTests { [Test] public void SelectedEmployeeChanged_RemainingDaysChanged() MainWindowViewModel viewModel = new MainWindowViewModel(new FakeEmployeeBusinessLogic()); Employee testEmployee = new Employee(); viewModel.SelectedEmployee = testEmployee; Assert.That(viewModel.RemainingVacationDays, Is.EqualTo(30)); } public void SelectedEmployeeChangedToNull_RemainingDaysSetToZero() viewModel.RemainingVacationDays = 111; viewModel.SelectedEmployee = null; Assert.That(viewModel.RemainingVacationDays, Is.EqualTo(0)); OE-NIK HP

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<IEmployeeBusinessLogic> mockBusinessLogic = new Mock<IEmployeeBusinessLogic>(); // mock elvárt viselkedésének beállítása... MainWindowViewModel viewModel = new MainWindowViewModel(mockBusinessLogic.Object); OE-NIK HP

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<IEmployeeBusinessLogic> mbl = new Mock<IEmployeeBusinessLogic>(); // különféle elvárt viselkedések beállítása, paraméterektől függően mbl.Setup(m => m.CalcRemainingVacationDays(testEmployee)).Returns(99); mbl.Setup(m => m.CalcRemainingVacationDays(otherEmployee)).Returns(30); mbl.Setup(m => m.CalcRemainingVacationDays(It.IsAny<Employee>())).Returns(99); mbl.Setup(m => m.CalcRemainingVacationDays(null)).Throws<NullReferenceException>(); mbl.Setup(m => m.CalcRemainingVacationDays( It.Is<Employee>(emp => emp.Country == "Hungary"))).Returns(50); mbl.Setup(m => m.BaseVacationDays).Returns(6); // property fix érték mbl.Setup(m => m.BaseVacationDays); // property előkészítése használatra mbl.SetupAllProperties(); // összes property előkészítése 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!!! OE-NIK HP

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 // pont 3-szor hívódott, paraméter mindegy mbl.Verify(m => m.CalcRemainingVacationDays(It.IsAny<Employee>()), Times.Exactly(3)); // testEmployee paraméterrel max kétszer mbl.Verify(m => m.CalcRemainingVacationDays(testEmployee), Times.AtMost(2)); // otherEmployee-val egy hívás sem történt mbl.Verify(m => m.CalcRemainingVacationDays(otherEmployee), Times.Never); // property egyszer getelve lett mbl.VerifyGet(m => m.BaseVacationDays, Times.Once); // property egyszer 10-re lett setelve mbl.VerifySet(m => m.BaseVacationDays = 10, Times.Once); ASSERT fázisban csinálod ezt OE-NIK HP

Példa [Test] public void SelectedEmployeeChanged_RemainingDaysChanged() { // ARRANGE Mock<IEmployeeBusinessLogic> mbl = new Mock<IEmployeeBusinessLogic>(); mbl.Setup(m => m.CalcRemainingVacationDays(It.IsAny<Employee>())).Returns(99); MainWindowViewModel viewModel = new MainWindowViewModel(mbl.Object); // ACT viewModel.SelectedEmployee = new Employee(); // ASSERT // eredmény az elvárt: Assert.That(viewModel.RemainingVacationDays, Is.EqualTo(99)); // egyszer hívódott csak: mbl.Verify(m => m.CalcRemainingVacationDays(It.IsAny<Employee>()), Times.Once); } OE-NIK HP