Swift Testing #4: Correr pruebas de forma serial
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)
}
}