0Pricing
Swift Academy · 강의

비동기 코드 테스트(XCTest)

XCTest로 비동기 테스트 를 작성합니다. 테스트를 async 로 표시하고, await 와 throws 를 사용하며, 실패와 시간 초과를 테스트하고 구조적 동시성의 결과를 검증합니다.

비동기 코드 테스트(XCTest)은(는) CoddyKit의 무료 Swift Academy 강의입니다. 이것은 3개 중 3번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Swift Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Swift Academy 강의에는 총 3개의 강의가 포함되어 있습니다.

비동기 테스트: 기초

XCTest는 비동기 테스트를 지원합니다. 테스트는 작고 결정적으로 유지하십시오.

  • async 테스트를 선언하고 await를 사용하십시오.
  • 실패를 처리하려면 throws와 do/catch를 사용하십시오.
  • sleep을 작은 가짜 객체나 스텁으로 대체하십시오.

비동기 성공 사례

테스트를 비동기로 표시하고 await와 함께 SUT를 호출하십시오. XCTAssertEqual과 같은 일반적인 검사를 작성하십시오.

import XCTest
import Foundation

// System Under Test (SUT)
func fetchValue() async -> Int {
    try? await Task.sleep(nanoseconds: 50_000_000)
    return 42
}

final class AsyncBasicsTests: XCTestCase {
    func testFetchValue_returns42() async {
        let v = await fetchValue()
        XCTAssertEqual(v, 42)
    }
}

비동기 오류 처리 및 검사

비동기 오류 처리 테스트를 사용하십시오. 특정 오류의 경우 오류를 catch한 뒤 패턴 매칭하여 의도를 명확하게 유지하십시오.

import XCTest

enum NetError: Error { case offline }

func loadNumber(online: Bool) async throws -> Int {
    try await Task.sleep(nanoseconds: 30_000_000)
    if !online { throw NetError.offline }
    return 7
}

final class AsyncThrowingTests: XCTestCase {
    func testLoadNumber_success() async throws {
        let n = try await loadNumber(online: true)
        XCTAssertEqual(n, 7)
    }

    func testLoadNumber_offline_throws() async {
        do {
            _ = try await loadNumber(online: false)
            XCTFail("Expected error")
        } catch NetError.offline {
            // expected
        } catch {
            XCTFail("Unexpected error: \\(error)")
        }
    }
}

병렬 결과

구조적 동시성은 테스트하기 쉽습니다. async let을 사용하고 최종 결과를 검사하십시오. 불안정한 테스트를 피하려면 지연 시간을 아주 짧게 유지하십시오.

import XCTest

func compute(_ x: Int) async -> Int {
    try? await Task.sleep(nanoseconds: 10_000_000)
    return x * x
}

final class ParallelTests: XCTestCase {
    func testParallel_asyncLet_sumsSquares() async {
        async let a = compute(2)
        async let b = compute(3)
        let sum = await (a + b)
        XCTAssertEqual(sum, 13) // 4 + 9
    }
}

시간 초과 테스트

연산을 짧은 sleep과 경쟁시켜 시간 초과를 테스트하십시오. 테스트를 빠르고 안정적으로 유지하려면 매우 짧은 시간을 사용하십시오.

import XCTest

enum TimeoutError: Error { case timedOut }

func withTimeout<T>(
    seconds: Double,
    operation: @escaping () async throws -> T
) async throws -> T {
    try await withThrowingTaskGroup(of: T.self) { group in
        group.addTask { try await operation() }
        group.addTask {
            try await Task.sleep(nanoseconds: UInt64(seconds * 1_000_000_000))
            throw TimeoutError.timedOut
        }
        let first = try await group.next()!
        group.cancelAll()
        return first
    }
}

final class TimeoutTests: XCTestCase {
    func testTimeout_timesOutFast() async {
        do {
            _ = try await withTimeout(seconds: 0.01) {
                try await Task.sleep(nanoseconds: 50_000_000) // slower than timeout
                return "OK"
            }
            XCTFail("Expected timeout")
        } catch TimeoutError.timedOut {
            // expected
        } catch {
            XCTFail("Unexpected error: \\(error)")
        }
    }
}

기대 조건(기존 방식)

오래된 콜백에는 여전히 기대 조건/대기를 사용하십시오. 새 코드에는 비동기 테스트를 우선하십시오.

import XCTest

// Legacy API with a completion handler
func legacyFetch(_ completion: @escaping (String) -> Void) {
    Task { try? await Task.sleep(nanoseconds: 20_000_000); completion("done") }
}

final class ExpectationTests: XCTestCase {
    func testLegacy_withExpectation() {
        let exp = expectation(description: "legacy finishes")
        legacyFetch { value in
            XCTAssertEqual(value, "done")
            exp.fulfill()
        }
        wait(for: [exp], timeout: 1.0)
    }
}

현대적인 비동기 테스트 방식

간단 확인: 비동기 함수를 테스트하는 모범 사례는 무엇인가요?

요약

요약: await와 함께 async XCTest 메서드를 사용하고, 성공 및 실패 경로를 검사하며, 지연 시간은 짧게 유지하십시오. 기대 조건은 기존 콜백에만 사용하십시오.

자주 묻는 질문

“비동기 코드 테스트(XCTest)” 강의는 무료인가요?

네 — “비동기 코드 테스트(XCTest)” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Swift Academy 강의 전체를 잠금 해제할 수 있습니다. Swift Academy 강의에는 총 3개의 강의가 포함되어 있습니다.

“비동기 코드 테스트(XCTest)”에서 뭘 배우나요?

XCTest로 비동기 테스트 를 작성합니다. 테스트를 async 로 표시하고, await 와 throws 를 사용하며, 실패와 시간 초과를 테스트하고 구조적 동시성의 결과를 검증합니다. 브라우저에서 직접 실행하는 실습 코드로 Swift Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

Swift Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 Swift Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 3개 중 3번째 강의입니다.

“비동기 코드 테스트(XCTest)” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 Swift Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 Swift Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. 생산자/소비자, 파이프라인, 시간 초과
  2. 기존 콜백/Combine을 async/await로 연결하기
  3. 비동기 코드 테스트(XCTest)
← Swift Academy(으)로 돌아가기