Introduction
XCTest est le framework officiel d'Apple pour les tests unitaires et d'interface sur iOS, macOS et tvOS. Il permet de vérifier que votre code se comporte comme prévu avant même de lancer l'application. Dans ce tutoriel, nous allons créer un target de test, écrire des assertions simples et exécuter les tests directement dans Xcode. Maîtriser XCTest dès le début améliore la qualité du code et réduit les régressions lors des mises à jour.
Prérequis
- Xcode 16 ou supérieur
- Connaissances de base en Swift
- Un projet iOS existant (ou nouveau projet vide)
Ajouter un target de test
// Dans Xcode : File > New > Target...
// Choisir iOS Unit Testing Bundle
// Nom : MyAppTests
// Language : SwiftCréer un target de test séparé permet d'isoler le code de test du code de production et d'utiliser les outils de couverture de code intégrés.
Créer la classe de test
import XCTest
@testable import MyApp
final class MyAppTests: XCTestCase {
override func setUpWithError() throws {
// Code exécuté avant chaque test
}
override func tearDownWithError() throws {
// Code exécuté après chaque test
}
}La classe hérite de XCTestCase. setUp et tearDown garantissent un environnement propre pour chaque test.
Écrire un premier test simple
func testAddition() throws {
let result = 2 + 2
XCTAssertEqual(result, 4, "L'addition devrait donner 4")
}XCTAssertEqual est l'assertion la plus courante. Le message d'erreur s'affiche uniquement en cas d'échec.
Tester une fonction réelle
// Fichier source
struct Calculator {
func multiply(_ a: Int, _ b: Int) -> Int {
return a * b
}
}On teste une fonction réelle du projet principal en important le module avec @testable.
Ajouter le test pour la fonction
func testMultiply() throws {
let calc = Calculator()
let result = calc.multiply(3, 4)
XCTAssertEqual(result, 12)
}Chaque méthode commençant par test est automatiquement exécutée par Xcode.
Bonnes pratiques
- Nommez vos tests de façon descriptive (testNomFonction_Scenario_ResultatAttendu)
- Testez un seul comportement par méthode
- Utilisez @testable import pour accéder aux types internal
- Exécutez les tests à chaque commit via Xcode ou la ligne de commande
Erreurs courantes à éviter
- Oublier d'importer le module avec @testable
- Utiliser des valeurs en dur sans setup clair
- Ne pas tester les cas limites (0, nil, valeurs négatives)
- Laisser des tests qui dépendent de l'ordre d'exécution
Pour aller plus loin
Découvrez nos formations complètes sur les tests iOS et Swift : https://learni-group.com/formations