DEV Community

David Goyes
David Goyes

Posted on

Swift Testing #4: Correr pruebas de forma serial

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.

Considerar 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
  }
}
Enter fullscreen mode Exit fullscreen mode

Las siguientes pruebas muy probablemente fallarán:

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)
    }
}
Enter fullscreen mode Exit fullscreen mode

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

Por ejemplo, las siguientes pruebas 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)
    }
}
Enter fullscreen mode Exit fullscreen mode

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í.

Top comments (0)