Makros testen und debuggen
Schreiben Sie Unit-Tests für Makroexpansionen mit assertMacroExpansion.
Makros testen und debuggen ist eine kostenlose Swift Academy-Lektion auf CoddyKit. Dies ist Lektion 4 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Swift Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Swift Academy-Kurs umfasst insgesamt 4 Lektionen.
Warum Makros testen?
Makros erzeugen Code zur Compile-Zeit. Unit-Tests überprüfen den erzeugten Quelltext, bevor er die Produktion erreicht.
// The swift-syntax package ships SwiftSyntaxMacrosTestSupport
// with assertMacroExpansion for testing macro outputassertMacroExpansion
assertMacroExpansion übernimmt Quelltext als Eingabe und erwarteten erweiterten Quelltext und überprüft, ob beide übereinstimmen.
import SwiftSyntaxMacrosTestSupport
import XCTest
final class StringifyMacroTests: XCTestCase {
func testStringify() throws {
assertMacroExpansion(
"#stringify(1 + 2)",
expandedSource: "(1 + 2, \"1 + 2\")",
macros: ["stringify": StringifyMacro.self]
)
}
}Angehängte Makros testen
Übergeben Sie die dekorierte struct oder class als Eingabe und den vollständig erweiterten Quelltext als erwartete Ausgabe.
assertMacroExpansion(
"@AddID struct User { var name: String }",
expandedSource: """
struct User {
var name: String
var id = UUID()
}
""",
macros: ["AddID": AddIDMacro.self]
)Diagnoseausgabe testen
Überprüfen Sie, ob Ihr Makro bei falscher Verwendung die richtige Diagnose (Warnung oder Fehler) ausgibt.
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]
)Makros in Xcode erweitern
Klicken Sie in Xcode mit der rechten Maustaste auf einen Makroaufruf und wählen Sie Makro erweitern, um den erzeugten Code direkt im Quelltext zu untersuchen.
// Before expansion:
let (v, s) = #stringify(1 + 2)
// After:
let (v, s) = (1 + 2, "1 + 2")Mit print in Makros debuggen
Verwenden Sie context.diagnose oder print für die Ausgabe nach stderr, um die Makrologik während der Entwicklung zu debuggen.
// In macro implementation:
print("[StringifyMacro] expanding: \(node.description)", to: &standardError)Breakpoints in Makrotests
Da Makros während der Tests im selben Prozess ausgeführt werden, können Sie während der Testläufe Xcode-Breakpoints in Makroimplementierungen setzen.
// Set a breakpoint in StringifyMacro.expansion()
// Run the test target — breakpoints are hitSyntaxbaum untersuchen
Verwenden Sie .debugDescription von SwiftSyntax, um den vollständigen Syntaxbaum eines Eingabeknotens zu Debugging-Zwecken auszugeben.
print(node.debugDescription)
// Prints the full SyntaxTree hierarchyMehrere Argumentvarianten testen
Schreiben Sie für jede unterschiedliche Argumentform einen Test, um sicherzustellen, dass alle Codepfade im Makro ausgeführt werden.
func testNoArgument() {
assertMacroExpansion(
"#stringify()",
expandedSource: "#stringify()",
diagnostics: [DiagnosticSpec(message: "Need an argument", line: 1, column: 1)],
macros: ["stringify": StringifyMacro.self]
)
}Integrationstests
Fügen Sie ein Test-App-Target hinzu, das das Makro tatsächlich verwendet. Bestätigen Sie die Kompilierung und das Verhalten zur Laufzeit.
// In test app:
let (val, src) = #stringify(Date.now)
XCTAssertEqual(src, "Date.now")CI für Makrotests
Führen Sie Makrotests in der CI wie jedes andere Swift-Package aus: swift test im Package-Verzeichnis.
// CI command:
swift test --package-path MyMacrosSchnelltest
Welche Funktion überprüft in einem Unit-Test, ob ein Makro den erwarteten Quelltext erzeugt?
Zusammenfassung der Lektion
Testen Sie Makros mit assertMacroExpansion auf korrekte Ausgaben und mit DiagnosticSpec auf Fehlerfälle. Debuggen Sie mit der Erweiterungsvorschau von Xcode und In-Process-Breakpoints während der Testläufe. Führen Sie die Tests in der CI mit swift test aus.
Häufig gestellte Fragen
Ist die Lektion „Makros testen und debuggen“ kostenlos?
Ja — der vollständige Text von „Makros testen und debuggen“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Swift Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Swift Academy-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „Makros testen und debuggen“?
Schreiben Sie Unit-Tests für Makroexpansionen mit assertMacroExpansion. Du übst Swift Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um Swift Academy zu starten?
Keine Vorkenntnisse erforderlich. Swift Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 4 von 4.
Wie lange dauert die Lektion „Makros testen und debuggen“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser Swift Academy-Lektion Code schreiben und ausführen?
Ja. Jede Swift Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- Makrorollen: Freestanding vs. Attached
- Ein freistehendes Expression-Makro schreiben
- Attached-Member-Makros zur Reduzierung von Boilerplate
- Makros testen und debuggen