0Pricing
Swift Academy · Урок

Тестирование и отладка макросов

Пишите модульные тесты для раскрытия макросов с помощью assertMacroExpansion.

«Тестирование и отладка макросов» — бесплатный урок Swift Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Swift Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Swift Academy содержит 4 уроков всего.

Зачем тестировать макросы

Макросы создают код во время компиляции. Модульные тесты проверяют сгенерированный исходный код до того, как он попадёт в рабочую среду.

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

assertMacroExpansion

assertMacroExpansion принимает исходный код на входе и ожидаемый раскрытый исходный код, а затем проверяет их совпадение.

import SwiftSyntaxMacrosTestSupport
import XCTest

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

Тестирование присоединённых макросов

Передайте структуру или класс с применённым макросом в качестве входных данных, а полностью раскрытый исходный код — в качестве ожидаемого результата.

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

Тестирование создания диагностических сообщений

Проверьте, что при неправильном использовании макрос создаёт правильное диагностическое сообщение — предупреждение или ошибку.

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

Раскрытие макросов в Xcode

В Xcode щёлкните правой кнопкой мыши вызов макроса и выберите Раскрыть макрос, чтобы просмотреть сгенерированный код непосредственно в исходном файле.

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

Отладка с помощью вывода в макросах

Используйте context.diagnose или print для вывода в стандартный поток ошибок при отладке логики макроса во время разработки.

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

Точки останова в тестах макросов

Поскольку макросы выполняются внутри процесса во время тестов, во время запуска тестов можно устанавливать точки останова Xcode внутри реализаций макросов.

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

Исследование синтаксического дерева

Используйте .debugDescription SwiftSyntax, чтобы вывести полное синтаксическое дерево входного узла для отладки.

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

Тестирование вариантов с разными аргументами

Напишите отдельный тест для каждой отличающейся формы аргументов, чтобы проверить все пути выполнения макроса.

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

Интеграционное тестирование

Добавьте цель тестового приложения, которая действительно использует макрос. Убедитесь в корректности компиляции и поведения во время выполнения.

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

CI для тестов макросов

Запускайте тесты макросов в CI, как и для любого другого пакета Swift: выполните swift test в каталоге пакета.

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

Быстрая проверка

Какая функция проверяет в модульном тесте, что макрос раскрывается в ожидаемый исходный код?

Итоги урока

Тестируйте макросы с помощью assertMacroExpansion, чтобы проверять правильность результата, и DiagnosticSpec — для случаев с ошибками. Используйте предварительный просмотр раскрытия в Xcode и точки останова внутри процесса во время запуска тестов. Запускайте тесты в CI с помощью swift test.

Часто задаваемые вопросы

Урок «Тестирование и отладка макросов» бесплатный?

Да — полный текст урока «Тестирование и отладка макросов» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Swift Academy, подпишись на CoddyKit PRO. Курс Swift Academy содержит 4 уроков всего.

Чему я научусь в уроке «Тестирование и отладка макросов»?

Пишите модульные тесты для раскрытия макросов с помощью assertMacroExpansion. Ты практикуешь Swift Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Swift Academy?

Предыдущий опыт не требуется. Swift Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.

Сколько времени занимает урок «Тестирование и отладка макросов»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Swift Academy?

Да. Каждый урок Swift Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Роли макросов: автономные и присоединённые
  2. Написание автономного макроса-выражения
  3. Присоединённые макросы членов для сокращения шаблонного кода
  4. Тестирование и отладка макросов
← Назад к Swift Academy