APIのテストず文曞化でJSONスキヌマを䜿甚する

リファレンスAPI 2GISは 4幎間開発されたした。 JSONおよびXML圢匏でかなり倧きく階局的に耇雑な構造を返す玄40のメ゜ッドが登堎したした。 ごく最近、私は経隓を共有し、DevConfカンファレンスで講挔するこずにしたした。

レポヌトのトピックの1぀は、参加者の間で最倧の関心を呌び起こしたした-APIを発行するための圢匏をテストするずきのJSONスキヌマの䜿甚。 この蚘事では、このアプロヌチが解決する問題、制限があるもの、箱から出したもの、ボヌナスずしお提䟛されるものに぀いお説明したす。 行こう







JSON-Schemaは、XMLスキヌマ圢匏のJSON類䌌物です。 その本質は、宣蚀圢匏でドキュメントの構造を蚭定するこずです。 テスト目的でのJSONスキヌムの䜿甚を劚げるものは䜕もありたせん。



APIのテストの難しさは䜕でしょうか これは掗緎されたUIではありたせん。 考えおみお、リク゚ストを実行し、結果を予想された結果ず比范しおください。

芁求たたは応答に含たれる可胜性がある面倒な階局構造は動揺しおいたす。 パラメヌタが玄50の堎合、考えられるすべおの特性ケヌスを考慮するこずは非垞に問題です。



APIがその責任を果たさなければならないずいう事実に加えお、あなたはそこから合理性ず䞀貫性を期埅したす。 これはフォヌマットにも適甚されたす。 数字は垞に文字列ではなく数字ずしお䞎えられるようにしたい。 配列が空の堎合、nullであっおはならない、たたは答えにたったく存圚しないはずですが、空の配列にしおください。 もちろん、これらは些现なこずですが、APIナヌザヌはそれらをためらうこずを非垞に䞍快に思いたす。 さらに、これは隠れた゚ラヌに぀ながる可胜性がありたす。 そのため、圢匏の厳栌さに泚意する必芁がありたす。



䞀般に、構造ず圢匏のテストは難しい䜜業ではありたせん。 メ゜ッドごずに、JSONスキヌマ圢匏を䜿甚しお芁求ず応答の構造を蚘述するこずができたす。

圌らが蚀うように、すべおが私たちの前に発明されたした。 あなたはそれを賢く䜿う必芁がありたす。



API圢匏のテスト


リク゚ストずレスポンス


API応答の圢匏を正確にテストするこずを怜蚎したす。 私たちに近いだけです APIは読み取り専甚です。 ただし、APIが耇雑なオブゞェクトの圢匏でデヌタを受信できる堎合、基本的なアプロヌチは読み取りの堎合ず同じです。



JSONスキヌマ


曞匏



そのため、ハヌドビゞネスJSON-Schemaで圹立ちたす。 フォヌマット自䜓の簡単な玹介はすでにハブにありたす したがっお、私たちは些现な䟋に自分自身を制限したす。 JSONオブゞェクトを取埗したす。



{ "a":10, "b":"boo" }
      
      





その構造、パラメヌタヌのタむプ、コミットメントを蚭定するには、パラメヌタヌ倀を特別なオブゞェクトに眮き換えるだけで十分です。 私たちは芋たす



 { "a": { "type": "number", "required": true }, "b": { "type": "string", "required": true } }
      
      





同意したす、はっきりず。 抂しお、JSONスキヌマは、XMLスキヌマ圢匏に類䌌するこずを目指しおいたす。



PHPの実装



もちろん、答えを蚘述するずきにJSONスキヌマを䜿甚する必芁はありたせん。 この圢匏は比范的新しく、完党に解決されたわけではありたせん。 XMLスキヌマ圢匏ほど倚くのラむブラリずツヌルはありたせん。 しかし、非垞に倚くの開発者にずっお、JSON圢匏ははるかに明確です。 たた、PHPに぀いお蚀えば、json_encode関数ずjson_decode関数のおかげで、JSONはほずんどネむティブです。



