JSONPlaceholder で得られるもの
予測可能なリソース。 投稿、コメント、ユーザー、TODO、アルバムが用意されており、識別子は安定し、構造も一貫しています。
すべての HTTP メソッド。 GET、POST、PUT、PATCH、DELETE のいずれも妥当なレスポンスを返します。
入れ子のリレーション。 コメントは投稿に、投稿はユーザーに紐づきます。練習するには十分な構造です。
偶然の教訓
JSONPlaceholder への書き込みはシミュレートされたものです。POST すれば識別子付きの 201 が返ってきますが、何も保存されていません。取得し直しても、そこには存在しません。
多くの人はこれを制約だと捉えます。しかしこれこそ、このサービスで最も有用な点です。初学者が混同しがちな二つの考えを切り分けてくれるからです。すなわち、 リクエストが成功したこと と 実際に変更が起きたこと。ステータスコードだけを検証するスイートは、ここではすべての書き込みテストに、自信たっぷりに、いつまでもパスし続けます。
JSONPlaceholder の偽の書き込みでも通ってしまうアサーションは、弱いアサーションです。処理のあとに対象が実際に存在するかを確認する形へ書き直し、その習慣を、同じ弱さが見えないままになる自分の実際の API にも持ち込んでください。
ここで練習すべきこと、その順序
構造とフィールド
ステータスではなく、ボディの構造を検証します。
存在の有無だけでなく、型も確認します。
リレーション
投稿を取得し、続いてそのコメントを取得して、コメントが本当にその投稿を参照しているかを確認します。
実際のバグの多くは、二つの呼び出しのあいだに潜んでいます。
異常系
存在しない識別子をリクエストし、レスポンスが正しい形になっているかを検証します。
誰もが省略しがちで、そして実際に問題を見つけてくれるテストです。
教えられないこと
状態を伴うものすべて、つまり実際の API テストを難しくしているものすべてです。セッションと有効期限、あるレスポンスから取り出して次の呼び出しで使う値、順序どおりに実行しなければならない呼び出し、そして実行後のクリーンアップ。何も永続化されないため、JSONPlaceholder にはこれらが一つもありません。
つまり、最初の一時間としては申し分ありませんが、二週目には誤解を招く教材になります。基本に慣れたらすぐに、実際の状態を持つ API へ移ってください。難易度は一段跳ね上がると考えておいてください。
応用の効く最初の一時間
この練習を自分の API で役立てたいなら、手当たり次第に触るのではなく、次の四つを順番に行ってください。
投稿を取得し、呼び出しが成功したことだけでなく、特定の三つのフィールドとその型を検証します。存在しない投稿を取得し、ステータスと返ってくる内容の形を検証します。投稿を取得してからそのコメントを取得し、すべてのコメントが指定した投稿を参照していることを検証します。そして投稿を作成し、それを取得し直して、アサーションが失敗するのを見届けます。
最後の一つが、この練習全体の要点です。書き込みは成功を報告し、識別子も返ってきましたが、何も永続化されていません。実際の API に持ち込む価値のある習慣はすべて、それでもテストが通ってしまった理由に気づき、通らないように書き直すことの中にあります。
実際のサービスへ移る
この四つは、専用に作られたレイヤーでは Auto-Authentication、Dynamic Variables、Dependency Chains、Auto-Cleanup として扱われます。仕組みを解説しているのは API テストのドキュメント。
ターミナル
npm install -g @testsprite/testsprite-cli
testsprite setup
ローカルにインストールしたくない場合は、ダッシュボードでも同じ範囲をカバーできます。コマンドの全体がそろっているのは CLI リポジトリ。
実際の API に向けたときに変わること
JSONPlaceholder が教えられないことは、すべて TestSprite が引き受けます。実行の途中で切れるセッションには Auto-Authentication。作成呼び出しが返す識別子には Dynamic Variables。ほかの処理が終わるまで実行できない呼び出しには Dependency Chains。実行のたびに残るレコードには Auto-Cleanup。
始め方は上の練習と同じです。プロジェクトをベース URL に向け、API Discovery に存在するものを洗い出させ、何かを実行する前に生成されたプランを読みます。違うのは、そのプランが、書き込みが実際に永続化されるサービスに対して、認可や境界値のケースまでカバーしている点です。
得られるのは、この練習が目指していたものです。状態に触れても崩れないアサーションが、思い出したときではなく、変更のたびに実行されるようになります。
POST リクエストが永続化されないのはなぜですか?
仕様どおりです。JSONPlaceholder は書き込みをシミュレートしています。レスポンスではなく結果を検証するという教訓として活用してください。
CI に適していますか?
チュートリアル用のスイートであれば、たまになら問題ありません。コミットのたびに実行するものには、代わりにローカルのモックを使ってください。無料の共有サービスだからです。
次は何に移るべきですか?
認証と実際の永続化を備えたものです。難易度が跳ね上がることこそが要点であり、応用の効くスキルはそこから始まります。
テスト生成ツールを向けてもよいですか?
はい。汚してしまうものが何もないため、生成されたカバレッジがどのようなものかを安全に確認できる場所です。
代わりになるものはありますか?
意図的な失敗やステータスコードには HTTPBin、規模のあるページネーションには PokeAPI、認証が絡む挙動には公開されている GitHub API があります。