iOS
XCTest Framework - Unit Testing
Suche…
Testdateien zu Xcode Project hinzufügen
Beim Erstellen des Projekts
Sie sollten im Projekterstellungsdialog "Komponententests einbeziehen" aktivieren.
Nachdem Sie das Projekt erstellt haben
Wenn Sie dieses Element beim Erstellen des Projekts nicht überprüft haben, können Sie später jederzeit Testdateien hinzufügen. Um dies zu tun:
1- Gehen Sie in Xcode zu Ihren Projekteinstellungen
2- Gehe zu "Ziele"
3- Klicken Sie auf "Ziel hinzufügen".
4- Wählen Sie unter "Andere" die Option "Testpaket für Kakao-Touch-Einheiten testen" aus.
Am Ende sollte eine Datei mit dem Namen [Your app name]Tests.swift
. In Objective-C sollten Sie stattdessen zwei Dateien namens [Your app name]Tests.h
und [Your app name]Tests.m
.
[Your app name]Tests.swift or .m
Datei enthält standardmäßig [Your app name]Tests.swift or .m
:
- Ein
XCTest
- A
[Your app name]Tests
XCTestCase
Klasse zurXCTestCase
-
setUp
,tearDown
,testExample
,testPerformanceExample
Methoden
Schnell
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.
}
}
}
Ziel 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 und View Controller als Instanzen zur Testdatei hinzufügen
Um mit dem Komponententest zu beginnen, der in der Testdatei ausgeführt wird, werden View Controller und Storyboard getestet. Wir sollten diese beiden Dateien in die Testdatei einfügen.
Definieren des View Controllers
Schnell
var viewController : ViewController!
Vorstellung des Storyboards und Initialisieren des View Controllers
Fügen Sie der setUp()
-Methode diesen Code setUp()
:
Schnell
let storyboard = UIStoryboard(name: "Main", bundle: nil)
viewController = storyboard.instantiateInitialViewController() as! ViewController
Ziel c
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:"Main" bundle:nil];
viewController = (ViewController *) [storyboard instantiateInitialViewController];
Auf diese Weise könnten Sie Testmethoden schreiben, und sie wissen, wo sie nach Fehlern suchen sollen. In diesem Fall gibt es View Controller und das Storyboard.
Testmethoden hinzufügen
Laut Apple:
Testmethoden
Eine Testmethode ist eine Instanzmethode einer Testklasse, die mit dem Präfix test beginnt, keine Parameter übernimmt und void zurückgibt, z. B. (void) testColorIsRed (). Eine Testmethode übt Code in Ihrem Projekt aus. Wenn dieser Code nicht das erwartete Ergebnis liefert, werden Fehler unter Verwendung einer Reihe von Assertions-APIs gemeldet. Beispielsweise kann der Rückgabewert einer Funktion mit einem erwarteten Wert verglichen werden, oder Ihr Test kann die Annahme ausdrücken, dass eine unzulässige Verwendung einer Methode in einer Ihrer Klassen eine Ausnahme auslöst.
Also fügen wir eine Testmethode hinzu, die "test" als Präfix der Methode verwendet, wie zum Beispiel:
Schnell
func testSomething() {
}
Ziel c
- (void)testSomething {
}
Um die Ergebnisse tatsächlich zu testen, verwenden wir die XCTAssert()
Methode, die einen booleschen Ausdruck XCTAssert()
true ist, wird der Test als erfolgreich markiert, andernfalls wird er als fehlgeschlagen markiert.
Nehmen wir an, wir haben in View Controller eine Methode namens sum()
die die Summe zweier Zahlen berechnet. Um es zu testen, verwenden wir diese Methode:
Schnell
func testSum(){
let result = viewController.sum(4, and: 5)
XCTAssertEqual(result, 9)
}
Ziel c
- (void)testSum {
int result = [viewController sum:4 and:5];
XCTAssertEqual(result, 9);
}
Hinweis
Standardmäßig können Sie nicht auf Beschriftungen, Textfelder oder andere UI-Elemente der View Controller-Klasse über die Testklasse zugreifen, wenn sie zuerst in der Storyboard-Datei erstellt wurden. Dies liegt daran, dass sie in der
loadView()
-Methode der View Controller-Klasse initialisiert werden und beim Testen nicht aufgerufen werden. Die beste Möglichkeit,loadView()
und alle anderen erforderlichen MethodenloadView()
, ist der Zugriff auf dieview
viewController
unsererviewController
. Sie sollten diese Zeile hinzufügen, bevor Sie Elemente der Benutzeroberfläche testen:
XCTAssertNotNil(viewController.view)
Starten Sie den Test
Testen einer bestimmten Methode
Klicken Sie zum Testen einer bestimmten Methode auf das Quadrat neben der Methodendefinition.
Alle Methoden testen
Um alle Methoden zu testen, klicken Sie auf das Quadrat neben der Klassendefinition.
Sehen Sie das Testergebnis
Wenn neben der Definition ein grünes Häkchen angezeigt wird, ist der Test erfolgreich abgeschlossen.
Wenn sich neben der Definition ein rotes Kreuz befindet, ist der Test fehlgeschlagen.
Alle Tests werden ausgeführt
Product -> Test OR Cmd + U
Es werden alle Tests von allen Testzielen ausgeführt!
Importieren Sie ein Modul, das getestet werden kann
Klassen, Strukturen, Aufzählungen und alle ihre Methoden sind standardmäßig internal
. Dies bedeutet, dass nur von demselben Modul aus auf sie zugegriffen werden kann. Die Testfälle befinden sich in einem anderen Ziel, dh sie befinden sich in einem anderen Modul. Um auf die zu testende Methode zugreifen zu können, müssen Sie das zu testende Modul mit dem Schlüsselwort @testable
.
Nehmen wir an, wir haben ein Hauptmodul namens ToDo
und wollen Tests dafür schreiben. Wir würden dieses Modul so importieren:
@testable import ToDo
Alle Testmethoden in der Datei mit dieser Importanweisung können jetzt auf alle internal
Klassen, Strukturen, Enums und alle ihre internal
Methoden des ToDo
Moduls ToDo
.
Sie sollten niemals die Dateien mit den Elementen, die Sie testen möchten, zum Testziel hinzufügen, da dies zu schwer zu debuggenden Fehlern führen kann.
Triggeransicht laden und Aussehen
Laden anzeigen
In einem Test für einen View-Controller möchten Sie manchmal die Ausführung von loadView()
oder viewDidLoad()
auslösen. Dies kann durch Zugriff auf die Ansicht erfolgen. Nehmen wir an, Sie haben in Ihrem Test eine View-Controller-Instanz namens sut
(System unter Test). Dann würde der Code folgendermaßen aussehen:
XCTAssertNotNil(sut.view)
Aussehen anzeigen
Sie können die Methoden viewWillAppear(_:)
und viewDidAppear(_:)
auch auslösen, indem Sie folgenden Code hinzufügen:
sut.beginAppearanceTransition(true, animated: true)
sut.endAppearanceTransition()
Testklasse schreiben
import XCTest
@testable import PersonApp
class PersonTests: XCTestCase {
func test_completeName() {
let person = Person(firstName: "Josh", lastName: "Brown")
XCTAssertEqual(person.completeName(), "Josh Brown")
}
}
Lass uns jetzt besprechen, was hier los ist. Die import XCTest
Zeile ermöglicht uns die Erweiterung von XCTestCase
und die Verwendung von XCTAssertEqual
(neben anderen Assertions). Wenn Sie XCTestCase
und unseren XCTestCase
mit test
XCTestCase
wird sichergestellt, dass Xcode diesen Test automatisch ausführt, wenn Sie die Tests im Projekt ausführen ( U oder Product > Test ). Die @testable import PersonApp
Zeile importiert unser PersonApp
Ziel, damit wir Klassen testen und verwenden können, wie zum Beispiel die Person
in unserem obigen Beispiel. Und schließlich stellt unser XCTAssertEqual
sicher, dass person.completeName()
der Zeichenfolge "Josh Brown"
.