mcpField
O
openapi-parser

openapi-parser

github.com/pactflowテスト・品質799 回インストール2 日前に更新
リポジトリ

openapi-parser について

OpenAPI Parserは、OpenAPI 3.xのエンドポイントスキーマからDriftテストケースを作成するスキルです。スキーマ参照の解決、バリアントの列挙、YAML生成を案内し、Swagger 2.0仕様の調整方法も示します。

主な機能

  1. 01エンドポイントとスキーマ定義の特定
  2. 02ネストしたスキーマ参照の解決
  3. 03テスト対象となるスキーマバリアントの列挙
  4. 04パターンをDrift操作に対応付け
  5. 05operationsとdatasetのYAML生成

活用シーン

  1. 01多相レスポンスのテスト生成
  2. 02任意フィールドとnullableフィールドの網羅
  3. 03OpenAPI仕様からDriftケースを作成

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/pactflow/pactflow-agent-skills --skill openapi-parser

インストール後、Claude Code で/openapi-parserを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

evals/
01-anyof-parameter-variants.json
02-discriminator-with-allof.json
03-regex-pattern-field.json
evals/fixtures/
anyof-parameter-variants.yaml
discriminator-with-allof.yaml
regex-pattern-field.yaml
references/
drift-mapping.md
example-repos.md
schema-patterns.md

詳細

OpenAPI パーサースキル

参照ファイル

  • references/schema-patterns.md — あらゆる複雑なパターン (anyOf / oneOf / allOf / discriminator / $ref / enum / pattern / nullable / optional)の解釈方法と列挙方法を、 snyk、digitalocean、posthog、front/core の仕様書にある実例とともに説明します。
  • references/drift-mapping.md — 列挙したスキーマバリアントを Drift YAML にマッピングする方法を説明します。 データセット、式、ステートフルなケースのライフサイクルフック、各パターンタイプに対応する レスポンスマッチャーも含まれます。

ワークフロー

OpenAPI バージョン: このスキルは OpenAPI 3.x を対象としています。Swagger 2.0 の仕様書でも同じ構造パターン($ref、allOf、oneOf)が使われますが、エンベロープ構文が異なるため、フィールド名を手動で調整する必要がある場合があります。 konfig-sdks/openapi-examples コレクションを使用する場合は、ナビゲーション用コマンドについて references/example-repos.md を参照してください。

1. エンドポイントを特定する

必要なものだけを抽出します。

# Find the line number of the endpoint (macOS/Linux/Git Bash/WSL)
grep -n "^  /path/to/endpoint" spec.yaml

# Read just that block (adjust line range as needed)
# Then follow each $ref to components/schemas
grep -n "SchemaName:" spec.yaml
# PowerShell equivalents (Windows)
Select-String -Path spec.yaml -Pattern "^  /path/to/endpoint" | Select-Object LineNumber, Line
Select-String -Path spec.yaml -Pattern "SchemaName:" | Select-Object LineNumber, Line

抽出するもの:パス/クエリ/ヘッダーパラメーター、リクエストボディのスキーマ、各レスポンスステータスコードのスキーマ。

2. $refs を再帰的に解決する
  1. 仕様書内を Foo: で grep し、定義ブロックを見つけます。
  2. Foo 自体に refs が含まれている場合は、それらも解決します。
  3. プリミティブ型(string、integer、boolean、array、object)に到達したら終了します。

allOf: [$ref: Base, properties: {...}] は継承です。Base のフィールドとローカルの プロパティをマージして、完全なスキーマを取得します。すべてのパターンについては references/schema-patterns.md を参照してください。

3. 有効な組み合わせを列挙する

各レスポンスステータスコードについて、構造的に異なるスキーマバリアントを列挙します。スキーマのカバレッジを最大化する最小限のテストを目指し、オプションフィールドの組み合わせを際限なく増やさないようにします。

パターン生成するテスト
oneOf / anyOf に N 個の分岐がある場合N 個のテスト — 分岐ごとに 1 つ
N 個のマッピング値を持つ discriminatorN 個のテスト — discriminator の値ごとに 1 つ
allOf(合成/継承)1 個のテスト — すべてのスキーマを 1 つのペイロードにマージ
enum1 個のテストでカバーします。値が動作を左右する場合に限り、境界値のバリアントを追加します
オプションフィールドのまとまり2 個のテスト:すべてのオプションフィールドを含むものと、含まないもの
nullable フィールド正常系でカバーします。動作が変わる場合に限り、null のバリアントを追加します
pattern(正規表現)パターンに一致する有効な例を 1 つ、ネガティブテスト用の無効な例を 1 つ
4. Drift テストケースを生成する

各組み合わせについて、Drift の操作ブロックを生成します。詳しいパターンは references/drift-mapping.md を参照してください。 主な規約:

  • 操作には {operationId}_{variant} という名前を付けます(例:getImage_byId、getImage_bySlug)。
  • 識別子付きユニオンでは、リクエストボディに識別子プロパティを明示的に設定します。
  • anyOf のパスパラメーターでは、型バリアントごとに 1 つのテストを記述します。
  • テストデータには dataset を使います。インラインの parameters は、静的でバリアントのない値(例:type: user のような固定の enum クエリパラメーター)に限って使用します。
  • 401 テストでは、exclude: [auth] でグローバル認証を除外し、無効な bearer token を明示的に渡します。
  • 意図的に無効なリクエストボディを送信する操作には、ignore: { schema: true } を追加します。
  • 各テストには、対象とするスキーマ分岐を示すタグを付けます。
  • expected から body を省略すると、Drift は OpenAPI スキーマに照らしてレスポンスを自動的に検証します。特定のフィールド値を検証する場合(例:識別子プロパティが正しく返された場合)に限り、明示的な body マッチャーを追加します。
5. 出力形式

常に次の内容を出力してください。

  1. 分析 — ステータスコードの数、ポリモーフィックなスキーマ、生成されるテストの数とその理由
  2. Drift オペレーション YAML — そのまま貼り付けられる完全な operations: ブロック
  3. データセット YAML(必要な場合)— 参照されているテストデータ用の datasets: ブロック
  4. 不足点 — 意図的に除外したスキーマの組み合わせとその理由
例

image_id: anyOf: [integer, string] の GET /v2/images/{image_id} の場合:

operations:
  getImage_byId:
    target: source-oas:getImage
    tags: [images, param-integer]
    parameters:
      path:
        image_id: ${image-data:images.existing.id}
    expected:
      response:
        statusCode: 200

  getImage_bySlug:
    target: source-oas:getImage
    tags: [images, param-string]
    parameters:
      path:
        image_id: ${image-data:images.existing.slug}
    expected:
      response:
        statusCode: 200

  getImage_notFound:
    target: source-oas:getImage
    parameters:
      path:
        image_id: ${image-data:notIn(images.*.id)}
    expected:
      response:
        statusCode: 404

コメント