すぐ始められるAPIテスト(1)

<span style="font-weight: 400">皆さんこんにちは、<a href="https://www.humancrest.co.jp/">ヒューマンクレスト</a>のマイです。</span>

<span style="font-weight: 400">新型コロナウイルスの影響により日々の生活が変化しつつありますが、 皆さまいかがお過ごしでしょうか。
一日も早く終息して、平和な日常生活に戻れるように心より願っています。</span>

<span style="font-weight: 400">さて、<a title="APIテストはいつやるの？今でしょう！" href="https://qiita.com/cuongceopro/items/f4bada020abdf9c91f03">前回</a>はAPIテストとは何か、そして APIテストの考え方についてお話ししました。今回は手を動かしながらAPIテストを実際にやってみましょう。</span>
<h1>何をテストするか？</h1>
<span style="font-weight: 400">APIテストは機能テスト、負荷テスト、セキュリティテストなど、さまざまなこと、ができますが、私たちはAPIテストをするとき、下記のように「White Box Testing」と「Black Box Testing」を分けて考えます。</span>


<div style="text-align: center">
<img class="alignnone size-medium wp-image-4487" style="margin-right: 20px" src="https://quesqa.com/blog/wp-content/uploads/2021/04/black-box-testing.jpeg" alt="" width="320" /> <img class="alignnone size-medium wp-image-4488" src="https://quesqa.com/blog/wp-content/uploads/2021/04/white-box-testing-1.jpeg" alt="" width="320" />
</div>
<p style="text-align: center">図１： 「Black Box Testing」と「White Box Testing」 </p>

<h3>Black Box Testing</h3>
<span style="font-weight: 400">Black Box Testingでは、入力・出力値に対して仕様通りにAPIが振る舞うかを確認します。API単位の「単体テスト」と考えて良いでしょう。要はいろいろなパターンのRequestに対して、Responseが期待通りに返ってくるかを確認します。</span>
<div style="text-align: center"><img class="alignnone size-medium wp-image-4490" src="https://quesqa.com/blog/wp-content/uploads/2021/04/API_black_box.png" alt="" width="550" /></div>
<p style="text-align: center">図２： APIテストでの「Black Box Testing」</p>

<h3>White Box Testing</h3>
<span style="font-weight: 400">White Boxでは、中身に着目して、テストを行います。中身といってもコードベースではありません。コードベースのテストは単体テストで行うべきです。
<a title="APIテストはいつやるの？今でしょう！" href="https://qiita.com/cuongceopro/items/f4bada020abdf9c91f03">前回</a>もお話ししたように、APIテストの大きなメリットは早めに結合テストを行うことができるところだと考えています。ここでのWhite Box Testingは結合テストの観点で行います。例えば、DBとの結合、他のプログラムとの結合、他のサーバとの結合、などなどです。</span>
<div style="text-align: center"><img class="alignnone size-medium wp-image-4493" src="https://quesqa.com/blog/wp-content/uploads/2021/04/API_white_box.png" alt="" width="550" />
</div>
<p style="text-align: center">図３： APIテストでの「White Box Testing」</p>

<h1>RakAPItでBlack Box Testing</h1>
<span style="font-weight: 400">
今回はまず<a title="RakAPIt" href="https://rakapit.dockyard.biz/">RakAPIt</a>を使って、Black Box Testingをやりましょう。</span>

まずProjectを作成します。サンプルのSwaggerとしてSwagger Petstoreを使います。定義はこちらにあります。
<a href="https://petstore.swagger.io/">https://petstore.swagger.io/</a>

