Introduction å Testing på iOS
105
Del
10
Del
Dette Cyber mandag Envato Tuts + kurs vil bli redusert til bare $ 3. Ikke gå glipp av.
Ingen ønsker å sende buggy programvare. Sikre at du slipper en mobilapplikasjon av høyeste kvalitet krever mye mer enn et menneske-drevet manuell kvalitetssikringsprosess. Nye enheter og operativsystemer er frigitt til offentligheten hvert år. Dette betyr at det er et stadig voksende kombinasjon av skjermstørrelser og operativsystemversjoner som du må teste din mobil. Ikke bare vil det være svært tidkrevende, men forsøker å teste iOS søknad ved manuell testing forsømmer en hel del av moderne software engineering prosessen automatisert kvalitetssikring testing.
I dagens verden, er det mange verktøy tilgjengelig som kan brukes til å teste programvaren du skriver automatisk. Noen av disse verktøyene er opprettholdt gjennom en åpen kildekode-modellen, men det er også en kjerne sett levert av Apple. Med hver ny utgave av iOS SDK, har Apple fortsatt å vise sitt engasjement mot å forbedre verktøyene som er tilgjengelige for utviklere å teste koden de skriver. For iOS utbygger som er nytt for automatisert testing og interessert i å komme i gang, Apples verktøy er et godt sted å begynne.
1. Apple gir nyttig verktøy
Denne opplæringen kommer til å gi instruksjoner for å bruke et verktøy som Apple leverer for automatisert testing, XCTest. XCTest er Apples enhetstesting rammeverk. Enhetstesting er en type automatisert testing som verifiserer kode på det laveste nivået. Du skriver Objective-C-kode som kaller metoder fra "produksjon" kode og bekrefte at koden under test faktisk gjør det den er ment å gjøre. Er variabler riktig innstilt? Er returverdien riktig?
Tester skrevet med XCTest rammeverket kan gjentatte ganger henrettet mot programmets kode for å hjelpe deg med å få tillit til at du oppretter et feilfritt produkt i at nye kodeendringer ikke bryte eksisterende funksjonalitet .
Som standard er alle nye Xcode prosjekt som er opprettet med et godt utgangspunkt for å skrive enhet tester. Dette inkluderer tre ting:
en egen mål for testene
en gruppe for test klasser
et eksempel test
La oss grave i strukturen i en iOS-enhet test. En enkelt enhet test er representert som en enkelt metode innen noen underklasse av XCTestCase hvor metoden returnerer ugyldig, tar ingen parametere, og metoden navnet begynner med test
-. (Void) testSomething {}
Heldigvis gjør Xcode lage testtilfeller lett. Med nye Xcode prosjekter, er en innledende test skapt for deg i en egen fil gruppe hvis navn er suffikset av ordet tester.
2. Oppretting av First iOS Unit Test
Jeg har laget et eksempelprosjekt som kan brukes som en referanse for eksemplene i denne opplæringen. Last prosjektet fra GitHub og åpne den i Xcode
Trinn 1:.. Opprett Test Case Class
I prøven prosjektet, kan du finne gruppen av tester i mappen som heter JumblifyTests
For å opprette din første test, høyreklikk på filen gruppen, JumblifyTests, og velg Ny fil. Velg Test Case Class fra iOS > § kilde, og gi den nye underklassen et navn.
Den typiske navnekonvensjon er å navngi testen saken slik at det er navnet på den tilsvarende klasse under test, med suffikset tester. Siden vi skal teste JumblifyViewController klassen, navngi XCTestCase subklasse JumblifyViewControllerTests
Trinn 2:. Fjern Boilerplate Kode
I den splitter nye XCTestCase underklasse, vil du se fire metoder. To av disse er tester selv. Kan du identifisere hvilke de er? Husk at testmetode navnene begynner med ordet "test".
Hvis du ikke finne ut av det, de testmetoder som er opprettet som standard er testExample og testPerformanceExample.
Slett begge testene, fordi vi kommer til å skrive våre fra scratch. De to andre metoder, oppsett og nedrigging, overstyres fra superklassen, XCTestCase. De er unike i at oppsett og nedrigging kalles før og etter hver testmetode startes hhv. De er nyttige steder å sentralisere kode som skal utføres før eller etter hver test metoden kalles. Oppgaver som felles initialisering eller opprydding gå her
Trinn 3:. Koble til Test med klassen din Under Test
Importer header fil av JumblifyViewController klassen og legge en eiendom av type JumblifyViewController . til XCTestCase underklasse
property (nonatomic) JumblifyViewController * vcToTest;
I oppsettmetoden, initial eiendommen som vist nedenfor Anmeldelser - (void) setup {[super Setup].; self.vcToTest = [[JumblifyViewController Alloc] init];}
Trinn 4:. Skriv en Test
Vi overvåker nå kommer til å skrive en test for å teste reverseString: metoden i JumblifyViewController klassen
Lag en testmetode som bruker instansiert vcToTest objekt å teste reverseString: metode. I denne testmetoden, skaper vi en NSString objekt og gi det til visningen kontrollerens reverseString: metode. . Det er vanlig konvensjon for å gi din test et meningsfullt navn for å gjøre det klart hva testen er testing Anmeldelser - (void) testReverseString {NSString * originalString = @ "himynameisandy"; NSString * reversedString = [self.vcToTest reverseString: originalString];}
På dette punktet, vi har ikke gjort noe nyttig likevel, fordi vi ikke har testet reverseString: metode ennå. Det vi trenger å gjøre er å sammenligne produksjonen av reverseString. Metode med hva vi forventer at produksjonen skal være
XCTAssertEqualObjects funksjon er en del av XCTest rammeverket. Den XCTest rammeverket gir mange andre metoder for å gjøre påstander om programmets tilstand, for eksempel variable likestilling eller boolsk uttrykk resultater. I dette tilfellet har vi uttalt at to gjenstander må være like. Hvis de er, testen passerer, og hvis de ikke er det, mislykkes testen. Ta en titt på Apples dokumentasjon for en omfattende liste over påstander levert av XCTest rammeverket
- (void) testReverseString {NSString * originalString = @ "himynameisandy."; NSString * reversedString = [self.vcToTest reverseString: originalString]; NSString * expectedReversedString = @ "ydnasiemanymih"; XCTAssertEqualObjects (expectedReversedString, reversedString, @ "Den reverserte strengen ikke samsvarte med forventet omvendt");}
Hvis du prøver å kompilere koden på dette punktet, vil du merke en advarsel når du prøver å ringe reverseString: fra test case The reverseString:... metoden er en privat metoden i JumblifyViewController klassen Det betyr at andre gjenstander ikke kan påberope seg denne metoden siden det ikke er definert i header-fil av JumblifyViewController klassen
Mens du skriver testbar kode er en mantra at mange utviklere følge, ønsker vi ikke å unødig endre vår kode under test Men hvordan skal vi kalle den private reverseString:.? metoden i JumblifyViewController klasse i våre tester Vi kunne legge til en offentlig definisjon av reverseString: metode til header fil av JumblifyViewController klassen, men som bryter innkapsling mønster
Trinn 5:. Legge til en Privat Kategori
En løsning er å legge en privat kategori på JumblifyViewController klassen å eksponere reverseString: metode. Vi legger denne kategorien til XCTestCase underklasse, som betyr at det er bare tilgjengelig i den klassen. Ved å legge til denne kategorien, vil testen saken kompilere uten advarsler eller feil
interface JumblifyViewController (Test) - (NSString *) reverseString:. (NSString *) stringToReverse;end
Trinn 6: Kjør Test
La oss kjøre våre tester for å sikre at de passerer. Det er flere måter å kjøre enhet tester for en iOS-applikasjon. Jeg er en tastatursnarvei narkoman så min mest brukte teknikken for å kjøre min enhet tester for søknaden min er ved å trykke på Kommando-U. Denne hurtigtasten vil kjøre alle testene for søknaden din. Du kan også utføre den samme handlingen ved å velge Test fra Produkt menyen.
Som testsuite vokser, eller hvis du liker gjennomføre testdrevet utvikling, du vil finne at publiseringen av testsuite kan bli for tidkrevende. Eller det kan komme i veien for din arbeidsflyt. En veldig nyttig kommando, begravd i Xcode meny, som jeg har forelsket meg i er Command-Option-Control-U. Denne snarveien utløser en kommando som kjører testen markøren er i. Når du har din testsuite fleshed ut og avsluttet, bør du alltid kjøre hele testen suite. Kjører en individuell test er nyttig som du skriver en ny test test eller når du feilsøker en sviktende test.
Kommandoen for å kjøre en test er supplert med Command-Option-Control-G, som repriser den siste testkjøring. Dette kan være hele testsuiten eller bare den nyeste testen du arbeider på. Det er også nyttig i tilfelle du har navigert bort fra hva testen du arbeider på, og du er fortsatt i prosessen med debugging det
Trinn 7:. Gjennomgå resultater
Du kan se testresultatene i et par steder. Ett av de stedene er Test Navigator til høyre.
Et annet alternativ er å se på gutter av Source Editor.
I begge disse to stedene, klikke på den grønne diamant med hvit hake vil kjøre den aktuelle testen. I tilfelle av en mislykket test, vil du se en rød diamant med et hvitt kors i midten. Klikker det vil også kjøre den aktuelle testen.
3. Nytt i Xcode 6
Xcode 6 introdusert to nye spennende tilskuddene til enhetstesting på iOS og OS X, testing asynkron funksjonalitet og måle ytelsen til en bestemt del av koden.
Asynchronous Testing Anmeldelser
Før Xcode 6, var det ingen god måte å enhetstest asynkron kode. Hvis enheten test kalt en metode som inneholdt asynkron logikk, kan du ikke kontrollere asynkron logikk. Testen vil fullføre før asynkron logikk i metoden under test ble henrettet.
For å teste asynkron kode, har Apple lansert en API som lar utviklere å definere en forventning som må være oppfylt for at testen skal fullføres. Flyten er som følger, definere en forventning, vente på forventning om å bli oppfylt, og oppfylle forventningen når asynkron kode er ferdig utførende. Ta en titt på nedenfor eksempel for avklaring Anmeldelser - (void) testDoSomethingThatTakesSomeTime {XCTestExpectation * completionExpectation = [selv expectationWithDescription: @ "Long-metoden"];. [self.vcToTest doSomethingThatTakesSomeTimesWithCompletionBlock: ^ (NSString * resultat) {XCTAssertEqualObjects (@ "resultatet", resultat, @ "! Resultatet var ikke riktig"); [completionExpectation oppfylle]; }]; [selvtillit waitForExpectationsWithTimeout: 5.0 handler: null];}
I dette eksemplet skal vi teste doSomethingThatTakesSomeTimesWithCompletionBlock metoden. Vi ønsker å hengsle suksess eller fiasko for vår test på verdien som returneres i ferdigstillelsen blokken kalt av metoden under test.
For å gjøre dette, definerer vi en forventning i starten av testmetoden. Ved slutten av testmetoden, vi vente på forventning å være oppfylt. Som du ser, kan vi også passere i en timeout parameter.
Den faktiske påstanden av testen er gjort inne ferdigstillelse blokk av metoden under test der vi også oppfylle forventningene vi har definert tidligere. Som et resultat, når testen er kjørt, venter testen før forventningen er oppfylt eller det mislykkes hvis timeout utløper og forventning er ikke oppfylt.
Performance Testing
et tillegg til enhetstesting i Xcode 6 er muligheten til å måle ytelsen til et stykke kode. Dette tillater utviklerne å få innsikt i den spesifikke tidsinformasjon av koden som blir testet.
Med ytelsestesting, kan du svare på spørsmålet "Hva er den gjennomsnittlige tiden for gjennomføring for denne delen av koden?" Hvis det er en del som er spesielt følsomme for endringer i forhold til den tiden det tar å utføre, så kan du bruke ytelsestesting for å måle hvor lang tid det tar å utføre.
Du kan også definere en baseline gjennomføringstid. Dette betyr at hvis koden som blir testet i betydelig grad avviker fra den grunnlinjen, svikter testen. Xcode vil gjentatte ganger utføre koden som blir testet og måle dens gjennomføringstid. For å måle ytelsen til et stykke kode, bruker measureBlock: API som vist nedenfor Anmeldelser - (void) testPerformanceReverseString {NSString * originalString = @ "himynameisandy."; [selvtillit measureBlock: ^ {[self.vcToTest reverseString: originalString]; }];..}
Klikk på informasjonsmeldingen som vises
Angi eller redigere baseline tidspunkt for gjennomføring for ytelsestest
Konklusjon
I denne opplæringen, du har lært hvordan du bruker Xcode å skape enhet tester for å verifisere en iOS-program i en programmatisk og automatisert måte. Gi det en sjanse, enten på en eksisterende kodebase eller noe helt nytt. Enten du gjør en full satsing på enhetstesting eller legge til et par tester her og der, du bare legge verdien til prosjektet gjennom å skrive sterkere verifisert programvare som er mindre tilbøyelige til å bryte med fremtidige endringer. Enhetstesting er bare begynnelsen av automatiserte software testing. Det er flere andre lag med testing kan du legge til en iOS-applikasjon.