Swift Testing #4: 테스트를 순차적으로 실행
Source: Dev.to
Swift Testing에서 테스트 실행
XCTest에서 테스트를 동시에 실행하는 것은 선택 사항이며, 실제로 기본값은 순차적으로 실행됩니다. 반면 Swift Testing에서는 기본적으로 병렬 실행됩니다.
비록 권장되지 않지만, 때때로 테스트 스위트를 순차적으로 실행해야 할 경우가 있습니다. 이는 테스트 대상 코드가 테스트들 사이에 공유되는 정적 상태를 가지고 있기 때문일 가능성이 높습니다.
정적 상태 문제 예시
다음 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
}
}
다음 테스트들은 동일한 정적 상태를 공유하기 때문에 대부분 실패할 것입니다:
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)
}
}
테스트를 순차적으로 실행하기
테스트가 정상적으로 동작하도록 하려면, Suite를 명시적으로 설정하고, .serialized 트레이트를 사용해 순차 실행하도록 지정해야 합니다.
순차적으로 실행되는 테스트 예시:
@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)
}
}