Testes e depuração de macros
Escreva testes unitários para expansões de macros usando assertMacroExpansion.
Testes e depuração de macros é uma aula grátis de Swift Academy no CoddyKit. Esta é a aula 4 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Swift Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Swift Academy inclui 4 aulas no total.
Por que testar macros?
As macros geram código em tempo de compilação. Os testes unitários verificam o código-fonte gerado antes que ele chegue à produção.
// The swift-syntax package ships SwiftSyntaxMacrosTestSupport
// with assertMacroExpansion for testing macro outputassertMacroExpansion
assertMacroExpansion recebe o código-fonte de entrada e o código-fonte expandido esperado e verifica se eles correspondem.
import SwiftSyntaxMacrosTestSupport
import XCTest
final class StringifyMacroTests: XCTestCase {
func testStringify() throws {
assertMacroExpansion(
"#stringify(1 + 2)",
expandedSource: "(1 + 2, \"1 + 2\")",
macros: ["stringify": StringifyMacro.self]
)
}
}Testando macros anexadas
Forneça a estrutura ou classe anotada como entrada e o código-fonte completamente expandido como saída esperada.
assertMacroExpansion(
"@AddID struct User { var name: String }",
expandedSource: """
struct User {
var name: String
var id = UUID()
}
""",
macros: ["AddID": AddIDMacro.self]
)Testando a emissão de diagnósticos
Verifique se sua macro emite o diagnóstico correto, como um aviso ou erro, quando é usada incorretamente.
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]
)Expandindo macros no Xcode
No Xcode, clique com o botão direito do mouse em uma invocação de macro e selecione Expandir macro para inspecionar o código gerado diretamente no código-fonte.
// Before expansion:
let (v, s) = #stringify(1 + 2)
// After:
let (v, s) = (1 + 2, "1 + 2")Depurando com impressão em macros
Use context.diagnose ou print para a saída de erro padrão a fim de depurar a lógica da macro durante o desenvolvimento.
// In macro implementation:
print("[StringifyMacro] expanding: \(node.description)", to: &standardError)Pontos de interrupção nos testes de macros
Como as macros são executadas no mesmo processo durante os testes, você pode definir pontos de interrupção do Xcode dentro das implementações das macros durante as execuções de teste.
// Set a breakpoint in StringifyMacro.expansion()
// Run the test target — breakpoints are hitInspeção da árvore de sintaxe
Use o .debugDescription do SwiftSyntax para imprimir a árvore de sintaxe completa de um nó de entrada durante a depuração.
print(node.debugDescription)
// Prints the full SyntaxTree hierarchyTestando várias variantes de argumentos
Escreva um teste para cada formato distinto de argumentos, garantindo que todos os caminhos de código da macro sejam exercitados.
func testNoArgument() {
assertMacroExpansion(
"#stringify()",
expandedSource: "#stringify()",
diagnostics: [DiagnosticSpec(message: "Need an argument", line: 1, column: 1)],
macros: ["stringify": StringifyMacro.self]
)
}Testes de integração
Adicione um destino de aplicativo de teste que realmente use a macro. Confirme a compilação e o comportamento em tempo de execução.
// In test app:
let (val, src) = #stringify(Date.now)
XCTAssertEqual(src, "Date.now")CI para testes de macros
Execute os testes de macros na CI como faria com qualquer outro pacote Swift: swift test no diretório do pacote.
// CI command:
swift test --package-path MyMacrosVerificação rápida
Qual função verifica, em um teste unitário, se uma macro se expande para o código-fonte esperado?
Recapitulação da lição
Teste macros com assertMacroExpansion para verificar a saída correta e com DiagnosticSpec para casos de erro. Depure usando a visualização da expansão no Xcode e pontos de interrupção no mesmo processo durante as execuções de teste. Execute os testes por meio de swift test na CI.
Perguntas Frequentes
A aula “Testes e depuração de macros” é grátis?
Sim — o texto completo de “Testes e depuração de macros” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Swift Academy, atualize para CoddyKit PRO. O curso de Swift Academy inclui 4 aulas no total.
O que vou aprender em “Testes e depuração de macros”?
Escreva testes unitários para expansões de macros usando assertMacroExpansion. Você pratica Swift Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar Swift Academy?
Nenhuma experiência prévia é necessária. Swift Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 4 de 4.
Quanto tempo leva a aula “Testes e depuração de macros”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de Swift Academy?
Sim. Cada aula de Swift Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- Funções das macros: independentes e anexadas
- Como escrever uma macro de expressão independente
- Macros de membros anexadas para reduzir código repetitivo
- Testes e depuração de macros