swift-testing
Swift Testing(@Test,
التثبيت باستخدام Codex أو Claude انسخ هذا Prompt والصقه في Codex أو Claude أو مساعد آخر ليراجع صفحة Skill ويثبّتها لك.
القائمة
Swift Testing(@Test,
التثبيت باستخدام Codex أو Claude انسخ هذا Prompt والصقه في Codex أو Claude أو مساعد آخر ليراجع صفحة Skill ويثبّتها لك.
استنادا إلى تصنيف SOC المهني
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을 사용할 때 사용합니다.
| 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을 사용하세요.