Unit tesztelés Swift-ben

Slides:



Advertisements
Hasonló előadás
C# nyelvi áttekintő A „Programozás C# nyelven (Illés Zoltán)”
Advertisements

Osztály leszármaztatás
Adaptív megjelenítés a WPF layout rendszer segítségével.
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)
Adatbázis tesztelés.
Domain tesztelés bemutatása PHP tesztelés
Junit testing.
© 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.
A tesztelő rendszer RUBY KÖRNYEZETBEN. A Cucumber Aslak Hellesøy készítette az első verziót ami június 20-án jelent meg a legfrissebb.
Csala Péter ANDN #4. 2 Tartalom  C# - ban előre definiált típusok  Változók  Változókkal műveletek  Elágazás  Ciklus.
Fájlkezelés, IO Kivételkezelés Belső osztályok
Osztályok Garbage collection.  általában minden osztálynak vannak adattagjai és/vagy metódusai ◦ adattagok megadása:  [láthatóság] [static] [final]
Abstract osztályok és interface-ek Beolvasás és kiíratás 7. gyakorlat.
UNIVERSITY OF SZEGED D epartment of Software Engineering UNIVERSITAS SCIENTIARUM SZEGEDIENSIS Programozás II. 7. Gyakorlat Operator overloading.
Programozás II. 3. Gyakorlat C++ alapok.
UNIVERSITY OF SZEGED D epartment of Software Engineering UNIVERSITAS SCIENTIARUM SZEGEDIENSIS Programozás II. 6. Gyakorlat const, static, dinamikus 2D.
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.
C# tagfüggvények.
C# tagfüggvények.
Entity framework Krizsán Zoltán
SPRING FRAMEWORK bemutatása
Web-grafika (VRML) 10. gyakorlat Kereszty Gábor. Script típusok Elemi típusok: szám: egész vagy lebegőpontos – int / float – 1 / 1.1 string: ‘Hello World!’
© 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.
WPF alkalmazások fejlesztése az M-V-VM tervezési minta alapján
Szoftvertechnológia alapjai Java előadások Förhécz András, doktorandusz tárgy honlap:
Adattáblák kezelésére létrehozott automatikus formok Páll Éva Boglárka.
A PHP 5 újdonságai Az OOP terén. Miről lesz szó? Osztályok kezelése – Új direktívák – Konstruktor – Destruktor Interfészek Kivételkezelés.
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 Web: Magasszintű Programozási Nyelvek I. Eszterházy.
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 Web: Magasszintű Programozási Nyelvek I. Eszterházy.
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ú,
Készítette: Száraz Richárd. - Yukihiro Matsumoto tervezte meg 1995-ben - Célja egy emberközpontú OOP programozási nyelv megalkotása volt, amely egyszerű.
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
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 UNIT TEST. És tényleg: Honnan lehet tudni, hogy működik-e vagy sem?
Java web programozás 11..
HTML ÉS PHP (Nagyon) rövid áttekintés. ADATBÁZISRENDSZEREK MŰKÖDÉSI SÉMÁJA Felh. interakció DB Connector MySQL ? A gyakorlaton:
Objektumorientált alapjai ISZAM III.évf. részére Bunkóczi László.
Java web programozás 5..
1Szegedi Tudományegyetem Természettudományi és Informatikai KarAntal Gábor Programozás I. 6. gyakorlat.
JAVA programozási nyelv NetBeans fejlesztőkörnyezetben I/13. évfolyam
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][,
„Designer-barát” játéklogika
Dependency Injection Moq Feladat
Hernyák Zoltán Magasszintű Programozási Nyelvek I.
Hernyák Zoltán Programozási Nyelvek II.
Készítette: Zelenka Gábor
JAVA programozási nyelv NetBeans fejlesztőkörnyezetben I/13. évfolyam
Dependency Injection Tesztduplikátumok, Mock-ok, Fake-ek Feladat
JAVA programozási nyelv NetBeans fejlesztőkörnyezetben I/13. évfolyam
3. osztályban.
Dependency Injection Tesztduplikátumok, Mock-ok, Fake-ek Feladat
DevSecOps Ha gyors a deploy, a security folyamatoknak is skálázódni kell Ottucsák József
Függvénysablonok használata
Kotlin Multiplatform: Ilyen minek van?
Előadás másolata:

Unit tesztelés Swift-ben Célkeresztben a Mock-ok Csipler Zoltán 2019.04.29

mito. clever things Bevezetés Unit tesztelés Swift-ben mito. clever things // Arrange id mockInteractor = OCMClassMock([DetailInteractor class]); id mockView = OCMClassMock([DetailViewController class]); DetailPresenter *presenter = [DetailPresenter new]; presenter.interactor = mockInteractor; presenter.view = mockView; DetailInfo *detailInfo = [[DetailInfo alloc] initWithTitle:@"DetailTitle"]; OCMStub([mockInteractor provideDetailInfo]).andReturn(detailInfo); OCMExpect([mockView setDetailTitle:@"DetailTitle"]); // Act [presenter setupDetailScreen]; // Verify [mockInteractor verify]; [mockView verify]; Bevezetés Nagy kódbázis, modularizált komplex projekt, VIPER Cél: minél nagyobb test coverage Minél kisebb egységek tesztelése -> Stub, verify -> Mockolás Obj-C - OCMock lib (runtime access) Swift - nincs runtime access DetailInfo *detailInfo = [self.interactor provideDetailInfo]; [self.view setDetailTitle:detailInfo.detailTitle]; Csipler Zoltán 1/8 2019.04.29

mito. clever things Lehetséges megoldások A kettőt kombinálni Unit tesztelés Swift-ben mito. clever things Lehetséges megoldások Saját mock class-ok írása - költséges időben 3rd party lib használata - limitációk, maintenance A kettőt kombinálni Csipler Zoltán 2/8 2019.04.29

mito. clever things A mi megoldásunk Unit tesztelés Swift-ben mito. clever things A mi megoldásunk 3rd party mock generator lib használata: Cuckoo Protokollokat mockolunk Tesztek írása: service layer, interactor, presenter Csipler Zoltán 3/8 2019.04.29

mito. clever things Cuckoo Unit tesztelés Swift-ben mito. clever things class CredentialsLoginInteractorTests: QuickSpec { override func spec() { describe("CredentialsLoginInteractor") { var mockPresenter: MockCredentialsLoginInteractorOutputProtocol! var mockCredentialsLoginService: MockCredentialsLoginServiceProtocol! var mockAuthDataProvider: MockAuthDataProviderProtocol! var sut: CredentialsLoginInteractor! beforeEach { mockPresenter = MockCredentialsLoginInteractorOutputProtocol() mockCredentialsLoginService = MockCredentialsLoginServiceProtocol() mockAuthDataProvider = MockAuthDataProviderProtocol() sut = CredentialsLoginInteractor(credentialsLoginService: mockCredentialsLoginService, authDataProvider: mockAuthDataProvider) sut.presenter = mockPresenter } describe("fetchCMSData") { beforeEach { stub(mockPresenter) { mockPresenter in when(mockPresenter.presentCredentialsLogin(with: any())).thenDoNothing() } context("showForgottenUsername is false") { stub(mockAuthDataProvider) { mockAuthDataProvider in when(mockAuthDataProvider.showForgottenPassword.get).thenReturn(false) sut.fetchCMSData() it("presentCredentialsLogin should be called with false parameter") { verify(mockPresenter).presentCredentialsLogin(with: false) struct __StubbingProxy_DetailInteractorProtocol: Cuckoo.StubbingProxy { private let cuckoo_manager: Cuckoo.MockManager init(manager: Cuckoo.MockManager) { self.cuckoo_manager = manager } func provideDetailInfo() -> Cuckoo.ProtocolStubFunction<(), DetailInfo> { let matchers: [Cuckoo.ParameterMatcher<Void>] = [] return .init(stub: cuckoo_manager.createStub(for: MockDetailInteractorProtocol.self, method: "provideDetailInfo() -> DetailInfo", parameterMatchers: matchers)) // Arrange let mockInteractor = MockDetailInteractorProtocol() let mockView = MockDetailViewControllerProtocol() let detailPresenter = DetailPresenter() detailPresenter.interactor = mockInteractor detailPresenter.view = mockView let detailInfo = DetailInfo(detailTitle: "DetailTitle") stub(mockInteractor) { mockInteractor in when(mockInteractor).provideDetailInfo().thenReturn(detailInfo) } stub(mockView) { mockView in when(mockView).setDetailTitle(detailInfo.detailTitle).thenDoNothing() // Act detailPresenter.setupDetailScreen() // Verify verify(mockView).setDetailTitle(detailInfo.detailTitle) struct __VerificationProxy_DetailInteractorProtocol: Cuckoo.VerificationProxy { private let cuckoo_manager: Cuckoo.MockManager private let callMatcher: Cuckoo.CallMatcher private let sourceLocation: Cuckoo.SourceLocation init(manager: Cuckoo.MockManager, callMatcher: Cuckoo.CallMatcher, sourceLocation: Cuckoo.SourceLocation) { self.cuckoo_manager = manager self.callMatcher = callMatcher self.sourceLocation = sourceLocation } @discardableResult func provideDetailInfo() -> Cuckoo.__DoNotUse<DetailInfo> { let matchers: [Cuckoo.ParameterMatcher<Void>] = [] return cuckoo_manager.verify("provideDetailInfo() -> DetailInfo", callMatcher: callMatcher, parameterMatchers: matchers, sourceLocation: sourceLocation) class MockDetailInteractorProtocol: DetailInteractorProtocol, Cuckoo.ProtocolMock { typealias MocksType = DetailInteractorProtocol typealias Stubbing = __StubbingProxy_DetailInteractorProtocol typealias Verification = __VerificationProxy_DetailInteractorProtocol private var __defaultImplStub: DetailInteractorProtocol? let cuckoo_manager = Cuckoo.MockManager.preconfiguredManager ?? Cuckoo.MockManager(hasParent: false) func provideDetailInfo() -> DetailInfo { return cuckoo_manager.call("provideDetailInfo() -> DetailInfo", parameters: (), escapingParameters: (), superclassCall: Cuckoo.MockManager.crashOnProtocolSuperclassCall() , defaultCall: __defaultImplStub!.provideDetailInfo()) } … let projectDir = ProcessInfo.processInfo.environment["PROJECT_DIR", default: "."] let output = "\(projectDir)/Tests/Generated/GeneratedMocks.swift" // Use seperate variables for each file. let generatorArguments = [ "generate", "--testable", "Cuckoo", "--exclude", "ExcludedTestClass,ExcludedProtocol", "--output", output, "\(projectDir)/Tests/Source/DetailViewControllerProtocol.swift", "\(projectDir)/Tests/Source/DetailInteractorProtocol.swift", "\(projectDir)/Tests/Source/ExcludedTestClass.swift", ] shell(["swift", "run", "cuckoo_generator"] + generatorArguments, inDir: "\(projectDir)/Generator/") let detailInfo = interactor.provideDetailInfo() view?.setDetailTitle(detailInfo.detailTitle) Cuckoo Megadott swift fájlokban lévő osztályokra, protokollok-ra mock-ot generál OCMock, Mockito-hoz hasonló szintaktika Stub, verify, parametermatcher block Quick-el és Nimble-el együtt használtuk Csipler Zoltán 4/8 2019.04.29

mito. clever things Cuckoo limitációk Unit tesztelés Swift-ben mito. clever things Cuckoo limitációk public class MockOperationQueue: OperationQueue { public var cancelAllOperationsCallCount = 0 override public func cancelAllOperations() { cancelAllOperationsCallCount += 1 } Csak felülcsapható osztályokkal működik Final, private nem használható - protocol mockolásnál nem számít Statikus metódusok - ritkán használtuk, nem mockoljuk Generics - fixálható manuálisan -> Maintenance-t nehezíti Apple framework-ök nem mockolhatóak -> Saját mock Csipler Zoltán 5/8 2019.04.29

mito. clever things Előnyök/Hátrányok Unit tesztelés Swift-ben mito. clever things Előnyök/Hátrányok Nagy test coverage 👍 Mock-ok automatikus generálásával sok időt megspórolunk 👍 Maintenance - Script fájl karbantartása 👎 Build hibák sokszor nem egyértelműek 😯 Meddig lesz support a 3rd party lib-hez ❔ Csipler Zoltán 6/8 2019.04.29

mito. clever things Összefoglalás Unit tesztelés Swift-ben mito. clever things Összefoglalás Maintenance és komplexitás elsőre soknak tűnhet de idővel ahogy beletanultunk egyre könnyebben használhatóvá vált Sok feature Cuckoo-ban amiről nem esett szó A jövőben is használni fogjuk Csipler Zoltán 7/8 2019.04.29

mito. clever things Referencia Unit tesztelés Swift-ben mito. clever things Referencia https://github.com/Brightify/Cuckoo http://ocmock.org Csipler Zoltán 8/8 2019.04.29

Köszönöm a figyelmet! Csipler Zoltán 2019.04.29