iOS
XCTest framework - testen van eenheden
Zoeken…
Testbestanden toevoegen aan Xcode Project
Bij het maken van het project
U moet "Inclusief eenheidstests" aanvinken in het dialoogvenster voor het maken van projecten.
Na het maken van het project
Als u het item tijdens het maken van uw project niet hebt gecontroleerd, kunt u later altijd testbestanden toevoegen. Om dit te doen:
1- Ga naar je projectinstellingen in Xcode
2- Ga naar "Targets"
3- Klik op "Doel toevoegen"
4- Selecteer onder "Overige" de optie "Testingbundel Cocoa Touch Unit"
Aan het einde moet u een bestand hebben met de naam [Your app name]Tests.swift
. In Objective-C zou u in plaats daarvan twee bestanden met de naam [Your app name]Tests.h
en [Your app name]Tests.m
.
[Your app name]Tests.swift or .m
bestand [Your app name]Tests.swift or .m
bevat standaard:
- Een
XCTest
module-import - Een
[Your app name]Tests
klasse dieXCTestCase
-
setUp
,tearDown
,testExample
,testPerformanceExample
methoden
Snel
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.
}
}
}
Doelstelling 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
Storyboard en View Controller toevoegen als exemplaren om bestand te testen
Om aan de slag te gaan met het testen van eenheden, wat in het testbestand wordt gedaan en de View Controller en Storyboard wordt getest, moeten we deze twee bestanden in het testbestand introduceren.
De View Controller definiëren
Snel
var viewController : ViewController!
Introductie van het Storyboard en het initialiseren van de View Controller
Voeg deze code toe aan de methode setUp()
:
Snel
let storyboard = UIStoryboard(name: "Main", bundle: nil)
viewController = storyboard.instantiateInitialViewController() as! ViewController
Doelstelling C
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:"Main" bundle:nil];
viewController = (ViewController *) [storyboard instantiateInitialViewController];
Op deze manier kun je testmethoden schrijven en weten ze waar ze moeten controleren op fouten. In dit geval zijn er View Controller en het Storyboard.
Testmethoden toevoegen
Volgens Apple:
Testmethoden
Een testmethode is een instantiemethode van een testklasse die begint met de prefix-test, geen parameters gebruikt en ongeldig retourneert, bijvoorbeeld (void) testColorIsRed (). Een testmethode oefent code in uw project uit en, als die code niet het verwachte resultaat oplevert, rapporteert het fouten met behulp van een set assertion-API's. De retourwaarde van een functie kan bijvoorbeeld worden vergeleken met een verwachte waarde of uw test kan beweren dat onjuist gebruik van een methode in een van uw klassen een uitzondering oplevert.
Dus voegen we een testmethode toe met "test" als het voorvoegsel van de methode, zoals:
Snel
func testSomething() {
}
Doelstelling C
- (void)testSomething {
}
Om de resultaten daadwerkelijk te testen, gebruiken we de XCTAssert()
-methode, die een booleaanse uitdrukking gebruikt en, als deze waar is, de test als geslaagd markeert, anders wordt deze als mislukt gemarkeerd.
Laten we zeggen dat we een methode hebben in de View Controller-klasse genaamd sum()
die de som van twee getallen berekent. Om het te testen, gebruiken we deze methode:
Snel
func testSum(){
let result = viewController.sum(4, and: 5)
XCTAssertEqual(result, 9)
}
Doelstelling C
- (void)testSum {
int result = [viewController sum:4 and:5];
XCTAssertEqual(result, 9);
}
Notitie
Standaard hebt u vanuit de testklasse geen toegang tot labels, tekstvakken of andere UI-items van de View Controller-klasse als ze eerst in Storyboard-bestand worden gemaakt. Dit komt omdat ze worden geïnitialiseerd in de methode
loadView()
van de klasse View Controller en dit wordt niet aangeroepen tijdens het testen. De beste manier omloadView()
en alle andere vereiste methoden aan te roepen, is toegang te krijgen tot de eigenschapview
van onzeviewController
eigenschap. U moet deze regel toevoegen voordat u UI-elementen test:
XCTAssertNotNil(viewController.view)
Begin met testen
Een specifieke methode testen
Om een specifieke methode te testen, klikt u op het vierkant naast de methodedefinitie.
Alle methoden testen
Klik op het vierkant naast de klassedefinitie om alle methoden te testen.
Bekijk het testresultaat
Als er een groen vinkje naast de definitie staat, is de test geslaagd.
Als er een rood kruis naast de definitie staat, is de test mislukt.
Alle tests uitvoeren
Product -> Test OR Cmd + U
Alle tests van alle testdoelen worden uitgevoerd!
Importeer een module die kan worden getest
Klassen, structs, enums en al hun methoden zijn standaard internal
. Dit betekent dat ze alleen toegankelijk zijn vanuit dezelfde module. De testgevallen bevinden zich in een ander doel en dit betekent dat ze zich in een andere module bevinden. Om toegang te krijgen tot de methode die u wilt testen, moet u de te testen module importeren met behulp van het trefwoord @testable
.
Laten we zeggen dat we een hoofdmodule hebben die ToDo
heet en dat we er tests voor willen schrijven. We zouden die module als volgt importeren:
@testable import ToDo
Alle testmethoden in het bestand met deze importverklaring hebben nu toegang tot alle internal
klassen, structs, enums en al hun internal
methoden van de ToDo
module.
Voeg nooit de bestanden met de elementen die u wilt testen toe aan het testdoel, omdat dat kan leiden tot moeilijk te debuggen fouten.
Trigger weergave laden en uiterlijk
Bekijk laden
In een test voor een loadView()
wilt u soms de uitvoering van loadView()
of viewDidLoad()
activeren. Dit kan worden gedaan door toegang te krijgen tot de weergave. Laten we zeggen dat u in uw test een instantie van de controller hebt genaamd sut
(systeem wordt getest), dan ziet de code er als volgt uit:
XCTAssertNotNil(sut.view)
Bekijk uiterlijk
U kunt ook de methoden viewWillAppear(_:)
en viewDidAppear(_:)
door de volgende code toe te voegen:
sut.beginAppearanceTransition(true, animated: true)
sut.endAppearanceTransition()
Een testles schrijven
import XCTest
@testable import PersonApp
class PersonTests: XCTestCase {
func test_completeName() {
let person = Person(firstName: "Josh", lastName: "Brown")
XCTAssertEqual(person.completeName(), "Josh Brown")
}
}
Laten we nu bespreken wat hier aan de hand is. De import XCTest
lijn zal ons toelaten om uit te breiden XCTestCase
en gebruik XCTAssertEqual
(onder andere beweringen). XCTestCase
uitbreiden en onze XCTestCase
voorafgaan door test
zorgt ervoor dat Xcode deze test automatisch uitvoert bij het uitvoeren van de tests in het project ( ⌘U of Product > Test ). De @testable import PersonApp
regel importeert ons PersonApp
doel zodat we klassen kunnen testen en gebruiken, zoals de Person
in ons voorbeeld hierboven. En ten slotte XCTAssertEqual
onze XCTAssertEqual
ervoor dat person.completeName()
gelijk is aan de tekenreeks "Josh Brown"
.