0Pricing
Swift Academy · Lekcja

Testowanie i debugowanie makr

Pisanie testów jednostkowych dla rozwinięć makr za pomocą assertMacroExpansion.

Testowanie i debugowanie makr to bezpłatna lekcja Swift Academy na CoddyKit. To lekcja 4 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Swift Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Swift Academy zawiera 4 lekcji w sumie.

Dlaczego testować makra?

Makra generują kod podczas kompilacji. Testy jednostkowe sprawdzają wygenerowany kod źródłowy, zanim trafi on do środowiska produkcyjnego.

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

assertMacroExpansion

assertMacroExpansion przyjmuje kod źródłowy wejściowy i oczekiwany kod po rozwinięciu, a następnie sprawdza, czy są zgodne.

import SwiftSyntaxMacrosTestSupport
import XCTest

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

Testowanie makr dołączanych

Należy przekazać ozdobioną strukturę lub klasę jako dane wejściowe, a w pełni rozwinięty kod źródłowy jako oczekiwany wynik.

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

Testowanie generowania diagnostyki

Należy sprawdzić, czy makro generuje właściwy komunikat diagnostyczny (ostrzeżenie lub błąd), gdy jest używane nieprawidłowo.

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

Rozwijanie makr w Xcode

W Xcode kliknij prawym przyciskiem myszy wywołanie makra i wybierz Expand Macro, aby wyświetlić wygenerowany kod bezpośrednio w edytorze.

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

Debugowanie makr za pomocą print

Podczas tworzenia makra należy używać context.diagnose lub print do wyświetlania danych na stderr i debugowania jego działania.

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

Punkty przerwania w testach makr

Ponieważ makra działają w tym samym procesie co testy, podczas ich uruchamiania można ustawiać punkty przerwania Xcode wewnątrz implementacji makr.

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

Inspekcja drzewa składniowego

Użyj .debugDescription z SwiftSyntax, aby na potrzeby debugowania wyświetlić pełne drzewo składniowe węzła wejściowego.

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

Testowanie wielu wariantów argumentów

Należy napisać osobny test dla każdej odmiennej struktury argumentów, aby upewnić się, że wszystkie ścieżki kodu w makrze są testowane.

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

Testy integracyjne

Należy dodać target aplikacji testowej, który faktycznie używa makra. Trzeba potwierdzić poprawną kompilację i działanie w czasie wykonywania.

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

CI dla testów makr

Testy makr należy uruchamiać w CI tak jak każdy inny pakiet Swift: za pomocą swift test w katalogu pakietu.

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

Szybkie sprawdzenie

Jaka funkcja sprawdza w teście jednostkowym, czy makro rozwija się do oczekiwanego kodu źródłowego?

Podsumowanie lekcji

Makra należy testować za pomocą assertMacroExpansion pod kątem poprawnego wyniku oraz DiagnosticSpec w przypadkach błędów. Do debugowania należy używać podglądu rozwinięcia w Xcode i punktów przerwania w tym samym procesie podczas uruchamiania testów. W CI testy należy uruchamiać za pomocą swift test.

Często zadawane pytania

Czy lekcja „Testowanie i debugowanie makr” jest bezpłatna?

Tak — pełny tekst „Testowanie i debugowanie makr” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Swift Academy, przejdź na CoddyKit PRO. Kurs Swift Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Testowanie i debugowanie makr”?

Pisanie testów jednostkowych dla rozwinięć makr za pomocą assertMacroExpansion. Ćwiczysz Swift Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć Swift Academy?

Nie wymagamy żadnego doświadczenia. Swift Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 4 z 4.

Ile czasu zajmuje lekcja „Testowanie i debugowanie makr”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji Swift Academy?

Tak. Każda lekcja Swift Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Role makr: freestanding a attached
  2. Pisanie niezależnego makra wyrażeń
  3. Dołączane makra składowych do ograniczania kodu szablonowego
  4. Testowanie i debugowanie makr
← Powrót do Swift Academy