Testes em Swift (iOS/macOS): frameworks e ferramentas
O desenvolvimento de aplicações de qualidade para as plataformas Apple é impossível sem testes sistemáticos. No ecossistema Swift, existe um conjunto poderoso de ferramentas que cobre todos os níveis — desde testes unitários até testes de UI e análise estática. Neste artigo, vamos explorar os principais frameworks e práticas que o ajudarão a aumentar a confiabilidade do código e acelerar o desenvolvimento.
1. XCTest — a base dos testes
XCTest é um framework integrado da Apple, disponível no Xcode. Ele fornece funcionalidades básicas para escrever testes unitários, testes de UI e testes de desempenho. O XCTest está integrado ao Xcode Test Navigator e suporta execução tanto em simuladores quanto em dispositivos reais.
Exemplo de um teste unitário simples para o modelo 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, "A adição deve estar correta") }
func testDivisionByZero() throws { XCTAssertThrowsError(try calculator.divide(10, 0)) { error in XCTAssertEqual(error as? CalculatorError, .divisionByZero) } }}Principais funcionalidades do XCTest:
- XCTAssert — conjunto de asserções (igualdade, verdade, lançamento de erros)
- setUp/tearDown — ciclo de vida da classe de teste
- measure — medição de desempenho de blocos de código
- Testes de UI — gravação e reprodução de interações com a interface
2. Quick e Nimble — estilo BDD
Quick é um framework para Behaviour-Driven Development (BDD) que permite descrever testes em linguagem natural. Nimble é uma biblioteca de matchers que expande as capacidades das asserções. Juntos, eles tornam os testes legíveis para toda a equipe, incluindo gerentes e analistas.
Exemplo de teste usando Quick/Nimble:
import Quickimport Nimble@testable import MyApp
class LoginSpec: QuickSpec { override func spec() { describe("LoginViewController") { var viewController: LoginViewController!
beforeEach { viewController = LoginViewController() _ = viewController.view // Carregar a view }
context("quando dados corretos são inseridos") { it("deve chamar o método de autenticação") { viewController.emailTextField.text = "user@example.com" viewController.passwordTextField.text = "password123" viewController.loginButtonTapped() expect(viewController.isAuthorized).to(beTrue()) } }
context("quando a senha está vazia") { it("deve mostrar um erro") { viewController.emailTextField.text = "user@example.com" viewController.passwordTextField.text = "" viewController.loginButtonTapped() expect(viewController.errorLabel.isHidden).to(beFalse()) } } } }}- describe/context/it — estrutura hierárquica de especificações
- beforeEach/afterEach — hooks para preparação do estado
- expect(...).to(...) — verificações legíveis com vários matchers
3. SnapshotTesting — testes visuais
A biblioteca SnapshotTesting da Point-Free permit