Por qué las pruebas normales no salvan, y qué es BDD
Cada desarrollador iOS se ha enfrentado a esta situación: escribiste cien pruebas unitarias, cobertura del 90%, pero en la siguiente demo el jefe dice: «¿Por qué al presionar este botón no pasa nada?». Miras el código — todo funciona. El problema es que las pruebas unitarias verifican el código, no el comportamiento del sistema. Aquí es donde entra BDD (Behaviour-Driven Development) — una metodología que elimina la frontera entre las pruebas «técnicas» y la «lógica de negocio».
BDD en Swift no es solo un término de moda. Es una forma de escribir pruebas que no solo un desarrollador, sino también un analista, tester o incluso el cliente pueda leer. En este artículo, analizaremos cómo implementar behaviour-driven development en tu proyecto iOS, utilizando los frameworks Quick y Nimble, y mostraremos ejemplos prácticos en Swift.
Qué es BDD en palabras sencillas
Imagina que no escribes pruebas, sino un guion para una película. En el guion hay personajes (usuario, sistema), eventos (presionar un botón, enviar una solicitud) y un resultado esperado (aparición de una alerta, actualización de la UI). BDD es ese «guion», pero para tu aplicación.
La idea principal: las pruebas deben describir el comportamiento del sistema desde el punto de vista del usuario. En lugar de «el método saveUser() devuelve true», escribes «cuando el usuario ingresa un email válido y presiona "Guardar", el sistema muestra el mensaje "Éxito"».
Cómo se diferencia BDD de TDD
Muchos confunden BDD con TDD (Test-Driven Development). La diferencia es simple:
- TDD — escribimos la prueba, luego el código, luego refactorizamos. Enfoque en la corrección de la implementación.
- BDD — escribimos un escenario de comportamiento, luego el código que implementa ese comportamiento. Enfoque en el valor para el usuario.
BDD es una evolución de TDD. Si TDD responde a la pregunta «¿el código funciona correctamente?», BDD responde «¿el código hace lo que el negocio necesita?».
Herramientas para BDD en Swift
En el mundo de Swift hay dos «pilares» principales para behaviour-driven development:
- Quick — framework para escribir pruebas al estilo BDD. Reemplaza el XCTest estándar y proporciona la sintaxis describe/context/it.
- Nimble — biblioteca de «matchers» (verificaciones). En lugar de XCTAssertEqual, escribes expect(value).to(equal(5)) — se lee como una oración en inglés.
Estas herramientas funcionan muy bien juntas y permiten escribir pruebas que parecen una especificación.
Instalación de Quick y Nimble mediante Swift Package Manager
Agrega las dependencias en tu Package.swift o a través de Xcode: File → Add Packages → ingresa la URL del repositorio de Quick: https://github.com/Quick/Quick.git y de Nimble: https://github.com/Quick/Nimble.git.
Ejemplo para Package.swift:
// swift-tools-version:5.9import PackageDescription
let package = Package( name: "MyApp", dependencies: [ .package(url: "https://github.com/Quick/Quick.git", from: "7.0.0"), .package(url: "https://github.com/Quick/Nimble.git", from: "13.0.0"), ], targets: [ .target(name: "MyApp"), .testTarget( name: "MyAppTests", dependencies: ["MyApp", "Quick", "Nimble"] ) ])Escribimos la primera prueba BDD en Swift
Supongamos que tenemos un LoginService simple que verifica el usuario y la contraseña. En lugar de escribir un aburrido XCTest, crearemos una prueba al estilo BDD.
Código del servicio (para contexto)
class LoginService { func authenticate(username: String, password: String) -> Result<User, LoginError> { guard !username.isEmpty else { return .failure(.emptyUsername) } guard !password.isEmpty else { return .failure(.emptyPassword) } guard pas