mablのテストケースを1.5倍にして実行時間を1/3にしました
こんにちはkubopです。
noteではmabl(E2EテストのSaaS)というツールを利用しているのですが、色々な課題があり、ひとつひとつ紐解いて整備してみました。
mabl利用時の課題
テストの粒度がそれぞれ異なり、網羅性が不明
明確なストーリーを伴った、まとまりのあるテストスイートではなく、各人がそれぞれ追加しているテストケースが多く、全体としてどの程度何が網羅されているのかが不明瞭、作成ルールが無かったため粒度がそれぞれ異なっていました。
実行速度が遅い
実行時間が最速で30分程度かかっており、どうしても実行するのに障壁がありました。
特定の環境でしか動かない
データが特定の環境に依存したテストケースがあり、別の検証環境で実行出来ずに特定の環境を占有してしまう、またはmablを動かしたいが故に順番待ちが発生してしまっていました。
解決策
テストケースの洗い出しをした
ざっくりとE2Eで担保するラインを定義しました。
機能が生きているか、死んでいるかの判断を出来るようにする。
デグレが発生していないかの判断を出来るようにする。
細かなテストケースは小テスト・中テストで担保する。
手動でのテストケースをまず作成し、何度も実行する可能性がある場合にE2Eのテストケースに追加する。
そして、noteの機能をある程度粒度をそろえて分類しました。
コンテンツ
全ての創作活動をするアクション(ノートを書く、など)
アクション
ユーザー対ユーザーのアクション
ユーザー
自ユーザーに対するアクション
課金
金銭を伴うアクション
pro
note proに関わる重要なアクション
既存テストのリファクタ・整理
FLAKYで落ちてしまうテストを微調整して、変更がない場合に落ちにくいテストに修正しました。
特に、画面遷移が速すぎて落ちてしまうものに関しては構成を変えながら調整していきました。(waitはなるべく使わない)
また、適切な粒度となるようにテストケースをマージしたり、逆に切り離したりしました。
環境に依存しているデータの置き換え
直接特定環境に依存しているデータを利用しているテストケースを洗い出し、ひとつひとつ新規データを作成できるように修正しました。
特に利用されるデータセットに関しては、検証用のコマンドで一括で作成できるよう実装しました。
共通フローの洗い出し
処理が共通すると思われる部分を抜き出し、共通化しました。
DRYにすると脆いテストになると思われるのですが、共通化することで一つ一つ直さなくても良い、変更に強く、さらに修正しやすいような粒度となるように設計しなおしました。
特に新規登録からログインの機能部について共通化・高速化をしました。
作成ルールを定義
共通の処理をドキュメント化、共通処理が重複しないようなルール作り。
テストケースの粒度を保つためのレビューフローの整備をしました。
Slackスタンプで実行できるように
今まではコマンドを打ち、特定環境にてjenkinsを用いてmablを実行していたのですが、上述の通り環境占有・環境の待ち状態が発生してしまうため、別の環境でもコマンドで実行しわけられるように変更しました。
その際に、github actionsを利用して実行できるように変更しました。(管理が簡単なため)
また、Zapierを使って、検証環境へのデプロイ後にSlackのスタンプひとつで実行できるようにしました。
結果として
mabl実行時間が1/3に減少
元々30分程度かかっていたmablでのテストスイート実行が、1.5倍程度テストケースを増やしたのにもかかわらず7分で終了できるようになりました。
FLAKYテストが減少
ほとんど必ず失敗していたテストケースが、最低リトライ1回程度で回復するようになりました。
変更や不具合が入らない限り、常にオールグリーンとなる状態となりました。