การทดสอบและแก้จุดบกพร่องมาโคร
เขียนการทดสอบหน่วยสำหรับการขยายมาโครด้วย 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 outputassertMacroExpansion
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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- บทบาทของมาโคร: แบบอิสระและแบบแนบ
- เขียนมาโครนิพจน์แบบอิสระ
- มาโครสมาชิกแบบแนบเพื่อลดโค้ดสำเร็จรูป
- การทดสอบและแก้จุดบกพร่องมาโคร