Swift Academy · บทเรียน

การทดสอบแบบอะซิงโครนัสและการวัดประสิทธิภาพ

ทดสอบฟังก์ชันแบบอะซิงโครนัสด้วย async/await และวัดผลด้วย XCTMeasureOptions

บทเรียน 4 จาก 413 ขั้นตอน

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

การทดสอบฟังก์ชันแบบอะซิงโครนัส

ประกาศเมธอดการทดสอบเป็น async throws เพื่อใช้ await ได้โดยตรงภายในเนื้อหาการทดสอบโดยไม่ต้องเขียนโค้ดประกอบเพิ่มเติม

final class FetcherTests: XCTestCase {
  func testFetchReturnsUser() async throws {
    let user = try await UserService().fetchUser(id: 1)
    XCTAssertEqual(user.name, "Alice")
  }
}

setUp และ tearDown แบบอะซิงโครนัส

เขียนทับ setUp() async throws เพื่อดำเนินการเริ่มต้นแบบอะซิงโครนัสก่อนการทดสอบแต่ละครั้ง

override func setUp() async throws {
  try await super.setUp()
  sut = await AsyncService.make()
}

XCTestExpectation สำหรับ API แบบเรียกกลับ

สำหรับ API ที่ใช้การเรียกกลับแทน async/await ให้ใช้ XCTestExpectation และ wait(for:timeout:)

func testCallback() {
  let exp = expectation(description: "data received")
  service.fetchWithCallback { data in
    XCTAssertNotNil(data)
    exp.fulfill()
  }
  wait(for: [exp], timeout: 5.0)
}

การกลับด้านความคาดหวัง

ความคาดหวังแบบกลับด้านจะล้มเหลวหาก IS ได้รับการตอบสนอง เหมาะสำหรับยืนยันว่าการเรียกกลับไม่ได้ถูกเรียก

let noCall = expectation(description: "should not fire")
noCall.isInverted = true
cancelledTask.onComplete { noCall.fulfill() }
wait(for: [noCall], timeout: 1.0)

XCTMeasure สำหรับการวัดประสิทธิภาพ

measure {} เรียกใช้บล็อก 10 ครั้ง และรายงานเวลาเฉลี่ย ส่วนเบี่ยงเบนมาตรฐาน และการเปรียบเทียบกับค่าฐาน

func testSortPerformance() {
  let data = Array(0..<10_000).shuffled()
  measure {
    _ = data.sorted()
  }
}

XCTMeasureOptions

กำหนดจำนวนรอบและเมตริกที่ต้องการวัด เช่น เวลา หน่วยความจำ หรือ CPU

func testParsePerformance() {
  let options = XCTMeasureOptions()
  options.iterationCount = 5
  measure(options: options) {
    _ = try? JSONDecoder().decode([Item].self, from: largeJSON)
  }
}

การวัดประสิทธิภาพแบบอะซิงโครนัส

ใช้ measure(metrics:options:block:) พร้อมบล็อกแบบอะซิงโครนัสเพื่อวัดการทำงานแบบอะซิงโครนัส

func testAsyncFetchPerformance() {
  measure {
    let exp = expectation(description: "done")
    Task {
      _ = try? await service.fetchAll()
      exp.fulfill()
    }
    wait(for: [exp], timeout: 10)
  }
}

ค่าฐาน

หลังจากเรียกใช้การทดสอบการวัดแล้ว ให้ตั้งค่าฐานใน Xcode การเรียกใช้ในอนาคตจะล้มเหลวหากประสิทธิภาพถดถอยเกินเกณฑ์

// Xcode: click the grey icon next to the measure test
// → "Set Baseline" to record the current average
// Subsequent runs compare against the baseline

การทดสอบโค้ดที่แยกตามแอ็กเตอร์

เข้าถึงสถานะที่แยกตามแอ็กเตอร์จากการทดสอบโดยใช้ await

actor Counter { var value = 0; func increment() { value += 1 } }
final class CounterTests: XCTestCase {
  func testIncrement() async {
    let counter = Counter()
    await counter.increment()
    let val = await counter.value
    XCTAssertEqual(val, 1)
  }
}

เฟรมเวิร์ก Swift Testing (Swift 6)

Swift 6 มาพร้อมเฟรมเวิร์กใหม่ชื่อ Testing ซึ่งมี @Test, #expect และ @Suite เป็นทางเลือกสมัยใหม่แทน XCTest

import Testing

@Suite struct MathTests {
  @Test func addition() {
    #expect(2 + 2 == 4)
  }
}

การผสาน XCTest กับ Swift Testing

ทั้งสองเฟรมเวิร์กสามารถทำงานร่วมกันในเป้าหมายการทดสอบเดียวกันระหว่างการย้ายจาก XCTest ไปยัง Swift Testing

import XCTest
import Testing
// Legacy XCTestCase tests alongside @Test functions
// Both run when the test target is executed

ตรวจสอบอย่างรวดเร็ว

API ใดของ XCTest ที่ใช้วัดประสิทธิภาพของบล็อกโค้ดและเปรียบเทียบกับค่าฐานที่บันทึกไว้

สรุปบทเรียน

กำหนดเมธอดการทดสอบเป็น async throws เพื่อใช้ await ได้โดยตรง ใช้ XCTestExpectation กับส่วนติดต่อโปรแกรมประยุกต์แบบเรียกกลับ วัดประสิทธิภาพด้วย measure {} และกำหนดค่าเส้นฐานเพื่อตรวจจับการถดถอย ทดสอบแอ็กเตอร์ด้วย await สำรวจ @Test และ #expect ของการทดสอบสวิฟต์สำหรับการทดสอบสมัยใหม่

เริ่มต้นได้ฟรี

เรียนรู้ Swift ด้วย AI tutor — ฟรี

เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป

คอร์ส
122
บทเรียน
409

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

บทเรียน “การทดสอบแบบอะซิงโครนัสและการวัดประสิทธิภาพ” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “การทดสอบแบบอะซิงโครนัสและการวัดประสิทธิภาพ”

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

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

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

บทเรียน “การทดสอบแบบอะซิงโครนัสและการวัดประสิทธิภาพ” ใช้เวลานานแค่ไหน

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

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

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

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

  1. การตั้งค่า การล้างข้อมูล และเมธอดการทดสอบของ XCTestCase
  2. กลุ่มคำยืนยัน XCTAssert และคำยืนยันที่โยนข้อผิดพลาด
  3. การจำลองตามโพรโทคอลและการฉีกการพึ่งพา
  4. การทดสอบแบบอะซิงโครนัสและการวัดประสิทธิภาพ
← กลับไปที่ Swift Academy