Тестирование и отладка макросов
Пишите модульные тесты для раскрытия макросов с помощью 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 outputassertMacroExpansion
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 — локальная установка не требуется.
Все уроки этого курса
- Роли макросов: автономные и присоединённые
- Написание автономного макроса-выражения
- Присоединённые макросы членов для сокращения шаблонного кода
- Тестирование и отладка макросов