上記サイトからSwaggerをダウンロードしてください。<a href="https://rakapit.dockyard.biz/projects" title="Projects画面">Projects画面</a>にアクセスし、Project作成モーダルを開いてください。そして、Project作成モーダルにそのSwaggerファイルをインポートします。
<div style="text-align: center"><img class="alignnone size-medium wp-image-4532" src="https://quesqa.com/blog/wp-content/uploads/2021/04/create_new_project1.png" alt="" width="550" /></div>
<p style="text-align: center">図４： Project作成</p>
<h3>テストデータ生成</h3>
<span style="font-weight: 400">画面左下にある「Swagger Information」では、API一覧が表示されます。今回は一番上にあるEndpointをテスト対象とします。右側にある「→」をクリックすると、Request Specに遷移します。</span>
<div style="text-align: center"><img class="alignnone size-medium wp-image-4496" src="https://quesqa.com/blog/wp-content/uploads/2021/04/swagger_information.png" alt="" width="550" /></div>
<p style="text-align: center">図５： Swagger Information</p>
<span style="font-weight: 400">
Endpoint、Header、Bodyに情報がすでに入力されているかと思います。これはSwaggerから情報を取って、自動で作成されます。
次にBodyタブを開いてください。右側にはBodyの形式になります。左側には、選択したEndpointに定義されているParameterの一覧が表示されます。
</span>
<div style="text-align: center"><img class="alignnone size-medium wp-image-4539" src="https://quesqa.com/blog/wp-content/uploads/2021/04/request_spec1.png" alt="" width="650" /></div>
<p style="text-align: center">図６： Request Spec画面</p>
<span style="font-weight: 400">
これからはそれぞれのParameterにデータパターンを入れます。
RakAPItは「Test Data Generation」機能を提供しています。Swaggerに定義されたParameterの定義からテストデータの自動生成が可能です。テストデータはデータの型、最大値、最小値、サンプル値などから、同値分割法・境界値分析などの複数のテスト技法を用いて生成しています。例えば、 integer型で1から10までの値を取るParameterなら、自動で0, 1, 10, 11の値が入力されます。
</span>
<span style="font-weight: 400">
全てParameterのテストデータを一括生成することはできますが、説明しやすいように今回は上の3つのParameterを対象にします。「Generate Data」ボタンをクリックし、id, category.id, category.nameを選択してください。すると、データが追加されます。
</span>
<div style="text-align: center"><img class="alignnone size-medium wp-image-4498" src="https://quesqa.com/blog/wp-content/uploads/2021/04/body.png" alt="" width="650" /></div>
<p style="text-align: center">図７： Body仕様編集</p>
<span style="font-weight: 400">他のところは正常系のデータを入力しておきましょう。</span>

