Macro's testen en debuggen
Unittests voor macro-expansies schrijven met assertMacroExpansion.
Macro's testen en debuggen is een gratis Swift Academy-les op CoddyKit. Dit is les 4 van 4. Je kunt 3 lessen uit dit leerpad gratis volledig lezen — daarna ontgrendelt CoddyKit PRO alle lessen, plus praktische oefeningen met een ingebouwde code-editor en een AI-tutor die 24/7 beschikbaar is. Deze les maakt deel uit van het leertraject Swift Academy. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus Swift Academy bevat in totaal 4 lessen.
Waarom macro's testen?
Macro's genereren code tijdens het compileren. Eenheidstests controleren de gegenereerde broncode voordat die productie bereikt.
// The swift-syntax package ships SwiftSyntaxMacrosTestSupport
// with assertMacroExpansion for testing macro outputassertMacroExpansion
assertMacroExpansion ontvangt broncode als invoer en de verwachte uitgebreide broncode, en controleert of ze overeenkomen.
import SwiftSyntaxMacrosTestSupport
import XCTest
final class StringifyMacroTests: XCTestCase {
func testStringify() throws {
assertMacroExpansion(
"#stringify(1 + 2)",
expandedSource: "(1 + 2, \"1 + 2\")",
macros: ["stringify": StringifyMacro.self]
)
}
}Aangehechte macro's testen
Geef de gedecoreerde struct of klasse als invoer en de volledig uitgebreide broncode als verwachte uitvoer.
assertMacroExpansion(
"@AddID struct User { var name: String }",
expandedSource: """
struct User {
var name: String
var id = UUID()
}
""",
macros: ["AddID": AddIDMacro.self]
)Het uitgeven van diagnostiek testen
Controleer of uw macro de juiste diagnostiek, zoals een waarschuwing of fout, uitgeeft wanneer die onjuist wordt gebruikt.
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]
)Macro's uitbreiden in Xcode
Klik in Xcode met de rechtermuisknop op een macroaanroep en kies Macro uitbreiden om de gegenereerde code in de bron te bekijken.
// Before expansion:
let (v, s) = #stringify(1 + 2)
// After:
let (v, s) = (1 + 2, "1 + 2")Fouten opsporen met print in macro's
Gebruik context.diagnose of print naar stderr om tijdens de ontwikkeling de macrologica te debuggen.
// In macro implementation:
print("[StringifyMacro] expanding: \(node.description)", to: &standardError)Breekpunten in macrote|sten
Omdat macro's tijdens tests binnen hetzelfde proces worden uitgevoerd, kunt u tijdens testruns Xcode-breekpunten instellen in macro-implementaties.
// Set a breakpoint in StringifyMacro.expansion()
// Run the test target — breakpoints are hitDe syntaxisboom inspecteren
Gebruik .debugDescription van SwiftSyntax om de volledige syntaxisboom van een invoerknooppunt af te drukken voor foutopsporing.
print(node.debugDescription)
// Prints the full SyntaxTree hierarchyMeerdere argumentvarianten testen
Schrijf voor elke verschillende argumentvorm een afzonderlijke test om ervoor te zorgen dat alle codepaden in de macro worden uitgevoerd.
func testNoArgument() {
assertMacroExpansion(
"#stringify()",
expandedSource: "#stringify()",
diagnostics: [DiagnosticSpec(message: "Need an argument", line: 1, column: 1)],
macros: ["stringify": StringifyMacro.self]
)
}Integratietesten
Voeg een doel voor een testapp toe die de macro daadwerkelijk gebruikt. Controleer de compilatie en het gedrag tijdens de uitvoering.
// In test app:
let (val, src) = #stringify(Date.now)
XCTAssertEqual(src, "Date.now")CI voor macrotesten
Voer macrotesten in CI uit zoals voor elk ander Swift-pakket: swift test in de pakketmap.
// CI command:
swift test --package-path MyMacrosKorte controle
Welke functie controleert in een eenheidstest of een macro wordt uitgebreid tot de verwachte broncode?
Samenvatting van de les
Test macro's met assertMacroExpansion voor correcte uitvoer en met DiagnosticSpec voor foutgevallen. Spoor fouten op met het uitbreidingsvoorbeeld in Xcode en met breekpunten binnen hetzelfde proces tijdens testruns. Voer de tests in CI uit via swift test.
Leer Swift met een AI-tutor — gratis
Schrijf echte code en voer die uit in je browser, krijg direct hulp van een AI-tutor die 24/7 beschikbaar is en ga verder waar je gebleven bent op het web of in de app.
- Cursussen
- 122
- Lessen
- 409
Veelgestelde vragen
Is de les “Macro's testen en debuggen” gratis?
Ja — je kunt hier op het web alle 3 lessen van het leerpad Swift Academy, waaronder “Macro's testen en debuggen”, gratis volledig lezen. Daarna ontgrendelt CoddyKit PRO alle lessen, plus interactieve oefeningen met een ingebouwde code-editor en een AI-tutor die 24/7 beschikbaar is. De cursus Swift Academy bevat in totaal 4 lessen.
Wat leer ik in “Macro's testen en debuggen”?
Unittests voor macro-expansies schrijven met assertMacroExpansion. Je oefent met Swift Academy door code rechtstreeks in de browser uit te voeren. Een AI-begeleider die 24/7 beschikbaar is beantwoordt je vragen terwijl je de les doorwerkt.
Heb ik ervaring nodig om met Swift Academy te beginnen?
Ervaring vooraf is niet nodig. Swift Academy op CoddyKit is opgebouwd voor beginners tot gevorderden, zodat je hier of bij het begin kunt starten en in je eigen tempo kunt leren. Dit is les 4 van 4.
Hoe lang duurt de les “Macro's testen en debuggen”?
De meeste lessen van CoddyKit duren ongeveer 5–10 minuten. Elke les is kort en interactief, zodat je gestaag vooruitgaat en op het web en in de app precies verdergaat waar je was gebleven.
Kan ik code schrijven en uitvoeren in deze les over Swift Academy?
Ja. Elke les over Swift Academy bevat een ingebouwde code-editor, zodat je rechtstreeks in je browser echte code kunt schrijven en uitvoeren en direct feedback van AI krijgt — lokale installatie is niet nodig.
Alle lessen in deze cursus
- Macro-rollen: freestanding versus attached
- Een freestanding expression-macro schrijven
- Attached member-macro's voor minder boilerplate
- Macro's testen en debuggen