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

การทดสอบและแก้จุดบกพร่องมาโคร

เขียนการทดสอบหน่วยสำหรับการขยายมาโครด้วย assertMacroExpansion

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

เหตุใดจึงต้องทดสอบมาโคร

มาโครสร้างโค้ดขณะคอมไพล์ การทดสอบหน่วยช่วยตรวจสอบซอร์สโค้ดที่สร้างขึ้นก่อนนำไปใช้ในระบบจริง

// The swift-syntax package ships SwiftSyntaxMacrosTestSupport
// with assertMacroExpansion for testing macro output

assertMacroExpansion

assertMacroExpansion รับซอร์สโค้ดขาเข้าและซอร์สโค้ดที่ขยายแล้วตามที่คาดหมาย จากนั้นตรวจสอบว่าทั้งสองตรงกัน

import SwiftSyntaxMacrosTestSupport
import XCTest

final class StringifyMacroTests: XCTestCase {
  func testStringify() throws {
    assertMacroExpansion(
      "#stringify(1 + 2)",
      expandedSource: "(1 + 2, \"1 + 2\")",
      macros: ["stringify": StringifyMacro.self]
    )
  }
}

การทดสอบมาโครแบบแนบ

ส่งโครงสร้างหรือคลาสที่นำมาโครไปใช้เป็นข้อมูลขาเข้า และส่งซอร์สโค้ดที่ขยายอย่างสมบูรณ์เป็นผลลัพธ์ที่คาดหมาย

assertMacroExpansion(
  "@AddID struct User { var name: String }",
  expandedSource: """
  struct User {
    var name: String
    var id = UUID()
  }
  """,
  macros: ["AddID": AddIDMacro.self]
)

การทดสอบการส่งข้อความวินิจฉัย

ตรวจสอบว่ามาโครส่งข้อความวินิจฉัยที่ถูกต้อง เช่น คำเตือนหรือข้อผิดพลาด เมื่อมีการใช้งานไม่ถูกต้อง

assertMacroExpansion(
  "@AddID class Foo {}",
  expandedSource: "class Foo {}",
  diagnostics: [
    DiagnosticSpec(message: "@AddID can only be applied to structs", line: 1, column: 1)
  ],
  macros: ["AddID": AddIDMacro.self]
)

การขยายมาโครใน Xcode

ใน Xcode ให้คลิกขวาที่การเรียกใช้มาโคร แล้วเลือก ขยายมาโคร เพื่อตรวจสอบโค้ดที่สร้างขึ้นภายในซอร์สโค้ด

// Before expansion:
let (v, s) = #stringify(1 + 2)
// After:
let (v, s) = (1 + 2, "1 + 2")

การแก้จุดบกพร่องด้วย print ในมาโคร

ใช้ context.diagnose หรือ print ไปยังข้อผิดพลาดมาตรฐานเพื่อแก้จุดบกพร่องตรรกะของมาโครระหว่างการพัฒนา

// In macro implementation:
print("[StringifyMacro] expanding: \(node.description)", to: &standardError)

จุดหยุดการทำงานในการทดสอบมาโคร

เนื่องจากมาโครทำงานอยู่ในกระบวนการเดียวกันระหว่างการทดสอบ คุณจึงสามารถตั้งจุดหยุดการทำงานใน Xcode ภายในการนำมาโครไปใช้งานได้ขณะเรียกใช้การทดสอบ

// Set a breakpoint in StringifyMacro.expansion()
// Run the test target — breakpoints are hit

การตรวจสอบต้นไม้ไวยากรณ์

ใช้ .debugDescription ของ SwiftSyntax เพื่อพิมพ์ต้นไม้ไวยากรณ์ทั้งหมดของโหนดขาเข้าสำหรับการแก้จุดบกพร่อง

print(node.debugDescription)
// Prints the full SyntaxTree hierarchy

การทดสอบรูปแบบอาร์กิวเมนต์หลายแบบ

เขียนการทดสอบหนึ่งรายการต่อรูปแบบอาร์กิวเมนต์ที่แตกต่างกัน เพื่อให้แน่ใจว่าเส้นทางการทำงานทั้งหมดในมาโครได้รับการทดสอบ

func testNoArgument() {
  assertMacroExpansion(
    "#stringify()",
    expandedSource: "#stringify()",
    diagnostics: [DiagnosticSpec(message: "Need an argument", line: 1, column: 1)],
    macros: ["stringify": StringifyMacro.self]
  )
}

การทดสอบการทำงานร่วมกัน

เพิ่มเป้าหมายแอปทดสอบที่ใช้งานมาโครจริง ตรวจสอบทั้งการคอมไพล์และพฤติกรรมขณะทำงาน

// In test app:
let (val, src) = #stringify(Date.now)
XCTAssertEqual(src, "Date.now")

การผสานรวมอย่างต่อเนื่องสำหรับการทดสอบมาโคร

เรียกใช้การทดสอบมาโครในระบบผสานรวมอย่างต่อเนื่องเช่นเดียวกับแพ็กเกจ Swift อื่น ๆ โดยใช้ swift test ในไดเรกทอรีของแพ็กเกจ

// CI command:
swift test --package-path MyMacros

ตรวจสอบความเข้าใจ

ฟังก์ชันใดใช้ตรวจสอบว่ามาโครขยายเป็นซอร์สโค้ดตามที่คาดหมายในการทดสอบหน่วย

ทบทวนบทเรียน

ทดสอบมาโครด้วย assertMacroExpansion เพื่อตรวจสอบผลลัพธ์ที่ถูกต้อง และใช้ DiagnosticSpec สำหรับกรณีข้อผิดพลาด แก้จุดบกพร่องด้วยหน้าต่างแสดงตัวอย่างการขยายใน Xcode และจุดหยุดการทำงานภายในกระบวนการเดียวกันระหว่างการทดสอบ เรียกใช้ผ่าน swift test ในระบบผสานรวมอย่างต่อเนื่อง

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

บทเรียน “การทดสอบและแก้จุดบกพร่องมาโคร” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “การทดสอบและแก้จุดบกพร่องมาโคร”

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

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

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

บทเรียน “การทดสอบและแก้จุดบกพร่องมาโคร” ใช้เวลานานแค่ไหน

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

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

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

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

  1. บทบาทของมาโคร: แบบอิสระและแบบแนบ
  2. เขียนมาโครนิพจน์แบบอิสระ
  3. มาโครสมาชิกแบบแนบเพื่อลดโค้ดสำเร็จรูป
  4. การทดสอบและแก้จุดบกพร่องมาโคร
← กลับไปที่ Swift Academy