Tests en Swift (iOS/macOS) : frameworks et outils
Le développement d'applications de qualité pour les plateformes Apple est impossible sans des tests systématiques. L'écosystème Swift dispose d'un ensemble puissant d'outils couvrant tous les niveaux, des tests unitaires aux tests d'interface utilisateur et à l'analyse statique. Dans cet article, nous examinerons les frameworks et pratiques clés qui vous aideront à améliorer la fiabilité du code et à accélérer le développement.
1. XCTest — le fondement des tests
XCTest est le framework intégré d'Apple, disponible dans Xcode. Il offre des fonctionnalités de base pour écrire des tests unitaires, des tests d'interface utilisateur et des tests de performance. XCTest est intégré au navigateur de tests Xcode et prend en charge l'exécution à la fois sur des simulateurs et sur des appareils réels.
Exemple d'un test unitaire simple pour le modèle Calculator :
import XCTest@testable import MyApp
final class CalculatorTests: XCTestCase { var calculator: Calculator!
override func setUpWithError() throws { calculator = Calculator() }
override func tearDownWithError() throws { calculator = nil }
func testAddition() throws { let result = calculator.add(2, 3) XCTAssertEqual(result, 5, "L'addition doit être correcte") }
func testDivisionByZero() throws { XCTAssertThrowsError(try calculator.divide(10, 0)) { error in XCTAssertEqual(error as? CalculatorError, .divisionByZero) } }}Fonctionnalités clés de XCTest :
- XCTAssert — ensemble d'assertions (égalité, vérité, levée d'erreurs)
- setUp/tearDown — cycle de vie de la classe de test
- measure — mesure des performances des blocs de code
- Tests UI — enregistrement et relecture des interactions avec l'interface
2. Quick et Nimble — style BDD
Quick est un framework pour le Behaviour-Driven Development (BDD) qui permet de décrire les tests en langage naturel. Nimble est une bibliothèque de matchers qui étend les capacités des assertions. Ensemble, ils rendent les tests lisibles pour toute l'équipe, y compris les managers et les analystes.
Exemple de test utilisant Quick/Nimble :
import Quickimport Nimble@testable import MyApp
class LoginSpec: QuickSpec { override func spec() { describe("LoginViewController") { var viewController: LoginViewController!
beforeEach { viewController = LoginViewController() _ = viewController.view // Chargement de la vue }
context("lorsque des données valides sont saisies") { it("doit appeler la méthode d'authentification") { viewController.emailTextField.text = "user@example.com" viewController.passwordTextField.text = "password123" viewController.loginButtonTapped() expect(viewController.isAuthorized).to(beTrue()) } }
context("lorsque le mot de passe est vide") { it("doit afficher une erreur") { viewController.emailTextField.text = "user@example.com" viewController.passwordTextField.text = "" viewController.loginButtonTapped() expect(viewController.errorLabel.isHidden).to(beFalse()) } } } }}- describe/context/it — structure hiérarchique des spécifications
- beforeEach/afterEach — hooks pour préparer l'état
- expect(...).to(...) — vérifications lisibles avec de nombreux matchers
3. SnapshotTesting — tests visuels
La bibliothèque SnapshotTesting de Point-Free permet