概要
Postmanを利用してテストの自動化を実現した話。
実行ボタン一度を押すだけで、ユーザーシナリオに準じた一連のテストを実行するというもの。
導入前は1回約45分かかっていたテストが、導入後は1回約20秒近くまでに削減成功。
テスト項目の具体例
テストの主な対象項目は以下の通り
- 特定のボタンを押下した際の画面遷移
- ステータスコードに基づくリダイレクトの挙動
- 特定の操作によるメール受信
- メールに記載された確認コードを用いたログイン
- 特定項目の文字数の確認
- 古いメールアドレス/パスワードによるログイン失敗
- 新しいメールアドレス/パスワードによるログイン成功
- 既登録のメールアドレスによるログイン情報の更新失敗
- 退会済みのメールアドレスによるログイン失敗
- 退会済みのメールアドレスによる新規登録の可否
などなど。。
背景
テストの時間負荷
- 弊チームでは2週間に1回本番リリースがあり、その度にstage環境と本番待機系環境での2回のテストを実施する必要がある。
- 1回のテストで約45分かかること。
緊急リリースがある際も同じ対応を取る必要があり、簡単にリリースできない状況...
テストの複雑性
- メールを参照する必要があるテスト
- 複数アカウントを用いた新規登録、ログイン、退会の操作
- 手動で行うとミスしやすい分かりずらいテスト
ざっくりとこんな感じで、特に慣れていない人だと余計に時間がかかる...
自動化の付加価値
自動化することにより以下のようなメリットもある。
- 手間となる手動作業の排除
- ケアレスミスの防止
- 新入社員の教育工数の削減
実装
実現に使用したもの
MailSlurp
メールテストを自動化するために導入したサービスで、APIを通じてメールアドレスの生成やメール本文の参照などの操作を可能にする。
これによりテスト用メールアドレスの作成が簡単に可能になる。
※無料アカウントだと作成できるメールアドレスに上限や、送信可能数に制限があるので弊チームでは企業プランで導入
Postman
事前処理を「Pre-request script」、テスト部分を「Tests」で行い、プロダクトのエンドポイントを網羅的に検証。レスポンスの内容を次のリクエストパラメータにセットするなどしてテストを連続して実行。
共通の環境変数などは「Enviroments」に設定が可能。
自分の場合はEnviromentsでテストしたい環境、(stage1~6、本番待機系環境など)を指定することで特定環境でのテストをできるように実装
他にも、PostmanのCookieを操作したログアウトの再現や
CSRFトークンを用いて画面遷移を再現。
(弊プロダクトの認証周りでは、不正な画面遷移を防ぐためにCSRFトークンのバリデーションチェックが行われているため
JavaScript
Postman上でのテストコード作成に使用。
画面遷移の確認やログイン状態の維持、外部APIの呼び出しなどに利用
導入サンプル
例えばログイン画面に遷移できているかのテストがあったとした場合
-
エンドポイント
GET https://www.hogehoge.com/login -
Pre-request script
// Hostのcookiesを削除することで擬似的にログアウト
const jar = pm.cookies.jar();
const Scheme = pm.environment.get('Scheme');
const Host = pm.environment.get('Host');
jar.clear(Scheme + Host, error => {
if(error) {
console.error(error);
}
})
- Tests
// html取得
const $html = cheerio.load(pm.response.text());
pm.test("status code is 200", function () {
pm.response.to.have.status(200);
});
const element = $html('.login-boxIssueCode__pt01 .-heading04').text();
pm.test("画面遷移テスト", function () {
pm.expect("この文言があればOK!").to.equal(element);
});
// set params
const csrf_token = $html('[name="csrf_token"]').val();
if(csrf_token){
pm.environment.set("CSRFToken", csrf_token);
}
こんな感じのを必要な分だけ作成する
あとはフォルダ内のエンドポイントを一括実行して待つだけで完了