<ul>
 	<li>name : (string) “doggie”</li>
 	<li>photoUrls: (string) “http://swagger.io”</li>
 	<li>tags: (array) [{ "id": 0,"name": "pet”}]</li>
 	<li>status: (string) “available”</li>
</ul>

<h3>テストケース生成</h3>
<span style="font-weight: 400">APIの定義とParameter毎のテストデータを入力できました。次はテストケースを作成していきます。</span>

各Parameterのデータパターンを組み合わせてテストケースを作成することになります。
RakAPItでは、全組み合わせとAll pairs法を用いた組み合わせができます。今回はAll pairsにしましょう。
※All pairs法：
組み合わせテストで、因子の全てのペアにおいて、全ての水準の組み合わせを1回以上入力するテストのことを指します。「全組み合わせ」ではなく、「ペアに限定した組み合わせ」をテストします。
(出典：https://www.atmarkit.co.jp/ait/articles/1506/11/news013_2.html)
</span>

<span style="font-weight: 400">最後に「Create」ボタンをクリックすると、テストケースが自動的に生成されます。</span>
<div style="text-align: center"><img class="alignnone size-medium wp-image-4500" src="https://quesqa.com/blog/wp-content/uploads/2021/04/test_cases.png" alt="" width="650" /></div>
<p style="text-align: center">図８： Test cases画面</p>
<span style="font-weight: 400">
テストケース作成には、下記のオプションがあります。
</span>
<table style="border-collapse: collapse;width: 100%">
<tbody>
<tr>
<td style="width: 25%;text-align: center" colspan="2"><b>All Combination</b></td>
<td style="width: 43%"><span style="font-weight: 400">全組み合わせ</span></td>
</tr>
<tr>
<td style="width: 10%;text-align: center" rowspan="2"><b>All pairs</b></td>
<td style="width: 40%;text-align: center"><span style="font-weight: 400"><b>No Constraints</b></span></td>
<td style="width: 43%"><span style="font-weight: 400">制約なしのAll pairs</span></td>
</tr>
<tr>
<td style="width: 40%;text-align: center"><span style="font-weight: 400"><b>Negative Testing</b></span></td>
<td style="width: 43%"><span style="font-weight: 400">All pairsを用いて組み合わせるが、異常系同士は組み合わせない</span></td>
</tr>
<tr>
<td style="width: 25%" colspan="2"><span style="font-weight: 400"><b>Add Test cases with a nonexistent parameter</b></span></td>
<td style="width: 43%"><span style="font-weight: 400">それぞれのParameterが存在しないというテストケースを追加</span></td>
</tr>
</tbody>
</table>
<span style="font-weight: 400">
また、入力されたParameterのデータパターンによって、テストケースは正常系と異常系に分けられます。正常系のResponseコードは200、異常系のResponseコードは400でデフォルトで設定されます。実際にテストするときは、APIの仕様書に従って、適切に直してください。
</span>
<h3>テスト実行</h3>
<span style="font-weight: 400">
テストケースを選択し、実行ボタンを押すと、テストが実行されます。
実行環境は「RakAPItサーバ」と「ローカル環境」で選択できます。
</span>

<ul>
 	<li>RakAPItサーバ
送信元はRakAPItサーバになります。</li>
 	<li>ローカル環境
送信元はユーザのローカルPCとなります。一般公開していないAPIやローカルPCで開発中のAPIの場合、こちらを選択してください。</li>
</ul>

<div style="text-align: center"><img class="alignnone size-medium wp-image-4502" src="https://quesqa.com/blog/wp-content/uploads/2021/04/test_result.png" alt="" width="650" /></div>
<p style="text-align: center">図９： テスト結果</p>
<span style="font-weight: 400">
他に、cURLコマンドのスクリプトを出力し、コマンドラインで実行することもできます。
</span>
<h3>アサーション設定</h3>
<span style="font-weight: 400">
RakAPItでは、テストとして Status Code、 Header及びBodyのアサーションを設定できます。
Status Codeアサーションはデフォルトで入っています。また、Headerアサーションはkeyを指定することで比較でき、Swagger定義から自動的に生成されます。Swaggerに定義されていないHeaderを確認したい場合、アサーションを追加することもできます。
</span>

<span style="font-weight: 400">
BodyアサーションにはSchema検証とPropertyアサーションがあります。
Schema検証はSwagger定義から自動生成することができます。これはResponse Body形式全体を検証するものです。また、さらに個別の値を確認したい場合はPropertyアサーションを追加してください。
</span>
<div style="text-align: center"><img class="alignnone size-medium wp-image-4503" src="https://quesqa.com/blog/wp-content/uploads/2021/04/assertion.png" alt="" width="550" /></div>
<p style="text-align: center">図１０： アサーション設定</p>
<span style="font-weight: 400">
これで、テストデータ作成からテスト実行まで一通りできました。
</span>

<h1>終わりに</h1>
<span style="font-weight: 400">
いかがでしたか。
私も数年前まではテストデータ・テストケースをExcelなどで作って、それを順番にどこかのツールでRequestを投げて、Responseを目視で確認しました。なかなか大変でした。</span>

しかし、今ではRakAPItを使うことでさまざまな過程で手間が省けるようになり、だいぶ楽になったと思います。

次回はRakAPItでのWhite Box Testingについてお話しします。
お楽しみに！

<span style="font-weight: 400">
<b>参考文献</b>：</span>

<ul>
 	<li><span style="font-weight: 400">Swagger Petstore <br />
https://petstore.swagger.io/
</span></li>
</ul>