皆さんこんにちは、ヒューマンクレストのマイです。
新型コロナウイルスの影響により日々の生活が変化しつつありますが、 皆さまいかがお過ごしでしょうか。
一日も早く終息して、平和な日常生活に戻れるように心より願っています。
さて、前回はAPIテストとは何か、そして APIテストの考え方についてお話ししました。今回は手を動かしながらAPIテストを実際にやってみましょう。
何をテストするか?
APIテストは機能テスト、負荷テスト、セキュリティテストなど、さまざまなこと、ができますが、私たちはAPIテストをするとき、下記のように「White Box Testing」と「Black Box Testing」を分けて考えます。
図1: 「Black Box Testing」と「White Box Testing」
Black Box Testing
Black Box Testingでは、入力・出力値に対して仕様通りにAPIが振る舞うかを確認します。API単位の「単体テスト」と考えて良いでしょう。要はいろいろなパターンのRequestに対して、Responseが期待通りに返ってくるかを確認します。
図2: APIテストでの「Black Box Testing」
White Box Testing
White Boxでは、中身に着目して、テストを行います。中身といってもコードベースではありません。コードベースのテストは単体テストで行うべきです。
前回もお話ししたように、APIテストの大きなメリットは早めに結合テストを行うことができるところだと考えています。ここでのWhite Box Testingは結合テストの観点で行います。例えば、DBとの結合、他のプログラムとの結合、他のサーバとの結合、などなどです。
図3: APIテストでの「White Box Testing」
RakAPItでBlack Box Testing
今回はまずRakAPItを使って、Black Box Testingをやりましょう。
まずProjectを作成します。サンプルのSwaggerとしてSwagger Petstoreを使います。定義はこちらにあります。
https://petstore.swagger.io/
上記サイトからSwaggerをダウンロードしてください。Projects画面にアクセスし、Project作成モーダルを開いてください。そして、Project作成モーダルにそのSwaggerファイルをインポートします。
図4: Project作成
テストデータ生成
画面左下にある「Swagger Information」では、API一覧が表示されます。今回は一番上にあるEndpointをテスト対象とします。右側にある「→」をクリックすると、Request Specに遷移します。
図5: Swagger Information
Endpoint、Header、Bodyに情報がすでに入力されているかと思います。これはSwaggerから情報を取って、自動で作成されます。
次にBodyタブを開いてください。右側にはBodyの形式になります。左側には、選択したEndpointに定義されているParameterの一覧が表示されます。
図6: Request Spec画面
これからはそれぞれのParameterにデータパターンを入れます。
RakAPItは「Test Data Generation」機能を提供しています。Swaggerに定義されたParameterの定義からテストデータの自動生成が可能です。テストデータはデータの型、最大値、最小値、サンプル値などから、同値分割法・境界値分析などの複数のテスト技法を用いて生成しています。例えば、 integer型で1から10までの値を取るParameterなら、自動で0, 1, 10, 11の値が入力されます。
全てParameterのテストデータを一括生成することはできますが、説明しやすいように今回は上の3つのParameterを対象にします。「Generate Data」ボタンをクリックし、id, category.id, category.nameを選択してください。すると、データが追加されます。
図7: Body仕様編集
他のところは正常系のデータを入力しておきましょう。
- name : (string) “doggie”
- photoUrls: (string) “http://swagger.io”
- tags: (array) [{ “id”: 0,”name”: “pet”}]
- status: (string) “available”
テストケース生成
APIの定義とParameter毎のテストデータを入力できました。次はテストケースを作成していきます。
各Parameterのデータパターンを組み合わせてテストケースを作成することになります。
RakAPItでは、全組み合わせとAll pairs法を用いた組み合わせができます。今回はAll pairsにしましょう。
※All pairs法:
組み合わせテストで、因子の全てのペアにおいて、全ての水準の組み合わせを1回以上入力するテストのことを指します。「全組み合わせ」ではなく、「ペアに限定した組み合わせ」をテストします。
(出典:https://www.atmarkit.co.jp/ait/articles/1506/11/news013_2.html)
最後に「Create」ボタンをクリックすると、テストケースが自動的に生成されます。
図8: Test cases画面
テストケース作成には、下記のオプションがあります。
All Combination | 全組み合わせ | |
All pairs | No Constraints | 制約なしのAll pairs |
Negative Testing | All pairsを用いて組み合わせるが、異常系同士は組み合わせない | |
Add Test cases with a nonexistent parameter | それぞれのParameterが存在しないというテストケースを追加 |
また、入力されたParameterのデータパターンによって、テストケースは正常系と異常系に分けられます。正常系のResponseコードは200、異常系のResponseコードは400でデフォルトで設定されます。実際にテストするときは、APIの仕様書に従って、適切に直してください。
テスト実行
テストケースを選択し、実行ボタンを押すと、テストが実行されます。
実行環境は「RakAPItサーバ」と「ローカル環境」で選択できます。
- RakAPItサーバ
送信元はRakAPItサーバになります。 - ローカル環境
送信元はユーザのローカルPCとなります。一般公開していないAPIやローカルPCで開発中のAPIの場合、こちらを選択してください。
図9: テスト結果
他に、cURLコマンドのスクリプトを出力し、コマンドラインで実行することもできます。
アサーション設定
RakAPItでは、テストとして Status Code、 Header及びBodyのアサーションを設定できます。
Status Codeアサーションはデフォルトで入っています。また、Headerアサーションはkeyを指定することで比較でき、Swagger定義から自動的に生成されます。Swaggerに定義されていないHeaderを確認したい場合、アサーションを追加することもできます。
BodyアサーションにはSchema検証とPropertyアサーションがあります。
Schema検証はSwagger定義から自動生成することができます。これはResponse Body形式全体を検証するものです。また、さらに個別の値を確認したい場合はPropertyアサーションを追加してください。
図10: アサーション設定
これで、テストデータ作成からテスト実行まで一通りできました。
終わりに
いかがでしたか。
私も数年前まではテストデータ・テストケースをExcelなどで作って、それを順番にどこかのツールでRequestを投げて、Responseを目視で確認しました。なかなか大変でした。
しかし、今ではRakAPItを使うことでさまざまな過程で手間が省けるようになり、だいぶ楽になったと思います。
次回はRakAPItでのWhite Box Testingについてお話しします。
お楽しみに!
参考文献:
- Swagger Petstore
https://petstore.swagger.io/