Swift Testing #1: Migración de una Suite de pruebas de XCTest a Swift Testing
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 condeiniten una clase), se recomienda usarstruct.
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:
- Eliminar dependencia:
OnlineStoreMV > Project > Package Dependency→ eliminarswift-testing. - Compilar: al intentar compilar, apareció el error “unable to find module dependency _TestingInternals”.
- 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.