0Pricing
Swift Academy · บทเรียน

การทดสอบโค้ด async (XCTest)

เขียน การทดสอบแบบ async ด้วย XCTest: กำกับการทดสอบด้วย async ใช้ await และ throws ทดสอบความล้มเหลวและการหมดเวลา และตรวจยืนยันผลลัพธ์ของการทำงานพร้อมกันแบบมีโครงสร้าง

การทดสอบโค้ด async (XCTest) เป็นบทเรียน Swift Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 3 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Swift Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Swift Academy มีบทเรียนทั้งหมด 3 บทเรียน

พื้นฐานการทดสอบแบบอะซิงโครนัส

เอ็กซ์ซีเทสต์รองรับการทดสอบแบบอะซิงโครนัส ควรทำการทดสอบให้เล็กและให้ผลแน่นอน:

  • ประกาศการทดสอบแบบ async และใช้การรอ
  • ใช้การโยนข้อผิดพลาดและ do/catch สำหรับกรณีล้มเหลว
  • แทนที่การหยุดรอด้วยตัวจำลองหรือตัวแทนขนาดเล็ก

กรณีสำเร็จแบบอะซิงโครนัส

กำหนดการทดสอบให้เป็นแบบอะซิงโครนัส และเรียก 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)
    }
}

การทดสอบแบบอะซิงโครนัสที่โยนข้อผิดพลาดและการตรวจสอบ

ใช้การทดสอบแบบอะซิงโครนัสที่โยนข้อผิดพลาด สำหรับข้อผิดพลาดที่เจาะจง ให้ดักจับและจับคู่รูปแบบเพื่อให้เจตนาชัดเจน

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)")
        }
    }
}

ผลลัพธ์แบบขนาน

การทำงานพร้อมกันแบบมีโครงสร้างทดสอบได้ง่าย ใช้การประกาศงานแบบอะซิงโครนัสด้วย 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
    }
}

การทดสอบการหมดเวลา

ทดสอบการหมดเวลาโดยให้การทำงานแข่งกับการหยุดรอสั้น ๆ ใช้ระยะเวลาที่สั้นมากเพื่อให้การทดสอบรวดเร็วและเสถียร

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)
    }
}

รูปแบบการทดสอบอะซิงโครนัสสมัยใหม่

ตรวจสอบสั้น ๆ: แนวทางปฏิบัติที่ดีที่สุดในการทดสอบฟังก์ชันแบบอะซิงโครนัสคืออะไร

สรุปทบทวน

สรุปทบทวน: ใช้เมธอดเอ็กซ์ซีเทสต์แบบอะซิงโครนัสร่วมกับการรอ ตรวจสอบทั้งเส้นทางสำเร็จและล้มเหลว กำหนดความล่าช้าให้สั้นมาก และสงวนการคาดหมายไว้สำหรับการเรียกกลับแบบเดิม

คำถามที่พบบ่อย

บทเรียน “การทดสอบโค้ด async (XCTest)” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “การทดสอบโค้ด async (XCTest)” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Swift Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Swift Academy มีบทเรียนทั้งหมด 3 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “การทดสอบโค้ด async (XCTest)”

เขียน การทดสอบแบบ async ด้วย XCTest: กำกับการทดสอบด้วย async ใช้ await และ throws ทดสอบความล้มเหลวและการหมดเวลา และตรวจยืนยันผลลัพธ์ของการทำงานพร้อมกันแบบมีโครงสร้าง คุณปฏิบัติ Swift Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Swift Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Swift Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 3 บทเรียน

บทเรียน “การทดสอบโค้ด async (XCTest)” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Swift Academy นี้ได้ไหม

ได้ บทเรียน Swift Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. ผู้ผลิต/ผู้บริโภค สายงาน และการหมดเวลา
  2. การเชื่อมโค้ดเรียกกลับเดิม/Combine เข้ากับ async/await
  3. การทดสอบโค้ด async (XCTest)
← กลับไปที่ Swift Academy