Testes em Swift (iOS/macOS): visão geral de frameworks e ferramentas
A qualidade de aplicativos móveis e desktop em Swift depende diretamente de um sistema de testes bem estruturado. No ecossistema Apple, existem vários frameworks maduros que cobrem todos os níveis da pirâmide de testes: desde testes unitários até testes de UI e testes de regressão visual. Neste artigo, vamos analisar as principais ferramentas, seus recursos e fornecer exemplos práticos em Swift.
1. XCTest — framework padrão da Apple
XCTest está integrado ao Xcode e é a principal ferramenta para escrever testes unitários e de UI. Ele suporta testes assíncronos, desempenho e integração com CI/CD.
Exemplo de teste unitário:
import XCTest@testable import MyApp
final class CalculatorTests: XCTestCase { var calculator: Calculator!
override func setUp() { super.setUp() calculator = Calculator() }
func testAddition() { let result = calculator.add(2, 3) XCTAssertEqual(result, 5, "A adição deve estar correta") }
func testAsyncOperation() { let expectation = XCTestExpectation(description: "Operação assíncrona") calculator.fetchRemoteValue { value in XCTAssertGreaterThan(value, 0) expectation.fulfill() } wait(for: [expectation], timeout: 5.0) }}Principais recursos do XCTest:
- Asserções:
XCTAssertEqual,XCTAssertNil,XCTAssertThrowsError - Medição de desempenho com
measure - Testes de UI com
XCUIApplicationeXCUIElement - Suporte para execução paralela de testes
2. Quick + Nimble — abordagem BDD
Quick é um framework BDD que permite escrever testes no estilo "Given-When-Then". Nimble é seu complemento, fornecendo matchers expressivos.
Exemplo com Quick/Nimble:
import Quickimport Nimble
class UserSpec: QuickSpec { override func spec() { describe("Modelo User") { var user: User!
beforeEach { user = User(name: "Alice", age: 30) }
context("quando a idade é válida") { it("deve ser adulto") { expect(user.isAdult).to(beTrue()) } }
context("ao atualizar o nome") { it("altera o nome corretamente") { user.updateName("Bob") expect(user.name) == "Bob" } } } }}Vantagens:
- Testes legíveis, compreensíveis para não-programadores
- Matchers flexíveis:
beCloseTo(),contain(),throwError() - Suporte para assincronia com
toEventually()
3. XCUITest — Testes de UI
Para testar a interface do usuário, utiliza-se XCUITest. Ele simula ações do usuário: toques, deslizes, entrada de texto.
Exemplo de teste de UI para iOS:
import XCTest
class LoginUITests: XCTestCase { let app = XCUIApplication()
override func setUp() { continueAfterFailure = false app.launch() }
func testSuccessfulLogin() { let usernameField = app.textFields["username"] usernameField.tap() usernameField.typeText("testuser")
let passwordField = app.secureTextFields["password"] passwordField.tap() passwordField.typeText("password123")
app.buttons["Login"].tap() XCTAssertTrue(app.staticTexts["Welcome"].exists) }}
Também na biblioteca
Recommendations