การทดสอบโค้ด 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- ผู้ผลิต/ผู้บริโภค สายงาน และการหมดเวลา
- การเชื่อมโค้ดเรียกกลับเดิม/Combine เข้ากับ async/await
- การทดสอบโค้ด async (XCTest)