Swift Testing #1: Migración de una Suite de pruebas de XCTest a Swift Testing

Published: (December 4, 2025 at 04:54 PM EST)
3 min read
Source: Dev.to

Source: Dev.to

Conversión a Swift Testing

import XCTest
@testable import ProductionProject

class SomeXCTest_deprecated: XCTestCase {
    func testX() throws {
        // GIVEN
        // ...

        // WHEN
        // ...

        // THEN ...
        XCTAssert(A == B, "Expected \(A) but received \(B)")
    }
}
import Testing
@testable import ProductionProject

struct SomeTest {
    @Test
    func x() throws {
        // GIVEN
        // ...

        // WHEN
        // ...

        // THEN ...
        #expect(A == B, "Expected \(A) but received \(B)")
    }
}

Swift Testing está disponible a partir de Xcode 16 y, según la documentación oficial, requiere Swift 6. Sin embargo, es posible usarlo también con proyectos en Swift 5.

Nombramiento de una prueba

En Swift Testing el nombre de la prueba puede provenir del nombre del método o de una descripción dentro de la etiqueta @Test. También es posible usar backticks para nombrar el método con espacios. No se pueden combinar ambas técnicas en la misma prueba.

import Testing
@testable import ProductionProject

struct SomeTest {
    @Test("GIVEN some conditions, WHEN executing something, THEN it should return X")
    func x() throws {
        // ...
    }

    func `GIVEN some conditions, WHEN executing something, THEN it should...`() throws {
        // ...
    }

    @Test
    func GIVENsomeconditionsWHENexecutingsomethingTHENitShouldReturnX() throws {
        // ...
    }
}

Características adicionales

  • Es posible mezclar pruebas de XCTest y Swift Testing en el mismo archivo y proyecto.
  • No es obligatorio migrar todas las pruebas de XCTest a Swift Testing.
  • El framework favorece los value types; si no se necesita tearDown (implementado con deinit en una clase), se recomienda usar struct.

Removiendo la dependencia manual de Swift Testing

El video de Swift and Tips incluía el paquete SPM swift-testing (versión 0.10). Con esa versión, una prueba fallida (#expect(1 == 2)) aparecía como fallida en la consola pero como exitosa en el reporte.

Para usar la versión integrada en Xcode 26, se eliminó la dependencia SPM:

  1. Eliminar dependencia: OnlineStoreMV > Project > Package Dependency → eliminar swift-testing.
  2. Compilar: al intentar compilar, apareció el error “unable to find module dependency _TestingInternals”.
  3. Solución: limpiar el proyecto (⌘⇧K) y volver a compilar.

Interoperabilidad entre XCTAssert y @Test

XCTAssert solo funciona dentro de una clase que herede de XCTestCase, ya que es ejecutado por XCTestRun dentro de un XCTestSuite. Por lo tanto, usar XCTAssert en un método marcado con @Test no producirá un fallo de prueba.

import XCTest
import Testing

struct MyTests {
    @Test
    func something() {
        XCTAssert(2 == 3)   // No funciona: la prueba pasa.
        #expect(2 == 3)     // Correcto: la prueba falla.
    }
}

Sin embargo, una prueba marcada con @Test que solo contiene XCTAssert sigue siendo reconocida por el runner de Swift Testing, aunque el fallo no se registre correctamente.

Referencias bibliográficas

  • Video Mastering Swift Testing: Installation & Refactoring from XCTest to @test Macro, YouTube.
  • Lista de reproducción Swift Testing (Swift and Tips), YouTube.
  • Documentación oficial de Swift Testing, Apple Developer.
  • WWDC 2024 Meet Swift Testing, Apple Videos.
  • WWDC 2024 Go further with Swift Testing, Apple Videos.
  • Repositorio GitHub de Swift Testing, github.com/swiftlang/swift-testing.
  • Artículo Is MVVM Necessary for Developing Apps with SwiftUI?, Swift and Tips.
  • Proyecto OnlineStore made with SwiftUI (Vanilla) and Observation, GitHub.
Back to Blog

Related posts

Read more »