Swift Testing의 매크로와 주요 테스트 기능
Swift Testing explained with code examples
핵심 요약
- Swift Testing은 @Test와 #expect 매크로를 사용하며, 새 Xcode 프로젝트의 기본 테스트 프레임워크로 XCTest의 테스트 메서드 접두사와 여러 assertion 메서드를 대체합니다.
- struct로 테스트를 계층화하고, 매개변수화 테스트로 반복 입력을 한 테스트에 모을 수 있으며, #require와 첨부 파일 기능은 테스트 실행과 실패 진단을 지원합니다.
- Swift 6.2 및 Xcode 26 이상에서는 자식 프로세스에서 종료 테스트를 실행할 수 있지만, iOS는 지원되지 않으며 캡처 값은 Sendable과 Codable을 모두 준수해야 합니다.
도입
Swift Testing은 @Test, #expect, #require 같은 매크로를 중심으로 테스트를 작성하는 Swift 테스트 프레임워크다. 새 Xcode 프로젝트의 기본 프레임워크이며, XCTest에서 사용하던 assertion 메서드와 테스트 메서드 접두사 대신 표현식의 실패 정보를 제공하는 매크로를 사용한다. 테스트는 전역 함수로 시작해 struct로 구성할 수 있다.
상세 요약
기본 작성 방식
Swift Testing을 쓰려면 Testing을 가져온 뒤 @Test로 테스트 함수를 선언한다. 테스트 함수는 전역에 둘 수 있으며, @testable import를 사용하면 테스트 대상 모듈의 internal 타입에 접근할 수 있다. 테스트 함수 이름에 test 접두사를 붙이지 않아도 된다.
import Testing
@testable import SwiftTestingPlayground
@Test func personFullName() {
let person = Person(firstName: "Antoine", lastName: "van der Lee")
#expect(person.fullName == "Antoine van der Lee")
}
#expect는 XCTest의 XCTAssert 계열 assertion 대신 조건을 표현한다. Xcode는 실패한 표현식의 세부 정보를 보여줘 어떤 값이 예상과 달랐는지 확인할 수 있다.
테스트 구성과 조건 검사
테스트를 관련 타입별로 묶으려면 struct를 사용한다. 예를 들어 PersonTests 안에 이름 테스트를 두고, 내부 Names struct를 추가해 이름 관련 테스트를 한 단계 더 구분할 수 있다. 테스트 메타데이터로 traits와 tags를 활용하는 구성도 가능하다.
#require는 조건이 충족되지 않으면 테스트를 실패시키고, 성공하면 값을 반환한다. XCTest의 XCTUnwrap과 유사한 방식으로 사용할 수 있다. 반환된 값을 이후 검사에 이용하면 된다.
반복 입력과 프로세스 종료 테스트
Parameterized Tests는 여러 입력을 하나의 테스트 함수에 전달한다. 예시에서는 zip으로 묶은 두 컬렉션의 값을 @Test(arguments:)에 전달해, 기능별 사용 횟수를 각각 검사한다. 반복 테스트 코드를 줄이고 테스트 케이스 수를 관리하는 방식이다.
Swift 6.2부터는 exit test로 precondition이나 fatalError처럼 프로세스를 종료시키는 코드를 검증할 수 있다. 테스트 본문은 새 자식 프로세스에서 실행되며, 예시에서는 잔액을 초과한 인출이 .failure 종료로 이어지는지 확인한다. 이 기능은 Swift 6.2와 Xcode 26 이상이 필요하고 macOS와 Linux에서 실행되지만 iOS에서는 지원되지 않는다. 본문 안에서 캡처하는 값은 자식 프로세스로 전달되므로 Sendable과 Codable을 모두 준수해야 한다.
첨부 파일과 XCTest 병행
Attachment.record로 문자열, 데이터, 파일, 이미지 등을 테스트에 첨부할 수 있으며, 실행이 끝난 뒤 Xcode 테스트 보고서에서 확인한다. Foundation을 가져오면 Encodable을 준수하는 타입도 자동으로 첨부할 수 있다.
기존 XCTest를 한 번에 모두 옮길 필요는 없다. XCUIApplication을 사용하는 UI 자동화 테스트와 XCTMetric을 사용하는 성능 테스트는 계속 XCTest가 필요하다. 두 프레임워크는 같은 테스트 타깃에서 공존할 수 있으므로 assertion을 먼저 바꾸고, 테스트 구성을 정리한 뒤, 반복되는 테스트에 매개변수화를 적용하는 순서로 점진적으로 마이그레이션할 수 있다. Swift Testing의 태그 기반 테스트 필터링에 관한 후속 내용은 2026년 7월 Swift 소식: 동시성 런타임과 테스트 기능 업데이트에서도 다룬다.
결론
Swift Testing은 테스트 구성, 매개변수화, 실패 진단, 종료 검증과 첨부 파일을 하나의 테스트 워크플로에서 제공한다. 다만 UI 자동화에는 XCUIApplication, 성능 테스트에는 XCTMetric이 필요하므로 XCTest를 모두 없앨 수는 없다. 두 프레임워크는 같은 테스트 타깃에서 함께 사용할 수 있어 assertion 변환부터 단계적으로 옮길 수 있다.