JSON-Schema圢匏の実装は、 さたざたな蚀語甚です 。 ご芧のずおり、遞択は倧きくありたせん。 MITずBerkeleyの 2぀の研究所からのPHP甚の2぀のラむブラリがありたす。

執筆時点で、MITでの最埌のコミットは2012幎2月で、2013幎6月にバヌクレヌで行われたした。そのため、クむックレビュヌによりバヌクレヌは遞択を迫られたした。



軟膏のパずしお、答えのオブゞェクトには、図に蚘茉されおいるフィヌルドだけでなく、完党に残っおいるフィヌルドもあるこずに泚意するこずができたす。 さらに、答えは完党に有効であり、ほずんどの堎合、これは受け入れられたせん。 私の意芋では、これは特別なadditionalPropertiesプロパティをデフォルトでfalseに明瀺的に蚭定する小さなプリプロセッサによる誀解ずしお扱われたす。



怜蚌


バトルにAPIレスポンスの怜蚌を含めるこずはあたり意味がありたせん。䜙分なオヌバヌヘッドがありたす。 しかし、テストを実行するず、これで終わりです。 モヌドを切り替えるには、アプリケヌション構成ファむルのフラグで十分です。

特定のBerkeleyラむブラリヌに぀いお話す堎合、テストからの怜蚌の䟋



 $validator = new Validator(); $validator->check(json_decode($input), json_decode($schema)); //  $input    $schema $this->assertTrue($validator->isValid(), print_r($validator->getErrors(), true));
      
      







盎感的にさえ、䜕が起こっおいるのか。



JSONスキヌムをチェックするためのテストを特別に蚘述する必芁がないこずに泚意しおください。 機胜テストはすでにAPIで蚘述されおいるず考えおいたす。 ぀たり、フィルタリングを有効にした堎合、テストを実行するず、応答圢匏がバックグラりンドで自動的にチェックされたす。 物事の間のように。 実際には、回路を曞くこず以倖の特別な努力は必芁ありたせん。



はい、小さな远加パフォヌマンステストでは、「ヒント」がないように怜蚌を無効にする必芁がありたす。 たた、開発者のマシンでは、逆に有効にしお、フォヌマットの違反をすばやく怜出したす。 質問-JSONスキヌムは誰が曞くべきですか 開発者が曞いおいるので、もっず䟿利です。 スキヌムはプロゞェクトコヌド内に存圚し、フォヌマットが倉曎されるず、開発者はすぐにスキヌムを修正したす。



ドキュメント


テストを敎理し、単䜓テストに接続し、出力で圢匏の正確性に自信を持っおいたす。 しかし、私たちがやっおきたJSONスキヌムを䜿甚するずきのもう1぀の倧きなボヌナスは、APIドキュメントです。



ドキュメントには1぀の問題がありたす-いたいたしい、あなたはそれを曞かなければなりたせん。 APIドキュメントはその仕様であり、すべおのニュアンスを反映する必芁がありたす。 さお、他にどのように APIはそれ自䜓では存圚せず、顧客が操䜜できるようにするためだけに存圚したす。 そしお、あなたが圌に期埅する驚きが少なくなればなるほど、それはより明確になり、ナヌザヌはそれをより速くより快適に䜿うこずができたす。 ドキュメントを保存できる唯䞀のケヌスは、APIの開発者が同時にそのナヌザヌである堎合です。 そしお、これは垞にそうではありたせん。 したがっお、ドキュメントの方が良いでしょう。 さお、パラメヌタヌの総数が数癟である堎合、ドキュメントを最新の状態に保぀方法は テストでコヌドを曞くだけでなく、ドキュメントに埓う必芁もありたす。 芁するに、プラスの「スマット」が1぀あり、その䞭にはドキュメントがなくおも十分です。



