Skip to content

ADR-17: Swift Testing 프레임워크 지원

🇺🇸 English Version

날짜작성자리포지토리
2026-01-04@specvitalcore

컨텍스트

문제 상황

주요 Swift 리포지토리(예: GitHub 스타 40K+ Alamofire) 검증 중 Swift Testing 테스트 미감지. 기존 XCTest 파서 인식 범위:

  • func testXxx() 네이밍 컨벤션
  • XCTestCase 상속 클래스

Apple WWDC 2024 (Swift 6 / Xcode 16) 발표 Swift Testing - 근본적으로 다른 패턴:

패턴XCTestSwift Testing
테스트 선언func testXxx()@Test 속성
Suite 그룹XCTestCase 서브클래스@Suite (선택적, @Test 있으면 암시적)
Skip 메커니즘XCTSkip() 런타임@Test(.disabled) 컴파일타임 trait
AssertionXCTAssert*#expect(), #require()
타입 지원클래스만Struct, Actor, Class

영향

  • Alamofire 리포지토리 57개 테스트 미감지
  • iOS/macOS 프로젝트 Swift Testing 채택 증가
  • Apple 공식 권장 테스트 프레임워크

요구사항

  1. @Test@Suite 속성 기반 테스트 감지
  2. @Test(.disabled) trait에서 skip 상태 인식
  3. async 테스트 함수 지원
  4. swiftast 모듈을 통한 XCTest와 AST 유틸리티 공유
  5. 기존 XCTest 감지와의 하위 호환성 유지

결정

Swift Testing을 PrioritySpecialized 감지 우선순위의 별도 프레임워크로 구현.

swifttesting 프레임워크를 xctest와 독립적인 definition으로 등록, swiftast 모듈을 통한 공통 Swift AST 유틸리티 공유.

감지 전략

우선순위 기반 Early-Return (ADR-04):

  1. Import 감지 (최우선): import Testing → Swift Testing 파서 트리거
  2. 속성 감지: @Test, @Suite 존재 확인
  3. 컨텐츠 패턴: #expect(), #require() 보조 신호

파서 구현

go
func NewDefinition() *framework.Definition {
    return &framework.Definition{
        Name:      "swifttesting",
        Languages: []domain.Language{domain.LanguageSwift},
        Matchers: []framework.Matcher{
            matchers.NewImportMatcher("Testing"),
            &SwiftTestingContentMatcher{}, // @Test, @Suite, #expect
        },
        Parser:   &SwiftTestingParser{},
        Priority: framework.PrioritySpecialized, // 200
    }
}

Skip 감지

@Test(.disabled) trait → TestStatusSkipped 매핑:

go
// "@Test(.disabled)" or "@Test(.disabled(\"reason\"))"
if hasDisabledTrait(annotation) {
    return domain.TestStatusSkipped
}

Async 지원

함수 시그니처에서 async 키워드 컨텐츠 스캔:

swift
@Test func fetchData() async throws { ... }

검토된 옵션

옵션 A: 별도 프레임워크 전략 (선택됨)

PrioritySpecialized 우선순위의 독립 swifttesting 프레임워크 정의.

장점:

  • 프레임워크 격리로 독립적 진화 가능
  • import Testing 통한 명확한 감지
  • Swift Testing trait 네이티브 지원 (@Test(.disabled))
  • swiftast 모듈 통한 코드 재사용
  • Unified Framework Definition 패턴 준수 (ADR-06)

단점:

  • Swift 프레임워크 두 개 유지보수 필요
  • 혼합 파일에서 감지 오버랩 가능성

옵션 B: 기존 XCTest 파서 확장

XCTest definition 내 Swift Testing 패턴 추가.

장점:

  • 단일 Swift 프레임워크 정의
  • 공유 유지보수 범위

단점:

  • 단일 책임 원칙 위반
  • 근본적으로 다른 패턴에 대한 복잡한 내부 분기
  • 버그 수정 시 양쪽 프레임워크 영향
  • Apple의 명시적 별도 프레임워크 포지셔닝

옵션 C: 통합 Swift 파서

단일 Swift 파서 + 서브 프레임워크 라우팅.

장점:

  • 최대 코드 공유
  • Swift 단일 진입점

단점:

  • 과잉 일반화 위험
  • 복잡한 내부 라우팅
  • 프레임워크별 엣지 케이스 누출

옵션 D: 패턴 기반 감지만

AST 파싱 없이 정규식 기반 감지.

장점:

  • 경량 구현
  • 빠른 실행

단점:

  • 파라미터화 테스트 이름 추출 불가
  • async 함수 감지 불가
  • 중첩 suite 파싱 불가
  • 프로덕션 정확도 요구사항 충족 불가

결과

긍정적

  1. 프레임워크 격리

    • Swift Testing의 XCTest 독립적 진화
    • 한쪽 파서 업데이트 시 회귀 위험 없음
    • 프레임워크별 명확한 책임
  2. 정확한 감지

    • import Testing → 최고 신뢰도 감지 신호
    • @Test(.disabled) → skip 상태 네이티브 매핑
    • 컨텐츠 스캔 통한 async 함수 감지
  3. 공유 모듈 통한 코드 재사용

    • swiftast 모듈의 공통 AST 유틸리티 제공
    • swiftast 버그 수정 → 양쪽 파서 혜택
    • Shared Parser Modules 패턴 준수 (ADR-08)
  4. 미래 지향 아키텍처

    • 추가 trait 지원 확장 가능 (@Test(.bug()), @Test(.tags()))
    • 파라미터화 테스트 준비 (@Test(arguments:))
    • Apple 프레임워크 방향성 정렬
  5. 기존 ADR과의 일관성

    • Unified Framework Definition (ADR-06)
    • Early-Return Framework Detection (ADR-04)
    • Shared Parser Modules (ADR-08)

부정적

  1. 이중 프레임워크 유지보수

    • Swift용 별도 definition 파일 두 개
    • 완화: 공유 swiftast 모듈로 중복 최소화
  2. 혼합 파일 감지

    • XCTest + Swift Testing 동시 사용 파일 (Apple 지원 시나리오)
    • 완화: PrioritySpecialized로 Swift Testing 우선 감지; 명시적 import 우선
  3. 초기 개발 투자

    • 새 definition.go, matchers, 파서 구현 필요
    • 완화: 기존 swiftast 모듈 활용; 확립된 패턴 준수

참조

Open-source test coverage insights