初めに
自動化しないままにしてしまった課題を解決し、メモしていきたいと思う。
本記事では複数のアカウントのやり取りで進むシナリオを検証する方法を考える。
(手動テストを繰り返すのは大変…)
記事の対象
CodeceptJSを使って複数のアカウントによるやり取りが発生するE2Eシナリオテストを書こうと考えている方。
CodeceptJSの高速化を考えている方。
この記事のゴール
CodeceptJSの1シナリオ上で複数のブラウザを立ち上げ、それぞれ別のユーザでログインし、それぞれシナリオをすすめ検証を行うことができるようにする。
1つのシナリオで複数セッションを使う利点
例えば以下のようなフローがあったとする。
- メンバーが上司にメッセージを送信する
- 上司がメッセージを承認する
- メンバーが承認を確認する
これを1つのブラウザで実施するとメンバーでログイン・ログアウト、上司でログイン・ログアウト~のように何度もログインログアウトを繰り返すことになる。
複数のブラウザを使って検証することでこのログインログアウトの数を削減することができる。
その分テストの高速化を図ることができる。これはCodeceptJSを使う場合も同様と考えられる。
CodeceptJSで複数のセッションを扱う方法
CodeceptJSのmultiple-sessionsを使用する。
https://codecept.io/basics/#multiple-sessions
session()
の第一引数にセッションの名称、第二引数にテストの処理を記述する。
新しい名称でセッションを指定すると新しいブラウザが開き、処理が開始される。
すでに指定済みの名称を指定すると、すでに開いていたブラウザ上で処理が行われる。
サンプルプログラム
上記のケースを簡略化した簡単なプログラムを作成する。
- 一般ユーザは管理ユーザにメッセージを送ることができる
- 管理ユーザは一般ユーザからのメッセージを確認して、承認、否認を返信できる
- 一般ユーザは自身が送信したメッセージの一覧と返信結果を閲覧することができる
テストコード
先ほど提示したフローを検証するテストコードを書いてみる。
- メンバーが上司にメッセージを送信する
- 上司がメッセージを承認する
- メンバーが承認を確認する
// hiraアカウントでログイン
await autoLogin("hiraUser");
I.amOnPage(sendMessageUrl);
I.waitForText("メッセージ送信", 10);
// hiraアカウントがメッセージを送信
I.fillField("$input-message","この書籍が欲しいです。");
I.click("$button-send-message");
// 別のセッションを作成する。
session('BOSS', async () => {
// bossアカウントでログイン
await autoLogin("bossUser");
// 承認画面に遷移
I.amOnPage(apploveMessageUrl);
I.waitForText("メッセージ承認", 10);
// hiraアカウントから送信された最新のメッセージを確認
I.see("この書籍が欲しいです。", "$message-0");
I.see("hira", "$sentby-0");
// メッセージを承認
I.click("$buttom-approve-0");
})
// hiraアカウント
I.amOnPage(sendMessageUrl);
I.waitForText("メッセージ送信", 10);
// bossに承認されたことを確認
I.see("この書籍が欲しいです。", "$message-0");
I.see("boss", "$replyby-0");
I.see("承認", "$approval-0");