0Pricing
Swift Academy · Lección

Pruebas y depuración de macros

Escriba pruebas unitarias para expansiones de macros mediante assertMacroExpansion.

Pruebas y depuración de macros es una lección gratuita de Swift Academy en CoddyKit. Esta es la lección 4 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Swift Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Swift Academy incluye 4 lecciones en total.

¿Por qué probar las macros?

Las macros generan código en tiempo de compilación. Las pruebas unitarias verifican el código fuente generado antes de que llegue a producción.

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

assertMacroExpansion

assertMacroExpansion recibe el código fuente de entrada y el código fuente expandido esperado, y verifica que coincidan.

import SwiftSyntaxMacrosTestSupport
import XCTest

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

Pruebas de macros adjuntas

Proporcione la estructura o clase decorada como entrada y el código fuente completamente expandido como salida esperada.

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

Pruebas de emisión de diagnósticos

Verifique que su macro emita el diagnóstico correcto (advertencia o error) cuando se use incorrectamente.

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

Expansión de macros en Xcode

En Xcode, haga clic con el botón derecho en una invocación de macro y seleccione Expandir macro para inspeccionar el código generado en línea.

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

Depuración con print en macros

Use context.diagnose o print en stderr para depurar la lógica de la macro durante el desarrollo.

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

Puntos de interrupción en pruebas de macros

Como las macros se ejecutan en el mismo proceso durante las pruebas, puede establecer puntos de interrupción de Xcode dentro de las implementaciones de las macros durante las ejecuciones de prueba.

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

Inspección del árbol de sintaxis

Use .debugDescription de SwiftSyntax para imprimir el árbol de sintaxis completo de un nodo de entrada durante la depuración.

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

Pruebas de varias variantes de argumentos

Escriba una prueba para cada forma de argumento distinta a fin de garantizar que se ejerciten todas las rutas de código de la macro.

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

Pruebas de integración

Añada un destino de aplicación de prueba que use realmente la macro. Confirme la compilación y el comportamiento en tiempo de ejecución.

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

CI para pruebas de macros

Ejecute las pruebas de macros en CI como cualquier otro paquete Swift: swift test en el directorio del paquete.

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

Comprobación rápida

¿Qué función verifica en una prueba unitaria que una macro se expanda al código fuente esperado?

Resumen de la lección

Pruebe las macros con assertMacroExpansion para verificar la salida correcta y con DiagnosticSpec para los casos de error. Depure mediante la vista previa de expansión de Xcode y puntos de interrupción en el mismo proceso durante las ejecuciones de prueba. Ejecute las pruebas mediante swift test en CI.

Preguntas frecuentes

¿La lección «Pruebas y depuración de macros» es gratis?

Sí — el texto completo de «Pruebas y depuración de macros» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Swift Academy, actualiza a CoddyKit PRO. El curso de Swift Academy incluye 4 lecciones en total.

¿Qué aprenderé en «Pruebas y depuración de macros»?

Escriba pruebas unitarias para expansiones de macros mediante assertMacroExpansion. Practicas Swift Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar Swift Academy?

No se requiere experiencia previa. Swift Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 4 de 4.

¿Cuánto tiempo toma la lección «Pruebas y depuración de macros»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de Swift Academy?

Sí. Cada lección de Swift Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Roles de macros: independientes frente a adjuntas
  2. Escritura de una macro de expresión independiente
  3. Macros de miembros adjuntas para reducir código repetitivo
  4. Pruebas y depuración de macros
← Volver a Swift Academy