バヌゞョニング


それでは、ドキュメントのバヌゞョン管理に぀いおはどうでしょうか 実際、私たちは倚くの人ず同じようにアプロヌチを採甚しおいたす-各機胜はgitの別々のブランチで行われたす。

たあ、各ブランチに独自のバヌゞョンのドキュメントがある堎合。 開発者ずテスタヌの䞡方にずっお、誰にずっおも簡単です。 私はブランチでタスクを䜜成し、すぐにドキュメントを曞き、タスクに぀いお「忘れたした」。



したがっお、ドキュメントがコヌドずずもに存圚する堎合に適しおいたす。 たた、異なるタスクから同じドキュメントをマヌゞするのを䟿利にするために、特定のテキスト圢匏で保存するのが論理的です。 Markdown圢匏、セマンティックbbコヌド、たたはその他の方法で保存できたす。 しかし、実際には、さたざたな衚、それらの間の関係、盞互参照などを含む、ほずんど裞のテキストのたたです。 ドキュメントの正確性をテストする方法は明確ではありたせん。 毎回、「病気になりたす」ず慎重にすべおを手動で確認したす。 これは第䞀に、そしお第二に、゚ラヌがただ残っおいたす。



JSONスキヌマ


たあ、それでも







それを拒吊するこずは完党に䞍可胜ですが、それをサポヌトするための劎力を倧幅に削枛するこずは可胜です。 すでにJSONスキヌマがありたす。 APIレスポンス、パラメヌタヌ間の階局関係、デヌタ型、パラメヌタヌバむンディングにすべおのパラメヌタヌ名が既に含たれおいたす。 ぀たり、この情報はドキュメントを生成するためにも必芁です。



したがっお、ブルドッグをサむず亀差させ、ドキュメントをJSON-Schemaで盎接蚘述するこずにしたした。 JSONスキヌマ圢匏には既に説明タグがありたす。 しかし、仕様によるず、文字列でなければなりたせん。 ただし、サンプルネストされたサンプルタグ、およびシヌクレットパラメヌタヌネストされた非衚瀺タグなどの特定のオプションも远加するず䟿利です。 したがっお、これにはオブゞェクトタグの方が適しおいたす。 タグの名前ずしお「メタ」を遞択したした。 䟋



 "reviews_count": { "type": "number", "required": true, "meta": { "description": " ", "hide": true } }
      
      







提出


ここで、JSONスキヌムを特別に蚭定したす。 パヌサヌ、そしおそれぱレガントなドキュメントに倉わりたす。 ドキュメントを䜜成するずき、独自の「メタ」タグのコンテンツだけでなく、ネむティブスキヌマタグからの情報も考慮されたす。



ドキュメントの特定の衚瀺方法は異なる堎合がありたす。 間にリンクがある通垞のフラットテヌブルを優先したした。 しかし、これはもちろん理想的なオプションではありたせん。 ただし、ドキュメントをJSONスキヌムに配眮しおも、レンダリングの最終的な方法に拘束されるこずはないため、より自由になりたす。



最倧限の柔軟性を埗るために、ドキュメントを完党にJSONスキヌマから構築しないでください。 ドキュメントの各ペヌゞに個別のテキストファむルがある堎合、私たちのアプロヌチは蚌明されおいたす。 そしお、すでにその䞭に特定のJSONスキヌムぞのリンクが挿入されおいたす。 ペヌゞを構築するずき、JSONスキヌマは最終的なテキストビュヌに倉換されたす。 したがっお、ドキュメントに任意のテキスト、䟋、その他の資料を配眮する問題を解決したす。 同時に、できるこずをすべおJSONスキヌムにプッシュしようずはしおいたせん。



自己蚺断


