Pruebas basadas en propiedades en Swift: atrapa errores que no buscabas

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Pruebas basadas en propiedades en Swift: cuando las pruebas normales fallan



¿Alguna vez has escrito una prueba unitaria que pasa con nota, pero luego la aplicación falla con datos reales? Te suena, ¿verdad? Las pruebas clásicas basadas en ejemplos (cuando verificamos una entrada y salida específicas) son buenas, pero tienen una falla fundamental: solo verifican lo que nosotros mismos hemos pensado. ¿Y si el error vive en el límite de los valores permitidos, o en una combinación que simplemente no se nos ocurrió?



Aquí es donde entran en escena las pruebas basadas en propiedades en Swift. Es un enfoque en el que no describes casos concretos, sino propiedades que deben ser verdaderas para cualquier dato de entrada. Y un framework especial (por ejemplo, SwiftCheck) genera cientos de valores aleatorios y verifica si tu propiedad se cumple. Si se encuentra un error, el framework "minimiza" los datos de entrada, y obtienes el ejemplo más simple con el que todo se rompe.



En este artículo, veremos cómo implementar pruebas basadas en propiedades en Swift en tu proyecto, escribiremos ejemplos de código reales y veremos qué errores se pueden detectar con este enfoque. ¡Allá vamos!



¿Qué son las pruebas basadas en propiedades y para qué sirven?



Imagina que estás probando una función que ordena un array. En lugar de escribir 10 pruebas con diferentes arrays, dices: "para cualquier array, después de ordenarlo, la longitud no cambia y cada elemento es menor o igual al siguiente". Eso es una propiedad: un invariante que debe cumplirse.



Las pruebas basadas en propiedades en Swift son ideales para:

  • Verificar funciones matemáticas (suma, división, redondeo);
  • Probar analizadores y serializadores (la serialización seguida de deserialización debe devolver el original);
  • Verificar lógica de negocio con muchas combinaciones;
  • Buscar regresiones en valores límite.


El beneficio principal: encuentras errores cuya existencia ni siquiera sospechabas. Y eso, estarás de acuerdo, es mejor que confirmar lo obvio.



SwiftCheck: la herramienta principal para pruebas basadas en propiedades en Swift



En el mundo de Swift, el framework más popular para este enfoque es SwiftCheck. Porta las ideas de Haskell (la biblioteca QuickCheck) y se integra perfectamente con XCTest.



Para empezar, agrega la dependencia en tu Package.swift:



// swift-tools-version:5.9import PackageDescription

let package = Package( name: "MyProject", dependencies: [ .package(url: "https://github.com/typelift/SwiftCheck.git", from: "0.12.0") ], targets: [ .testTarget( name: "MyProjectTests", dependencies: ["SwiftCheck"]), ])


Ahora puedes escribir pruebas. Analicemos la sintaxis básica.



Primera prueba basada en propiedades: verificar la suma



Escribamos una propiedad simple: "la suma es asociativa". Para cualquier número entero, a + b + c debe ser igual a (a + b) + c.



import XCTestimport SwiftCheck

class MathPropertiesTests: XCTestCase { func testAdditionIsAssociative() { property("La suma es asociativa") <- forAll { (a: Int, b: Int, c: Int) in return (a + b) + c == a + (b + c) } }}


Ejecutamos la prueba: ejecuta 100 combinaciones aleatorias (por defecto). Si al menos una falla, SwiftCheck mostrará los valores específicos. Observa: ¡no especificamos ningún número concreto! Las pruebas basadas en propiedades en Swift generan los datos por sí mismas.



Verificar la transformación inversa (roundtrip)



Este es el patrón más común. Supongamos que tenemos una estructura que se serializa a JSON. Propiedad: "después de serializar y deserializar, obtenemos el mismo ob

Blogs

Book Recommendations