swift-testing
Swift Testing(@Test,
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
メニュー
Swift Testing(@Test,
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
TCA(The Composable Architecture)로 Feature를 구축하거나 reducer 구조화, state 관리, effect·navigation 처리, TCA feature 테스트를 할 때 사용합니다. @Reducer, Store, Effect, TestStore, reducer 조합 패턴을 다룹니다.
iOS 17+ SwiftUI patterns를 구현할 때 사용합니다: @Observable/@Bindable, MVVM architecture, NavigationStack, lazy loading, UIKit interop, accessibility (VoiceOver), 비동기 작업(.task/.refreshable), 또는 ObservableObject/@StateObject에서 마이그레이션하는 경우.
구현한 화면의 스크린샷·UI hierarchy를 Zeplin 시안 스펙과 항목별로 대조해 PASS/DIFF를 보고합니다.
SwiftUI 코드를 리뷰·정리하거나 soft-deprecated API를 점검할 때 사용합니다. view 구조 분리, dataflow/environment 검토, ForEach identity, localization, deprecation 마이그레이션을 다룹니다. (신규 구현 패턴은 swiftui-patterns 스킬 사용)
device 또는 simulator에서 스크린샷, UI hierarchy, 터치 interaction을 통해 iOS 앱 동작을 확인합니다.
async/await 코드를 작성하거나, strict concurrency를 활성화하거나, Sendable 오류를 수정하거나, completion handler로부터 마이그레이션하거나, actor로 공유 상태를 관리하거나, 동시성을 위해 Task/TaskGroup을 사용할 때 사용합니다.
SOC 職業分類に基づく
| name | swift-testing |
| description | Swift Testing(@Test, |
Swift Testing framework를 사용하는 최신 테스트 방식입니다. XCTest는 없습니다.
Swift Testing은 XCTest를 더 간결하고 async 지원이 뛰어나며 기본적으로 테스트를 parallel로 실행하는 최신 macro 기반 접근 방식으로 대체합니다. 핵심 원칙: XCTest를 배웠다면 그것을 잊으십시오—Swift Testing은 다르게 동작합니다.
| Macro | 용도 |
|---|---|
#expect(expression) | 느슨한 검사 — 실패해도 계속 진행됩니다. 대부분의 assertion에 사용합니다. |
#require(expression) | 엄격한 검사 — 실패 시 테스트가 중단됩니다. 사전 조건에만 사용합니다. |
let user = try #require(await fetchUser(id: "123"))
#expect(user.id == "123")
import Testing
@testable import YourModule
@Suite
struct FeatureTests {
let sut: FeatureType
init() throws {
sut = FeatureType()
}
@Test("Description of behavior")
func testBehavior() {
#expect(sut.someProperty == expected)
}
}
| XCTest | Swift Testing |
|---|---|
XCTAssert(expr) | #expect(expr) |
XCTAssertEqual(a, b) | #expect(a == b) |
XCTAssertNil(a) | #expect(a == nil) |
XCTAssertNotNil(a) | #expect(a != nil) |
try XCTUnwrap(a) | try #require(a) |
XCTAssertThrowsError | #expect(throws: ErrorType.self) { } |
XCTAssertNoThrow | #expect(throws: Never.self) { } |
#expect(throws: (any Error).self) { try riskyOperation() }
#expect(throws: NetworkError.self) { try fetch() }
#expect(throws: NetworkError.timeout) { try fetch() }
#expect(throws: Never.self) { try safeOperation() }
@Test("Validates inputs", arguments: zip(
["a", "b", "c"],
[1, 2, 3]
))
func testInputs(input: String, expected: Int) {
#expect(process(input) == expected)
}
경고: zip 없이 여러 컬렉션을 사용하면 Cartesian product가 생성됩니다.
@Test func testAsync() async throws {
let result = try await fetchData()
#expect(!result.isEmpty)
}
@Test func testCallback() async {
await confirmation("callback received") { confirm in
let sut = SomeType { confirm() }
sut.triggerCallback()
}
}
extension Tag {
@Tag static var fast: Self
@Tag static var networking: Self
}
@Test(.tags(.fast, .networking))
func testNetworkCall() { }
#require 과도한 사용 — 대부분의 검사에는 #expect를 사용zip 사용.serialized를 사용하지 않음 — thread에 안전하지 않은 legacy 테스트에 적용#require 과도한 사용 — #require는 사전 조건에만 사용해야 합니다. 일반 assertion에 사용하면 모든 실패를 보고하는 대신 첫 번째 실패에서 테스트가 중단됩니다. assertion에는 #expect를 사용하고, 이후 assertion이 해당 값에 의존할 때만 #require를 사용하세요.
Cartesian product 버그 — @Test(arguments: [a, b], [c, d])는 2개가 아니라 4개의 조합을 생성합니다. argument를 올바르게 짝짓기 위해 항상 zip을 사용하세요: arguments: zip([a, b], [c, d]).
State isolation을 잊음 — Swift Testing은 테스트 method마다 새로운 테스트 instance를 생성합니다. 하지만 테스트 간 공유 state(정적 변수, singleton)는 여전히 leak됩니다. dependency injection을 사용하거나 테스트 사이에 singleton을 정리하세요.
Parallel 테스트 충돌 — Swift Testing은 기본적으로 테스트를 parallel로 실행합니다. 공유 파일, 데이터베이스, singleton을 다루는 테스트는 서로 간섭합니다. .serialized 또는 isolation 전략을 사용하세요.
async를 자연스럽게 사용하지 않음 — async 작업을 Task { }로 감싸면 목적이 무의미해집니다. 테스트 함수 시그니처에서 async/await를 직접 사용하세요: @Test func testAsync() async throws { }.
Confirmation 오용 — confirmation은 callback이 호출되었는지 검증하기 위한 것입니다. assertion 용도로 사용하는 것은 잘못되었습니다. assertion에는 #expect를, callback 횟수에는 confirmation을 사용하세요.