WWDC24: Swift Testing 완전 정복 — Swift 공식 테스트 프레임워크 심층 해부

Ios_Roy·2025년 10월 15일

WWDC

목록 보기
7/13
post-thumbnail

Swift 개발자라면 반드시 알아야 할 새로운 공식 테스트 프레임워크, Swift Testing! WWDC24 세션에서 발표된 Swift Testing의 구조, 목적, 실제 사용법, 그리고 기존 XCTest와의 차이까지 한눈에 알 수 있도록 한 곳에 다 정리했습니다.


🤔 테스트란 무엇이고, 왜 필요한가?

테스트란, 내 코드가 정상적으로 동작하는지 자동으로 체크해주는 프로그램입니다. 사용자 입력, 환경 변화, 코드 수정 등 어떠한 상황에도 버그 없이 Reliable하게 소프트웨어 품질을 유지하려면, 자동화된 테스트 코드는 필수!
테스트 코드는 실수를 최소화하고, 코드 변경에도 안정성을 보장하는 안전망 역할을 합니다.


🚀 Swift Testing의 탄생 배경/설계 목표

Swift에서는 오래전부터 XCTest를 써왔으나,

  • Objective-C 스타일의 유산, 복잡한 선언 방식, 중복/반복 코드, 최신 Swift 문법 미지원 등 단점이 많았죠.

Swift Testing은 이를 완전히 뒤집어,

  • 순수 Swift 문법, 고급 기능(동시성, 매크로)
  • 자유로운 확장성과 오픈 소스
  • 직관적인 선언, 플랫폼 호환성, 커뮤니티 협력 개발
    로 설계되었습니다.

🎯 Swift Testing의 구성 요소와 주요 API

1. @Test 애트리뷰트 — Swift다운 선언의 핵심

@Test
func testSum() {
    #expect(sum(2, 3) == 5)
}

설명:

  • 함수에 @Test만 붙이면 즉시 테스트 함수로 등록!
  • 클래스 상속/특수 함수명 규칙 필요 없음.
  • 전역/인스턴스/비동기/예외/액터 격리 등 최근 Swift 문법과 완벽 호환.

2. #expect / #require — 간결한 검증 API

@Test
func testValue() {
    #expect(value > 0)            // 실패해도 다음 코드 계속
    #require(result == expected)  // 실패 시 즉시 종료!
}
  • #expect : 경고 형태 (soft failure)
  • #require : 필수 조건 (hard failure)

3. Trait — 공통 규칙(특성) 반복적용

  • Trait란?
    • 여러 테스트에 반복 적용할 공통 특성을 코드로 묶어 쓰는 도구.
trait PositiveTrait {
    #expect(value > 0)
}
@Test(trait: PositiveTrait)
func testPrice() {
    let value = getPrice()
}
  • 비유: ‘운전할 때 모두 안전벨트 해야’라는 규칙을 태그처럼 반복 적용

4. Suite — 연관 테스트 그룹화

  • Suite란?
    • 서로 관련된 테스트함수를 하나의 그룹(챕터)로 묶어 구조화
@Suite
struct MathTests {
    @Test func testAdd() { #expect(1 + 2 == 3) }
    @Test func testMultiply() { #expect(2 * 5 == 10) }
}
  • 비유: 책에서 ‘수학 챕터’ 아래 ‘덧셈/곱셈’ 소단원 구조와 동일

5. Tag — 특성 구분과 필터링

  • 태그를 붙여 “네트워크”, “포맷팅” 등으로 특정 테스트 그룹만 선택 실행 가능!
@Test(.tags(.network))
func testNetworkCall() { ... }
  • Suite에 태그를 붙이면, 내부 모든 테스트가 자동 상속

6. 조건부 실행, 파라미터화 테스트

조건 예시:

@Test(where: .platform(.ios))
func testFeatureOniOS() { ... }

파라미터화 예시(같은 로직 여러 값 반복 확인):

@Test(arguments: [("A Beach"), ("By the Lake")])
func mentionedContinentCounts(videoName: String) async throws {
    ...
}

🌈 코드 예제/실무 적용

문자열 검증

@Suite
struct StringSuite {
    @Test func testIsEmpty() { let str = ""; #expect(str.isEmpty) }
    @Test(arguments: ["swift", "apple"])
    func startsWithS(str: String) { #expect(str.hasPrefix("s")) }
}

Trait 적용 예시

trait LengthTrait { #expect(str.count >= 0) }
@Test(trait: LengthTrait)
func testStringLength() { let str = "hello"; #expect(str.count == 5) }

조건부/파라미터화 테스트 예시

@Suite
struct MathSuite {
    @Test(arguments: [(1, 1, 2), (2, 3, 5)]) func testSum(a: Int, b: Int, expected: Int) { #expect(a + b == expected) }
    @Test(where: .platform(.ios)) func testFeatureOniOS() { /* iOS에서만 실행 */ }
}

🧠 기존 XCTest와의 차이

항목XCTestSwift Testing
선언 방식XCTestCase 클래스/함수명 규칙@Test/@Suite 자유 선언
검증 방식XCTAssert*#expect, #require
반복 테스트제한적arguments 완전 지원
Trait없음trait로 공통 규칙/검증 관리
그룹화클래스/파일 단위@Suite 구조화(중첩/태그 가능)
조건부 실행별도 코드/속성 처리@Test(where:) 등으로 직관적 선언
오픈소스Apple 내장/폐쇄적GitHub 오픈소스, 커뮤니티 중심

마이그레이션도 점진적으로 가능하며 기존 XCTest와 공존 가능.


⚙️ 실전 적용 팁 & 유의사항

  • 기존 XCTest 코드는 점진적으로 마이그레이션하세요.
  • Trait/Suite/Tag 등 재사용 패턴 적극 활용 — 코드 중복 대폭 감소!
  • 최신 Swift 문법과 IDE 통합, CI/CD에도 잘 연동.
  • 실무에선 공식 문서, 예시, 깃허브 리포 모두 적극 참고.

오픈 소스 생태계 & 공식 자료


결론: Swift 시대의 테스트 품질, 이제 Swift Testing으로!

Swift Testing은 그냥 테스트 패키지가 아니라,

  • 코드 품질 개선, 자동화‧구조화, 실무 효율, 오픈소스 생태계 완성
    을 모두 잡을 수 있는 공식 게임 체인저입니다.

이제는 Swift Testing으로 내 프로젝트/라이브러리의 테스트 품질을 한 단계 올려보세요!


✔ 한 줄 요약

  • Trait는 반복적 검증 규칙을 코드로 묶는 세트!
  • Suite는 여러 테스트를 기능/챕터별 관리하는 그룹!

Swift Testing 핵심, 이해와 경험에서 시작하세요.


profile
iOS 개발자 공부하는 Roy

0개의 댓글