Pruebas de integración de Swift con Docker: nivel avanzado

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 de integración de Swift con Docker: nivel avanzado



Las pruebas de integración son una etapa clave en el desarrollo de aplicaciones Swift confiables. A diferencia de las pruebas unitarias, verifican la interacción entre componentes reales: base de datos, servicios de red, sistema de archivos. Docker permite aislar estas dependencias, haciendo que las pruebas sean reproducibles e independientes del entorno del desarrollador. En este artículo, exploraremos técnicas avanzadas de pruebas de integración para aplicaciones Swift (iOS y lado del servidor) utilizando Docker.



1. Fundamentos de la contenerización con Docker para pruebas Swift



Antes de profundizar en escenarios avanzados, es importante comprender la arquitectura básica. Docker permite ejecutar dependencias (PostgreSQL, Redis, servidores mock) en contenedores aislados que se levantan automáticamente antes de las pruebas y se destruyen después.



Para Swift del lado del servidor (Vapor, Kitura), utilizamos la imagen oficial de Swift. Para aplicaciones iOS, Docker no puede ejecutar el simulador, pero es excelente para probar la capa de red y el backend.



Ejemplo de archivo Docker Compose básico para un proyecto Vapor:



version: '3.8'services:  app:    image: swift:5.10-focal    working_dir: /app    volumes:      - .:/app    depends_on:      - db      - redis    environment:      - DATABASE_URL=postgres://user:pass@db:5432/testdb      - REDIS_URL=redis://redis:6379

db: image: postgres:16-alpine environment: POSTGRES_USER: user POSTGRES_PASSWORD: pass POSTGRES_DB: testdb ports: - "5432:5432"

redis: image: redis:7-alpine ports: - "6379:6379"


Este archivo levanta tres contenedores: el servidor Swift, PostgreSQL y Redis. Ahora escribamos una prueba de integración que verifique el guardado de un usuario en una base de datos real.



2. Escritura de pruebas de integración con XCTest y Docker



Para las pruebas de integración de Swift del lado del servidor, utilizaremos el framework estándar XCTest. El punto clave es que las pruebas deben ejecutarse dentro del contenedor que tiene acceso a otros contenedores.



Ejemplo de prueba para una aplicación Vapor:



import XCTest@testable import Appimport Vapor

final class UserIntegrationTests: XCTestCase {

var app: Application!

override func setUp() async throws { app = try await Application.make(.testing) try await configure(app)

// Migración de la base de datos antes de cada prueba try await app.autoMigrate() }

override func tearDown() async throws { try await app.autoRevert() try await app.asyncShutdown() }

func testCreateAndFetchUser() async throws { // Creamos un usuario a través de la API let userDTO = UserDTO(name: "Alice", email: "alice@test.com") try await app.test(.POST, "/users", beforeRequest: { req in try req.content.encode(userDTO) }, afterResponse: { res in XCTAssertEqual(res.status, .created) let createdUser = try res.content.decode(User.self) XCTAssertEqual(createdUser.name, "Alice") })

// Verificamos que el usuario se haya guardado en la base de datos try await app.test(.GET, "/users/\\(aliceID)", afterResponse: { res in XCTAssertEqual(res.status, .ok) let fetchedUser = try res.content.decode(User.self) XCTAssertEqual(fetchedUser.email, "alice@test.com") }) }}


Esta prueba inicia la aplicación, realiza solicitudes HTTP al servidor real dentro del contenedor y verifica las respuestas. Docker garantiza que la base de datos y Redis estén limpios para cada ejecución.



3. Servidores mock y aislamiento de dependencias externas



A nivel avanzado, a menudo es necesario probar la interacción con APIs externas (sistemas de pago, servicios meteorológicos)

Blogs

Book Recommendations