update.はじめにAPIの仕様をSwagger/OpenAPIで書くケースは増えてきました。これはAPI提供側と利用側の取り決めなので、これさえしっかり書いてメンテしていけば、独立して開発できるようになります。いうのはいささか理想が過ぎるようにも思えます。いうのもSwagger/OpenAPIでは仕様、特にやりとりするJSONのデータの仕様を書ききるのは難しいためです。一応型としてきっちり定義できるように、スキーマ定義の部分は仕様が膨らんできていますが、その延長線上にはそれこそメンテ不可能な、過去人類が通ったスペックモンスターの規格を生み出してしまわれそうです。Specというものを作ってみました。どんなAPIでもサーバサイドでは、受け取るパラメータやJSONのバリデーションはしっかり書くはずです。これを利用して、APIのテストにも活用する方法をご紹介します。}});こんな感じでスペックを定義します。firstNameやlastNameなどは、ビルトインのスペックです。バリデーションは、@json-spec/coreのisValidを使います。falseバリデーションの詳細は、explainを使うと取れます。languagesオブジェクトとしても取れます。}スペックの定義spec`を使ってバリデーション用のファンクションをスペック化できます。3)falseまたスペックを組み合わせて複雑なスペックを生成できます。even)ObjectとArrayには専用のスペック定義メソッドがあります。});オプションでは、以下のものが指定可能です。false)Objectのスペックでは、キーが必須か任意かで定義を分けます。Specはイチから開発したわけではなく、clojure.specのJavaScript移植です。Clojureは動的型付け言語であり、またシンプルなマップやリストを使ってデータ構造を表現する設計指針もあいまって、既存のファンクションを利用する側が、ドキュメントを良く読んで使わなきゃいけない問題がありました。通常の言語のアプローチだと、型を導入してなんとかしようとするわけですが、Clojureではこのclojure.specを使って実行可能な仕様書を導入することで、この問題の解決を図っています。https://clojure.org/about/specclojure.specのもう一つ面白いところは、バリデーションと同時にスペックに沿ったデータの生成ができるところです。Specにもデータの生成機能を実装してあります。スペックには、その仕様に沿ったデータを生成するジェネレータファンクションを設定でき、ObjectスペックやArrayスペック、ビルトインのスペックには、ジェネレータファンクションがプリセットされているので、ただちにデータの生成が可能です。}sampleを使えば一気にたくさんのデータを生成可能です。APIとともに用いることでその真価を発揮できると考えています。APIの仕様を読み込んで、モックサーバやモッククライアントが出来上がるのです。https://www.npmjs.com/package/@json-spec/openapiモッククライアントを使ったAPIサーバのテストOpenAPIで定義されているエンドポイントを、スペックに沿って一通り叩いてくれるコマンドが用意されています。Specは次のように、スペックをexportしたファイルを読み込ませます。stringこれで、実行すると以下のような結果を得ます。/pets/E75bNb4h7p3637aEVU42Z6IkcAPIサーバのCIに仕込んでおけば、意図せず仕様違反となる修正をしてしまったことを検出できるようになります。APIクライアント開発で使うモックサーバ既存のAPIサーバがあって、それを使って新たにシステムを作るのがトラブル少なくよいことですが、それらを同時に作らなきゃいけないことも往々にしてあります。API仕様を読み込んでAPIサーバを自動的に立ててくれます。Specから`#/components/schemasを生成する機能を開発予定です。APIでのコンポーネント定義を書くので重複感がなくなります。Specが使えますが、サーバサイドの言語がNode.jsに限られてしまうので、GraalVMのPolyglotでなんとかすることを考えています。Specとともに使うことで、そのありがたみをハッキリと再認識できると思いますので、ぜひお試しください。Kawashima@kawasimaClojure関連のことをブログがわりに書き綴ります。※ここでの発言はシステムエンジニアを代表するものであって、所属する組織は二の次です。upLoginユーザーは見つかりませんでした。