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
}
}
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)
}
}
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)
}
}
Top comments (0)