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 outputassertMacroExpansion
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 hitInspekcja 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 hierarchyTestowanie 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 MyMacrosSzybkie 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
- Role makr: freestanding a attached
- Pisanie niezależnego makra wyrażeń
- Dołączane makra składowych do ograniczania kodu szablonowego
- Testowanie i debugowanie makr