0Pricing
Swift Academy · Aula

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 output

assertMacroExpansion

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 hit

Inspeçã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 hierarchy

Testando 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 MyMacros

Verificaçã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

  1. Funções das macros: independentes e anexadas
  2. Como escrever uma macro de expressão independente
  3. Macros de membros anexadas para reduzir código repetitivo
  4. Testes e depuração de macros
← Voltar para Swift Academy