マクロのテストとデバッグ
assertMacroExpansionを使い、マクロ展開のユニットテストを記述します。
「マクロのテストとデバッグ」はCoddyKit上の無料Swift Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これは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]
)
}
}アタッチドマクロをテストする
装飾されたstructまたはclassを入力として渡し、完全に展開されたソースを期待される出力として指定します。
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")マクロでprintを使ってデバッグする
開発中にマクロのロジックをデバッグするには、context.diagnoseまたはstderrへの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構文ツリーを調査する
入力ノードの完全な構文ツリーをデバッグ用に出力するには、SwiftSyntaxの.debugDescriptionを使用します。
print(node.debugDescription)
// Prints the full SyntaxTree hierarchy複数の引数バリエーションをテストする
マクロ内のすべてのコードパスを実行できるように、引数の形ごとに1つのテストを作成します。
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
他のSwift packageと同様に、CIでマクロテストを実行します。パッケージディレクトリでswift testを実行してください。
// CI command:
swift test --package-path MyMacros理解度チェック
ユニットテストで、マクロが期待するソースコードに展開されることを検証する関数はどれでしょうか。
レッスンのまとめ
マクロの正しい出力はassertMacroExpansionで、エラーケースはDiagnosticSpecでテストします。Xcodeの展開プレビューと、テスト実行中の同一プロセス内ブレークポイントでデバッグします。CIではswift testを実行してください。
よくある質問
「マクロのテストとデバッグ」レッスンは無料ですか?
はい。「マクロのテストとデバッグ」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Swift Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Swift Academyコースには全4レッスンが含まれています。
「マクロのテストとデバッグ」で何を学びますか?
assertMacroExpansionを使い、マクロ展開のユニットテストを記述します。 ブラウザで直接実行するハンズオンコードでSwift Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Swift Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのSwift Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。
「マクロのテストとデバッグ」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このSwift Academyレッスンでコードを書いて実行できますか?
はい。すべてのSwift Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。