swift-testing
Swift Testing(@Test,
Install with Codex or Claude Copy this prompt, paste it into Codex, Claude, or another assistant, and let it review the skill page and install it for you.
Menu
Swift Testing(@Test,
Install with Codex or Claude Copy this prompt, paste it into Codex, Claude, or another assistant, and let it review the skill page and install it for you.
Based on SOC occupation classification
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์ ์ฌ์ฉํ์ธ์.