iOS
Framework XCTest - Tests unitaires
Recherche…
Ajout de fichiers de test à un projet Xcode
Lors de la création du projet
Vous devez cocher "Inclure les tests unitaires" dans la boîte de dialogue de création de projet.
Après avoir créé le projet
Si vous avez manqué de vérifier cet élément lors de la création de votre projet, vous pouvez toujours ajouter des fichiers de test ultérieurement. Faire cela:
1- Accédez à vos paramètres de projet dans Xcode
2- Aller à "Cibles"
3- Cliquez sur "Ajouter une cible"
4- Sous "Autre", sélectionnez "Paquet de test de test Cocoa Touch Unit"
À la fin, vous devriez avoir un fichier nommé [Your app name]Tests.swift
. En Objective-C, vous devez avoir deux fichiers nommés [Your app name]Tests.h
et [Your app name]Tests.m
place.
[Your app name]Tests.swift or .m
fichier [Your app name]Tests.swift or .m
inclura par défaut:
- Une importation de module
XCTest
- Une classe de
[Your app name]Tests
qui étendXCTestCase
- le
tearDown
testExample
testPerformanceExample
setUp
d'setUp
,tearDown
,testExample
,testPerformanceExample
méthodes
Rapide
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.
}
}
}
Objectif 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
Ajout de storyboard et de View Controller en tant qu'instances pour tester un fichier
Pour commencer avec les tests unitaires, qui seront effectués dans le fichier de tests et testeront View Controller et Storyboard, nous devrions introduire ces deux fichiers dans le fichier de test.
Définition du contrôleur de vue
Rapide
var viewController : ViewController!
Présentation du storyboard et initialisation du View Controller
Ajoutez ce code à la méthode setUp()
:
Rapide
let storyboard = UIStoryboard(name: "Main", bundle: nil)
viewController = storyboard.instantiateInitialViewController() as! ViewController
Objectif c
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:"Main" bundle:nil];
viewController = (ViewController *) [storyboard instantiateInitialViewController];
De cette façon, vous pouvez écrire des méthodes de test et ils sauront où rechercher les erreurs. Dans ce cas, il y a View Controller et le Storyboard.
Ajouter des méthodes de test
Selon Apple:
Méthodes d'essai
Une méthode de test est une méthode d'instance d'une classe de test qui commence par le test de préfixe, ne prend aucun paramètre et renvoie un résultat nul, par exemple (void) testColorIsRed (). Une méthode de test exerce du code dans votre projet et, si ce code ne produit pas le résultat attendu, signale les échecs à l'aide d'un ensemble d'API d'assertion. Par exemple, la valeur de retour d'une fonction peut être comparée à une valeur attendue ou votre test peut affirmer qu'une utilisation incorrecte d'une méthode dans l'une de vos classes génère une exception.
Nous ajoutons donc une méthode de test utilisant "test" comme préfixe de la méthode, comme:
Rapide
func testSomething() {
}
Objectif c
- (void)testSomething {
}
Pour tester réellement les résultats, nous utilisons la méthode XCTAssert()
, qui prend une expression booléenne et, si elle est vraie, marque le test comme réussi, sinon elle le marquera comme ayant échoué.
Disons que nous avons une méthode dans la classe View Controller appelée sum()
qui calcule la somme de deux nombres. Pour le tester, nous utilisons cette méthode:
Rapide
func testSum(){
let result = viewController.sum(4, and: 5)
XCTAssertEqual(result, 9)
}
Objectif c
- (void)testSum {
int result = [viewController sum:4 and:5];
XCTAssertEqual(result, 9);
}
Remarque
Par défaut, vous ne pouvez pas accéder à l'étiquette, à la zone de texte ou à d'autres éléments d'interface utilisateur de la classe View Controller à partir de la classe de test s'ils ont été créés pour la première fois dans le fichier Storyboard. En effet, ils sont initialisés dans la méthode
loadView()
de la classe View Controller, et cela ne sera pas appelé lors du test. La meilleure façon d'appelerloadView()
et toutes les autres méthodes requises est d'accéder à la propriétéview
de notre propriétéviewController
. Vous devez ajouter cette ligne avant de tester les éléments de l'interface utilisateur:
XCTAssertNotNil(viewController.view)
Lancer le test
Tester une méthode spécifique
Pour tester une méthode spécifique, cliquez sur le carré en regard de la définition de la méthode.
Tester toutes les méthodes
Pour tester toutes les méthodes, cliquez sur le carré situé en regard de la définition de classe.
Voir le résultat du test
S'il y a une coche verte à côté de la définition, le test a réussi.
S'il y a une croix rouge à côté de la définition, le test a échoué.
Lancer tous les tests
Product -> Test OR Cmd + U
Il exécutera tous les tests de toutes les cibles de test!
Importer un module pouvant être testé
Les classes, les structures, les énumérations et toutes leurs méthodes sont internal
par défaut. Cela signifie qu'ils ne peuvent être accédés qu'à partir du même module. Les cas de test se trouvent dans une cible différente, ce qui signifie qu'ils se trouvent dans un module différent. Pour pouvoir accéder à la méthode que vous souhaitez tester, vous devez importer le module à tester à l'aide du mot clé @testable
.
Disons que nous avons un module principal appelé ToDo
et que nous voulons y écrire des tests. Nous importons ce module comme ceci:
@testable import ToDo
Toutes les méthodes de test du fichier avec cette instruction d'importation peuvent désormais accéder à toutes internal
classes internal
, structures, énumérations et toutes internal
méthodes internal
du module ToDo
.
Vous ne devez jamais ajouter les fichiers avec les éléments que vous souhaitez tester à la cible de test car cela peut entraîner des erreurs de débogage difficiles.
Chargement de la vue et apparence
Afficher le chargement
Dans un test pour un contrôleur de vue, vous voulez parfois déclencher l'exécution de loadView()
ou viewDidLoad()
. Cela peut être fait en accédant à la vue. Disons que vous avez une instance de contrôleur de vue dans votre test appelée sut
(système sous test), alors le code ressemblerait à ceci:
XCTAssertNotNil(sut.view)
Voir l'apparence
Vous pouvez également déclencher les méthodes viewWillAppear(_:)
et viewDidAppear(_:)
en ajoutant le code suivant:
sut.beginAppearanceTransition(true, animated: true)
sut.endAppearanceTransition()
Ecrire une classe de test
import XCTest
@testable import PersonApp
class PersonTests: XCTestCase {
func test_completeName() {
let person = Person(firstName: "Josh", lastName: "Brown")
XCTAssertEqual(person.completeName(), "Josh Brown")
}
}
Maintenant, discutons de ce qui se passe ici. La ligne d' import XCTest
nous permettra d'étendre XCTestCase
et d'utiliser XCTAssertEqual
(parmi d'autres assertions). En étendant XCTestCase
et en préfixant notre nom de test
avec test
, vous vous assurez que Xcode exécute automatiquement ce test lors de l'exécution des tests du projet ( ⌘U ou Product > Test ). La @testable import PersonApp
importera notre cible PersonApp
afin que nous puissions tester et utiliser des classes, comme la Person
dans notre exemple ci-dessus. Et enfin, notre XCTAssertEqual
fera en sorte que person.completeName()
soit égal à la chaîne "Josh Brown"
.