テストずドキュメントの䞡方に同じJSONスキヌムが䜿甚されおいるこずがわかりたす。 これは、JSONスキヌムが垞に適切で正しいこずを意味したす。そうでない堎合、テストは倱敗したす。 そのため、原則ずしお、パラメヌタヌの名前、そのタむプ、必須/オプション、有効な倀のリスト、パラメヌタヌ間の階局関係に関連するドキュメントに゚ラヌはありたせん。 おわかりのように、それだけでは十分ではありたせん。



䟋


ナヌスケヌスのないドキュメントは、APIナヌザヌの゚ントリしきい倀を倧幅に増加させたす。 したがっお、それらは必ず远加する必芁がありたす。 以䞋のように敎理したす。 次に、ドキュメントで芁求を説明し、回答の䟋を瀺したす。



しかし、掚枬するのは難しくないので、応答テキストの関連性の問題が浮䞊したす。 1週間が経ち、フォヌマットは拡倧したす。そしお、再び䜕を䟋にしたすか より良い方法がありたす。



サンプルドキュメントのク゚リ結果は動的である必芁があるずいう結論に達したした。 ここでは異なるアプロヌチが可胜です。 APIのレスポンスは非垞に倧きいこずが倚いため、特定の領域をクリックしおドキュメントに衚瀺したす。 この時点で、芁求を満たしたす。 最も単玔なスキヌムですが、デヌタの受信にわずかな遅延がありたす。



このオプションが合わない堎合は、特別なコマンドを䜿甚しお䟋のすべおのリク゚ストを動的に実行し、ドキュメントペヌゞに回答を蚘入できたす。 これは、たずえばリリヌス前に行うこずができたす。



ずころで、私たちはただ䟋を曞いおいるので、それらは䞀皮の機胜テストず考えるこずもできたす。 実は、ドキュメント内のすべおのリク゚ストを収集し、JSONスキヌムをオンにしお有効性をチェックしたす。 ただし、この方法では、壊れたメ゜ッドたたは誀っお構成されたク゚リを特定できたす。



空の倀


圢匏の怜蚌に぀いお蚀えば、応答に空の倀を持぀パラメヌタヌをどう凊理するかを決定する必芁がありたす。 私たちは自分自身のために以䞋の合意に達したした。



いずれの堎合でも、空の倀が含たれおいる堎合でも、パラメヌタヌは応答に存圚する必芁がありたす。 そのため、回答の構造がわかりやすくなりたす。 調べるためだけにドキュメントを参照する必芁はありたせん。



配列型パラメヌタヌは空の配列を返したす。 オブゞェクトはヌルです。 数倀および文字列パラメヌタヌの堎合、れロず空の文字列が意味のある倀である堎合、それらを返したす。 たずえば、パラメヌタ「レビュヌの数」はれロを返す堎合がありたす-これは論理的です。 しかし、パラメヌタ「建物の階数」がれロを返す堎合、これはナンセンスです。 たずえば、特定の家の階数が䞍明な堎合、nullが返されたす。

nullが可胜な堎合ずそうでない堎合は、JSONスキヌムで明瀺的に瀺されたす。 そしお、それはドキュメントで意味したす。 あなたのアプロヌチは異なる堎合がありたすが、䞻なこずは、すべおのパラメヌタヌで統䞀されおいるこずです。そうしないず、APIの゚ンドナヌザヌは頭痛の皮になりたす。



おわりに


JSON-Schemaは、貎重な時間のテストず文曞化APIを倧幅に節玄したす。 これは、ほんの少しの努力が倚くの利益をもたらす堎合に圓おはたりたす。 たた、APIが倧きいほど、このアプロヌチはより倚くの劎力を節玄したす。



確かに、JSONスキヌムを䜿甚するための小さなツヌルキットを䜜成するために投資する必芁が生じた堎合、



テストの時間を節玄するこずに加えお、APIの䞋䜍互換性を維持するのが簡単です。 API圢匏は、JSONスキヌムで明確に衚珟されたす。 たた、倧量のドキュメントが持ち越されたす。



All Articles