0Pricing
Swift Academy · レッスン

マクロのテストとデバッグ

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

アタッチドマクロをテストする

装飾された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フィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. マクロの役割:フリースタンディングとアタッチド
  2. フリースタンディング式マクロの記述
  3. ボイラープレートを削減するアタッチドメンバーマクロ
  4. マクロのテストとデバッグ
← Swift Academyに戻る