業務円滑化テクニック -Postmanで連続APIを実行/リザルトの充実化-
つーじーです。『社会の荒波」とはよく言いますが、結局何を以って『社会の荒波』と言うのでしょう? 人それぞれで答えが変わりそうな気はします。
さて、今回は自動APIテストツール『Postman』の業務円滑化テクニックをご紹介します。
■Postmanとは
PostmanはAPIの実行処理をサポートしてくれるツールで、設定が面倒なAPI設定を視覚的にわかりやすくしたUIになっていたり、スクリプトを記述してレスポンスがあった際に特定の処理を実行してくれる機能があったり、それらの実行結果をリザルトとしてまとめたり、モックサーバーの設定、環境変数の設定などなど、様々な機能が備わっております。
自動APIテストツール 『Postman』
本当に様々な機能が備わっておりますが、本稿では
- CSVを活用して連続でAPIを実行する方法
- 連続実行したAPIのリザルト情報の中身を充実化させる方法
に絞ってご紹介をしたいと思います。
※本稿に記載されているパラメータ情報やID名はすべて、本稿用に作成したダミーデータを使用しています。
【はじめに】リザルトについて
後述するAPI連続自動テストをデフォルト設定で実行すると以下のようなリザルトが作成されますが、
これだけではどのAPIを試した時の結果か識別ができません。後述するTestsの中身に大幅なアレンジを加えることで、ここの情報を充実させる事を目指します。
■CSVを活用したAPI連続実行
Postmanには、CSVを活用して同一のAPIの一部のパラメータを変えつつ連続実行する機能があります。そのCSVの使い方と利用方法をご紹介します。
ID一覧のCSVファイルを作成
以下のような形式でCSVファイルを作成します。ヘッダー名は任意です(後に変数名として使用します)。APIで使用するデータ形式に合わせて中身を記述します。
ExcelからCSV形式で保存する場合は「 CSV (コンマ区切り) (*.csv) 」で保存すれば確実にPostmanで利用できます。
Postmanでコレクションを作成
※Postmanの導入や初歩的な使い方については割愛します。以降の記述はPostmanが実行可能な状態で基本的な使い方がわかっていること前提で話が進行します。
自動APIテスト用に新規collectionを作成します。名称は任意です。
API実行のためにはParamsやHeadersにパラメータ設定が必要になりますが、その辺の説明は割愛します。
Testsの記述(リザルト情報の中身を充実化させる方法)
Testsタブを選択して以下のようなスクリプトを記述します。
const stringWithVars = pm.iterationData.replaceIn("test_id:{{test_id}} sample_id:{{sample_id}} ");
const stringWithResponse = pm.response.text();
var numberWithResponse = pm.response.code;
var numberWithVars = pm.info.iteration+1;
pm.test(stringWithVars + " CSV" + numberWithVars + "行目 - Status code : " + numberWithResponse + " | ResponseBody : " + stringWithResponse, function () {
pm.response.to.have.status(200);
});
- pm.iterationDataメソッドを使用すると、連続処理実行中にデータファイル(CSVファイル)の変数にアクセスすることができます。replaceIn関数で、任意の文言の中にCSVファイル内のワードを代入することができます。CSV内のヘッダー名を『{{}}』で囲んだものを記述すれば、その情報を取得することができます。
"test_id:{{test_id}} sample_id:{{sample_id}} "
↓テストが実行されてCSVファイルのIDが代入される"test_id:1 sample_id:100001 "
代入できたら「const stringWithVars」で定義した変数にテキストを格納します。 - pm.response.text()はResponseBodyの中身を取得する関数です。「const stringWithResponse」で変数を定義し、そこにResponseBodyのテキストを格納します。
- pm.response.codeを使うとステータスコードを取得できます。「var numberWithResponse」で変数を定義し、そこにステータスコードを格納します。
- pm.info.iterationで『現在何週目か』を取得します。イテレーションナンバーは0から始まるため+1しておきます。「var numberWithVars」で変数を定義しそこに数値を格納します。
- 『stringWithVars + ” CSV” + numberWithVars + “行目 – Status code : ” + numberWithResponse + ” | ResponseBody : ” + stringWithResponse』の部分でリザルトに表示させる文章を定義しています。””の中身は静的テキストで自由に記述できます。
- 「pm.response.to.have.status(200);」はステータスコードが200だったらtrueを返すテスト処理です。
- 上記画像ではAPIリクエスト用のURL内に変数{{test_id}}{{sample_id}}を設定しておりますが、スクリプトの内部やParams、Headersなどにも設定可能です。
- 変数名はすべて任意でOKです。
Runを選択
リクエスト単体ではなく、それを統括するコレクション部分を選択状態にして、『[▶]Run』 を選択します。
CSVファイルを選択/Iterations(周回数)を設定
『Select File』を押してID一覧のCSVを選択。『Iterations』はCSVを何行読み取るか(連続処理を何回実行するか)を指定する所ですが、CSVに問題がなければIterationsはCSVを読み込むと同時にその行数分を自動で設定してくれます。Iterationsの数値をいじって連続処理実行回数を制限することも可能です。
『Preview』を押せば読み込んだCSVの中身を見ることができます。想定通りにデータが読み込めているか、文字化けが起きていたりしないかなど確認しておくのがおすすめです。
『Run {コレクション名}』を押して実行
CSVを読み込んだボタンの下にある「Run {コレクション名}」を押してAPIを連続で叩く処理を実行します。
実行後はリザルトを出力してください。
Export Results
リザルトを出力します。(『Testsの記述』で指定したデータを出力している所)
デフォルトだとjson形式での出力となります。必要に応じてファイル形式を変更してください。(添付画像はtxt形式で出力。出力時に拡張子を「.json」→「.txt」に書き換えればOKです)
Testsに記述したスクリプトによって、 CSVから読み込んだIDとそのCSVの現在の行数、ステータスコード、取得したResponseBodyの中身を見ることができます。冒頭のデフォルト設定でのリザルト生成よりもかなりわかりやすい見た目となりました。
以上で連続APIの実行、リザルト情報の充実に関する解説を終了します。
■補足:その他テストに使えそうなTests構文
今回初めてPostmanを調べてみて、他にも実務に使えそうな構文があったのでいくつかピックアップいたします。
①ResponseBodyの中身精査(2種)
pm.test("Body matches string", function () {
pm.expect(pm.response.text()).to.include("string_you_want_to_search");
});
pm.test("Body is correct", function () {
pm.response.to.have.body("string_you_want_to_search");
});
上記の “string_you_want_to_search” の中に任意のワードを入れれば、ResponseBodyの中に特定のワードが入っているかをチェックできます。
例えば「 “イーツーインフォ” 」と指定すれば、ResponseBodyの中に「イーツーインフォ」のテキストがあればtrueを返します。
pm.expect(pm.response.text()).to.include(“string_you_want_to_search”); のほうが部分一致、
pm.response.to.have.body(“string_you_want_to_search”); のほうが完全一致での検索となります。
②複数のステータスコードの判定
pm.test("Status code is 201 or 202", function () {
pm.expect(pm.response.code).to.be.oneOf([201,202]);
});
上記のような記述をすれば、ステータスコードが201、または202の時にtrueを返します。
③レスポンスタイムが一定秒数内に収まっているか
pm.test("Response time is less than 200ms", function () {
pm.expect(pm.response.responseTime).to.be.below(200);
});
上記のような記述をすれば、レスポンスタイムが200ms未満の時にtrueを返します。
(英語では「未満」でも「以下」でも「below」を使用するため、正確にはどちらなのかわかりませんでした。)
様々な技術を勉強して業務を円滑化していきましょう。今回はこれにて。