Swift Testing #1: XCTest 테스트 스위트를 Swift Testing으로 마이그레이션
Source: Dev.to
Swift Testing으로 변환
import XCTest
@testable import ProductionProject
class SomeXCTest_deprecated: XCTestCase {
func testX() throws {
// GIVEN
// ...
// WHEN
// ...
// THEN ...
XCTAssert(A == B, "Expected \(A) but received \(B)")
}
}
import Testing
@testable import ProductionProject
struct SomeTest {
@Test
func x() throws {
// GIVEN
// ...
// WHEN
// ...
// THEN ...
#expect(A == B, "Expected \(A) but received \(B)")
}
}
Swift Testing은 Xcode 16부터 사용할 수 있으며, 공식 문서에 따르면 Swift 6이 필요합니다. 하지만 Swift 5 프로젝트에서도 사용할 수 있습니다.
테스트 이름 지정
Swift Testing에서는 테스트 이름을 @Test 어노테이션에 제공한 설명이나 메서드 이름에서 가져올 수 있습니다. 또한 백틱(`)을 사용해 메서드 이름에 공백을 포함시킬 수 있습니다. 두 방식을 같은 테스트에서 혼용할 수는 없습니다.
import Testing
@testable import ProductionProject
struct SomeTest {
@Test("GIVEN some conditions, WHEN executing something, THEN it should return X")
func x() throws {
// ...
}
func `GIVEN some conditions, WHEN executing something, THEN it should...`() throws {
// ...
}
@Test
func GIVENsomeconditionsWHENexecutingsomethingTHENitShouldReturnX() throws {
// ...
}
}
추가 기능
- XCTest와 Swift Testing 테스트를 같은 파일 및 프로젝트에 혼합해서 사용할 수 있습니다.
- 모든 XCTest 테스트를 Swift Testing으로 마이그레이션할 필요는 없습니다.
- 프레임워크는 value type을 선호합니다.
tearDown(클래스에서deinit으로 구현) 이 필요하지 않다면struct를 사용하는 것이 권장됩니다.
Swift Testing 수동 의존성 제거
Swift and Tips 영상에서는 SPM 패키지 swift-testing(버전 0.10)을 사용했습니다. 해당 버전에서는 실패한 테스트(#expect(1 == 2))가 콘솔에서는 실패로 표시되지만 보고서에서는 성공으로 나타났습니다.
Xcode 26에 내장된 버전을 사용하려면 SPM 의존성을 제거합니다:
- 의존성 제거:
OnlineStoreMV > Project > Package Dependency→swift-testing삭제. - 빌드: 빌드 시 “unable to find module dependency _TestingInternals” 오류가 발생합니다.
- 해결 방법: 프로젝트를 정리(
⌘⇧K)한 뒤 다시 빌드합니다.
XCTAssert와 @Test의 상호 운용성
XCTAssert는 XCTestCase를 상속받은 클래스 내부에서만 동작합니다. 이는 XCTestRun이 XCTestSuite 안에서 실행하기 때문이며, @Test가 붙은 메서드 안에서 XCTAssert를 사용하면 테스트 실패가 기록되지 않습니다.
import XCTest
import Testing
struct MyTests {
@Test
func something() {
XCTAssert(2 == 3) // 작동하지 않음: 테스트가 통과합니다.
#expect(2 == 3) // 올바른 사용: 테스트가 실패합니다.
}
}
하지만 @Test가 붙은 테스트에 XCTAssert만 포함되어 있더라도 Swift Testing 러너가 해당 테스트를 인식하지만, 실패는 제대로 기록되지 않습니다.
참고 문헌
- 영상 Mastering Swift Testing: Installation & Refactoring from XCTest to @test Macro, YouTube.
- 재생목록 Swift Testing (Swift and Tips), YouTube.
- Swift Testing 공식 문서, Apple Developer.
- WWDC 2024 Meet Swift Testing, Apple Videos.
- WWDC 2024 Go further with Swift Testing, Apple Videos.
- Swift Testing GitHub 레포지토리, github.com/swiftlang/swift-testing.
- 기사 Is MVVM Necessary for Developing Apps with SwiftUI?, Swift and Tips.
- 프로젝트 OnlineStore made with SwiftUI (Vanilla) and Observation, GitHub.