Swift Academy · leksjon

Testing og feilsøking av makroer

Skriv enhetstester for makroutvidelser med assertMacroExpansion.

Leksjon 4 av 413 trinn

Testing og feilsøking av makroer er en gratis leksjon i Swift Academy på CoddyKit. Dette er leksjon 4 av 4. Du kan lese valgfritt 3 leksjoner fra denne læringsstien gratis i sin helhet – deretter låser CoddyKit PRO opp alle leksjoner, samt praktisk øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i Swift Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i Swift Academy inneholder totalt 4 leksjoner.

Hvorfor teste makroer?

Makroer genererer kode ved kompilering. Enhetstester verifiserer den genererte kildekoden før den når produksjon.

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

assertMacroExpansion

assertMacroExpansion tar inn kildekode og forventet utvidet kildekode og kontrollerer at de samsvarer.

import SwiftSyntaxMacrosTestSupport
import XCTest

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

Teste tilknyttede makroer

Gi den dekorerte struct-en eller klassen som inndata, og den fullstendig utvidede kildekoden som forventet resultat.

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

Teste diagnostikk

Kontroller at makroen sender ut riktig diagnostikk, for eksempel en advarsel eller feil, når den brukes på feil måte.

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]
)

Utvide makroer i Xcode

I Xcode høyreklikker du på et makrokall og velger Utvid makro for å inspisere den genererte koden direkte i kildekoden.

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

Feilsøking med print i makroer

Bruk context.diagnose eller print til stderr for å feilsøke makrologikk under utvikling.

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

Brytepunkter i makrotester

Fordi makroer kjører i samme prosess under tester, kan du sette Xcode-brytepunkter i makroimplementasjonene mens testene kjører.

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

Inspeksjon av syntakstreet

Bruk SwiftSyntax' .debugDescription til å skrive ut hele syntakstreet for en inndatanode under feilsøking.

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

Teste flere argumentvarianter

Skriv én test for hver distinkte argumentform for å sikre at alle kodebaner i makroen blir testet.

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

Integrasjonstesting

Legg til et testappmål som faktisk bruker makroen. Bekreft kompilering og kjøreatferd.

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

CI for makrotester

Kjør makrotester i CI på samme måte som for alle andre Swift-pakker: swift test i pakkekatalogen.

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

Kort kontroll

Hvilken funksjon kontrollerer at en makro utvides til den forventede kildekoden i en enhetstest?

Oppsummering av leksjonen

Test makroer med assertMacroExpansion for å kontrollere riktig resultat, og med DiagnosticSpec for feilsituasjoner. Feilsøk med forhåndsvisning av utvidelser i Xcode og brytepunkter i samme prosess under testkjøringer. Kjør testene via swift test i CI.

Gratis å komme i gang

Lær deg Swift med en AI-veileder – gratis

Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.

Kurs
122
Leksjoner
409

Ofte stilte spørsmål

Er leksjonen «Testing og feilsøking av makroer» gratis?

Ja – du kan lese valgfritt 3 av leksjonene i læringsstien Swift Academy, inkludert «Testing og feilsøking av makroer», gratis i sin helhet her på nettet. Deretter låser CoddyKit PRO opp alle leksjoner, samt interaktiv øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Kurset i Swift Academy inneholder totalt 4 leksjoner.

Hva lærer jeg i «Testing og feilsøking av makroer»?

Skriv enhetstester for makroutvidelser med assertMacroExpansion. Du øver på Swift Academy med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.

Trenger jeg erfaring for å begynne med Swift Academy?

Ingen tidligere erfaring er nødvendig. Swift Academy på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 4 av 4.

Hvor lang tid tar leksjonen «Testing og feilsøking av makroer»?

De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.

Kan jeg skrive og kjøre kode i denne Swift Academy-leksjonen?

Ja. Alle Swift Academy-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.

Alle leksjonene i dette kurset

  1. Makroroller: frittstående kontra tilknyttede
  2. Skriv en frittstående uttrykksmakro
  3. Tilknyttede medlemsmakroer for mindre boilerplate
  4. Testing og feilsøking av makroer
← Tilbake til Swift Academy