Swift Testing #1: XCTest 테스트 스위트를 Swift Testing으로 마이그레이션

발행: (2025년 12월 5일 오전 06:54 GMT+9)
4 min read
원문: Dev.to

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 의존성을 제거합니다:

  1. 의존성 제거: OnlineStoreMV > Project > Package Dependencyswift-testing 삭제.
  2. 빌드: 빌드 시 “unable to find module dependency _TestingInternals” 오류가 발생합니다.
  3. 해결 방법: 프로젝트를 정리(⌘⇧K)한 뒤 다시 빌드합니다.

XCTAssert@Test의 상호 운용성

XCTAssertXCTestCase를 상속받은 클래스 내부에서만 동작합니다. 이는 XCTestRunXCTestSuite 안에서 실행하기 때문이며, @Test가 붙은 메서드 안에서 XCTAssert를 사용하면 테스트 실패가 기록되지 않습니다.

import XCTest
import Testing

struct MyTests {
    @Test
    func something() {
        XCTAssert(2 == 3)   // 작동하지 않음: 테스트가 통과합니다.
        #expect(2 == 3)     // 올바른 사용: 테스트가 실패합니다.
    }
}

하지만 @Test가 붙은 테스트에 XCTAssert만 포함되어 있더라도 Swift Testing 러너가 해당 테스트를 인식하지만, 실패는 제대로 기록되지 않습니다.

참고 문헌

Back to Blog

관련 글

더 보기 »