iOS
XCTest-ramverk - Enhetstestning
Sök…
Lägga till testfiler till Xcode Project
När du skapar projektet
Du bör markera "Inkludera enhetstester" i dialogrutan om projektbild.
Efter att ha skapat projektet
Om du missade att kontrollera det objektet när du skapade ditt projekt, kan du alltid lägga till testfiler senare. Att göra så:
1- Gå till dina projektinställningar i Xcode
2- Gå till "Mål"
3- Klicka på "Lägg till mål"
4- Välj "Cocoa Touch Unit Test Testing Bundle" under "Other"
I slutet bör du ha en fil med namnet [Your app name]Tests.swift
. I Objekt-C bör du ha två filer med namnet [Your app name]Tests.h
and [Your app name]Tests.m
istället.
[Your app name]Tests.swift or .m
fil kommer som standard att inkludera:
- En
XCTest
- A
[Your app name]Tests
klass som utvidgarXCTestCase
-
setUp
,tearDown
,testExample
,testPerformanceExample
metoder
Snabb
import XCTest
class MyProjectTests: XCTestCase {
override func setUp() {
super.setUp()
// Put setup code here. This method is called before the invocation of each test method in the class.
}
override func tearDown() {
// Put teardown code here. This method is called after the invocation of each test method in the class.
super.tearDown()
}
func testExample() {
// This is an example of a functional test case.
// Use XCTAssert and related functions to verify your tests produce the correct results.
}
func testPerformanceExample() {
// This is an example of a performance test case.
self.measure {
// Put the code you want to measure the time of here.
}
}
}
Objective-C
#import <XCTest/XCTest.h>
@interface MyProjectTests : XCTestCase
@end
@implementation MyProjectTests
- (void)setUp {
[super setUp];
// Put setup code here. This method is called before the invocation of each test method in the class.
}
- (void)tearDown {
// Put teardown code here. This method is called after the invocation of each test method in the class.
[super tearDown];
}
- (void)testExample {
// This is an example of a functional test case.
// Use XCTAssert and related functions to verify your tests produce the correct results.
}
- (void)testPerformanceExample {
// This is an example of a performance test case.
[self measureBlock:^{
// Put the code you want to measure the time of here.
}];
}
@end
Lägga till Storyboard och View Controller som instanser för att testa filen
För att komma igång med enhetstestning, som kommer att göras i testfilen och testar View Controller och Storyboard, bör vi introducera dessa två filer i testfilen.
Definiera View Controller
Snabb
var viewController : ViewController!
Introduktion av storyboard och initialisering av View Controller
Lägg till den här koden till setUp()
:
Snabb
let storyboard = UIStoryboard(name: "Main", bundle: nil)
viewController = storyboard.instantiateInitialViewController() as! ViewController
Objective-C
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:"Main" bundle:nil];
viewController = (ViewController *) [storyboard instantiateInitialViewController];
På det här sättet kan du skriva testmetoder och de vet var de ska kontrollera om det finns fel. I det här fallet finns det View Controller och Storyboard.
Lägga till testmetoder
Enligt Apple:
Testmetoder
En testmetod är en instansmetod i en testklass som börjar med prefixtestet, inte tar några parametrar och returnerar tomrum, till exempel (void) testColorIsRed (). En testmetod utövar kod i ditt projekt och om den koden inte ger det förväntade resultatet rapporterar du fel med hjälp av en uppsättning API: er. Till exempel kan en funktions returvärde jämföras med ett förväntat värde eller ditt test kan hävda att felaktig användning av en metod i en av dina klasser kastar ett undantag.
Så vi lägger till en testmetod med "test" som metodens prefix, som:
Snabb
func testSomething() {
}
Objective-C
- (void)testSomething {
}
För att testa resultaten faktiskt använder vi XCTAssert()
-metoden, som tar ett booleskt uttryck, och om det är sant, markerar testet som lyckat, annars markerar det det som misslyckat.
Låt oss säga att vi har en metod i View Controller-klassen som kallas sum()
som beräknar summan av två siffror. För att testa det använder vi den här metoden:
Snabb
func testSum(){
let result = viewController.sum(4, and: 5)
XCTAssertEqual(result, 9)
}
Objective-C
- (void)testSum {
int result = [viewController sum:4 and:5];
XCTAssertEqual(result, 9);
}
Notera
Som standard kan du inte få åtkomst till etikett, textruta eller andra UI-objekt i klassen View Controller från testklassen om de först skapas i Storyboard-filen. Detta beror på att de initieras i
loadView()
i klassen View Controller, och detta kommer inte att kallas vid testning. Det bästa sättet att ringaloadView()
och alla andra nödvändiga metoder är att få tillgång tillview
egenskapen för vårviewController
egenskap. Du bör lägga till den här raden innan du testar UI-element:
XCTAssertNotNil(viewController.view)
Börja testa
Testa en specifik metod
För att testa en specifik metod klickar du på rutan bredvid metoddefinitionen.
Testa alla metoder
För att testa alla metoder klickar du på rutan bredvid klassdefinitionen.
Se testresultatet
Om det finns en grön kontroll bredvid definitionen har testet lyckats.
Om det finns ett rött kors bredvid definitionen har testet misslyckats.
Kör alla tester
Product -> Test OR Cmd + U
Den kommer att köra alla tester från alla testmål!
Importera en modul som den kan testas
Klasser, strukturer, enums och alla deras metoder är som standard internal
. Det betyder att de bara kan nås från samma modul. Testfallen ligger i ett annat mål och det betyder att de befinner sig i en annan modul. För att kunna komma åt den metod du vill testa måste du importera modulen som ska testas med @testable
nyckelordet.
Låt oss säga att vi har en huvudmodul som heter ToDo
och vi vill skriva tester för den. Vi skulle importera den modulen så här:
@testable import ToDo
Alla testmetoder i filen med det här importmeddelandet kan nu komma åt alla internal
klasser, strukturer, enum och alla deras internal
metoder i ToDo
modulen.
Du bör aldrig lägga till filerna med elementen du vill testa till testmålet eftersom det kan leda till svåra felsökningsfel.
Triggervy laddning och utseende
Visa laddning
I ett test för en visningskontroller vill du ibland trigga körningen av loadView()
eller viewDidLoad()
. Detta kan göras genom att öppna vyn. Låt oss säga att du har inställning av kontrollenhet i ditt test som heter sut
(system under test), då koden ser ut så här:
XCTAssertNotNil(sut.view)
Visa utseende
Du kan också utlösa metoderna viewWillAppear(_:)
och viewDidAppear(_:)
genom att lägga till följande kod:
sut.beginAppearanceTransition(true, animated: true)
sut.endAppearanceTransition()
Att skriva en testklass
import XCTest
@testable import PersonApp
class PersonTests: XCTestCase {
func test_completeName() {
let person = Person(firstName: "Josh", lastName: "Brown")
XCTAssertEqual(person.completeName(), "Josh Brown")
}
}
Låt oss nu diskutera vad som händer här. import XCTest
linjen tillåter oss att utöka XCTestCase
och använda XCTAssertEqual
(bland andra påståenden). Att utöka XCTestCase
och prefixa vårt XCTestCase
med test
kommer att säkerställa att Xcode automatiskt kör detta test när testerna i projektet körs ( ⌘U eller produkt > Test ). @testable import PersonApp
raden kommer att importera vårt PersonApp
mål så att vi kan testa och använda klasser från det, till exempel Person
i vårt exempel ovan. Och slutligen kommer vår XCTAssertEqual
att säkerställa att person.completeName()
är lika med strängen "Josh Brown"
.