iOS
Quadro XCTest - Test unitario
Ricerca…
Aggiunta di file di test a Xcode Project
Quando si crea il progetto
È necessario selezionare "Includi test unitari" nella finestra di dialogo di creazione del progetto.
Dopo aver creato il progetto
Se hai perso il controllo di quell'elemento durante la creazione del tuo progetto, puoi sempre aggiungere i file di test in un secondo momento. Fare così:
1- Vai alle impostazioni del progetto in Xcode
2- Vai a "Obiettivi"
3- Fai clic su "Aggiungi target"
4- In "Altro", selezionare "Pacchetto test cacao Touch Unit Test"
Alla fine, dovresti avere un file chiamato [Your app name]Tests.swift
. In Objective-C, dovresti avere due file chiamati [Your app name]Tests.h
e [Your app name]Tests.m
.
[Your app name]Tests.swift or .m
file [Your app name]Tests.swift or .m
includerà per impostazione predefinita:
-
XCTest
moduliXCTest
- A
[Your app name]Tests
classe che estendeXCTestCase
-
setUp
,tearDown
,testExample
,testPerformanceExample
veloce
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
Aggiunta di Storyboard e Visualizza controller come istanze per testare il file
Per iniziare con il test delle unità, che verrà eseguito nel file di test e testeremo il View Controller e Storyboard, dovremmo introdurre questi due file nel file di test.
Definizione del controller di visualizzazione
veloce
var viewController : ViewController!
Presentazione dello Storyboard e inizializzazione del View Controller
Aggiungi questo codice al metodo setUp()
:
veloce
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];
In questo modo, potresti scrivere metodi di prova e sapranno dove cercare gli errori. In questo caso, ci sono View Controller e Storyboard.
Aggiunta di metodi di prova
Secondo Apple:
Metodi di prova
Un metodo di prova è un metodo di istanza di una classe di test che inizia con il test prefisso, non accetta parametri e restituisce void, ad esempio, (void) testColorIsRed (). Un metodo di prova esercita il codice nel progetto e, se tale codice non produce il risultato previsto, segnala i guasti utilizzando un set di API di asserzione. Ad esempio, il valore di ritorno di una funzione potrebbe essere confrontato con un valore atteso o il test potrebbe affermare che l'uso improprio di un metodo in una delle classi genera un'eccezione.
Quindi aggiungiamo un metodo di test usando "test" come prefisso del metodo, come:
veloce
func testSomething() {
}
Objective-C
- (void)testSomething {
}
Per testare realmente i risultati, usiamo il metodo XCTAssert()
, che prende un'espressione booleana, e se è vero, segna il test come riuscito, altrimenti lo contrassegnerà come non riuscito.
Diciamo che abbiamo un metodo nella classe View Controller chiamato sum()
che calcola la somma di due numeri. Per testarlo, usiamo questo metodo:
veloce
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);
}
Nota
Per impostazione predefinita, non è possibile accedere all'etichetta, alla casella di testo o ad altri elementi dell'interfaccia utente della classe View Controller dalla classe di test se vengono creati per la prima volta nel file Storyboard. Questo perché sono inizializzati nel metodo
loadView()
della classe View Controller e questo non verrà chiamato durante il test. Il modo migliore per chiamareloadView()
e tutti gli altri metodi richiesti è accedere alla proprietàview
della nostra proprietàviewController
. È necessario aggiungere questa riga prima di testare gli elementi dell'interfaccia utente:
XCTAssertNotNil(viewController.view)
Inizia i test
Test di un metodo specifico
Per testare un metodo specifico, fare clic sul quadrato accanto alla definizione del metodo.
Testare tutti i metodi
Per testare tutti i metodi, fare clic sul quadrato accanto alla definizione della classe.
Vedi il risultato del test
Se c'è un controllo verde accanto alla definizione, il test è riuscito.
Se c'è una croce rossa accanto alla definizione, il test è fallito.
Esecuzione di tutti i test
Product -> Test OR Cmd + U
Verranno eseguiti tutti i test da tutti gli obiettivi di test!
Importa un modulo che può essere testato
Classi, strutture, enumerazioni e tutti i loro metodi sono internal
per impostazione predefinita. Ciò significa che è possibile accedervi solo dallo stesso modulo. I test case sono in un target diverso e questo significa che si trovano in un modulo diverso. Per poter accedere al metodo che vuoi testare, devi importare il modulo da testare usando la parola chiave @testable
.
Diciamo che abbiamo un modulo principale chiamato ToDo
e vogliamo scrivere test per questo. Vorremmo importare quel modulo in questo modo:
@testable import ToDo
Tutti i metodi di test nel file con questa istruzione import ora possono accedere a tutte internal
classi internal
, le strutture, le enumerazioni e tutti i loro metodi internal
del modulo ToDo
.
Non si dovrebbero mai aggiungere i file con gli elementi che si desidera testare al target di test perché ciò può portare a errori di debug difficili.
Attivare il caricamento e l'aspetto della vista
Visualizza il caricamento
In un test per un controller di visualizzazione a volte si desidera attivare l'esecuzione di loadView()
o viewDidLoad()
. Questo può essere fatto accedendo alla vista. Supponiamo che tu abbia l'istanza del controller di visualizzazione nel tuo test chiamato sut
(system under test), quindi il codice sarebbe simile a questo:
XCTAssertNotNil(sut.view)
Visualizza aspetto
Puoi anche attivare i metodi viewWillAppear(_:)
e viewDidAppear(_:)
aggiungendo il seguente codice:
sut.beginAppearanceTransition(true, animated: true)
sut.endAppearanceTransition()
Scrivere una lezione di prova
import XCTest
@testable import PersonApp
class PersonTests: XCTestCase {
func test_completeName() {
let person = Person(firstName: "Josh", lastName: "Brown")
XCTAssertEqual(person.completeName(), "Josh Brown")
}
}
Ora discutiamo cosa sta succedendo qui. La riga import XCTest
ci consentirà di estendere XCTestCase
e utilizzare XCTAssertEqual
(tra le altre affermazioni). L'estensione di XCTestCase
e il prefisso del nostro nome test con il test
garantiranno che Xcode esegua automaticamente questo test durante l'esecuzione dei test nel progetto ( ⌘U o Prodotto > Test ). La linea @testable import PersonApp
importerà il nostro target PersonApp
modo che possiamo testare e utilizzare classi da esso, come la Person
nel nostro esempio sopra. Infine, il nostro XCTAssertEqual
garantirà che person.completeName()
sia uguale alla stringa "Josh Brown"
.