Swift Testing #4: Correr pruebas de forma serial

Published: (December 4, 2025 at 05:15 PM EST)
2 min read
Source: Dev.to

Source: Dev.to

Ejecución de pruebas en Swift Testing

Ejecutar las pruebas de forma concurrente en XCTest es opcional y, de hecho, por defecto se ejecutan de forma serial. En cambio, en Swift Testing la ejecución es paralela por defecto.

Aunque no está bien hecho, en ocasiones el arnés de pruebas debe ser ejecutado de forma serial. Muy probablemente esto se deba a que el código a probar tiene algún estado estático compartido entre las pruebas.

Ejemplo de problema con estado estático

Consideremos la siguiente clase State:

class State {
    private static var numbers = [1, 2, 3]
    func add(number: Int) {
        State.numbers.append(number)
    }
    func add(numbers: [Int]) {
        State.numbers.append(contentsOf: numbers)
    }
    func removeLastNumber() -> Int? {
        State.numbers.popLast()
    }
    var count: Int {
        State.numbers.count
    }
}

Las siguientes pruebas muy probablemente fallarán porque comparten el mismo estado estático:

struct StaticTests {
    let state = State()
    @Test
    func test1() {
        state.add(numbers: [4, 5])
        #expect(state.count == 5)
        #expect(state.removeLastNumber() == 5)
    }
    @Test
    func test2() {
        state.add(numbers: [6, 7])
        #expect(state.count == 6)
        #expect(state.removeLastNumber() == 7)
    }
}

Ejecutar pruebas de forma serial

Para que funcionen, es necesario configurar explícitamente la Suite de pruebas, especificando que debe ser ejecutada de forma serial mediante el trait .serialized.

Ejemplo de pruebas que se ejecutan de forma secuencial:

@Suite(.serialized) // Definir explícitamente la Suite
struct StaticTests {
    let state = State()
    @Test
    func test1() {
        state.add(numbers: [4, 5])
        #expect(state.count == 5)
        #expect(state.removeLastNumber() == 5)
    }
    @Test
    func test2() {
        state.add(numbers: [6, 7])
        #expect(state.count == 6)
        #expect(state.removeLastNumber() == 7)
    }
}

Bibliografía

  • Video “Mastering Swift Testing: Run Serialized Tests with One Line of Code!” (Swift and Tips), aquí.
  • Lista de reproducción “Swift Testing” (Swift and Tips), aquí.
  • Documentación sobre Swift Testing, aquí.
  • Documentación “Running tests serially or in parallel”, aquí.
Back to Blog

Related posts

Read more »