AutifyでE2Eテストのリグレッションテストを自動化してみました

## 背景
自社Saasを開発運用しています。テストについては9割以上が手動でテストを行っていました。
リグレッションテストも同様に手動で実行しており、実施タイミングはリリース前に1回だけでした。
そこで不具合が見つかると慌てて修正もしくは切り戻すということを行っていました
これではまずいということでEMやりつつ一人目QAとして活動開始しました。

## Autify導入目的
- リグレッション（回帰）テストをいつでも好きな時に何度でも実行したい
- 手動によるリグレッション（回帰）テストコストを削減したい
- テストのメンテナンスコストを抑えたい
- コードを書けない人でもテストの作成・メンテナンスを可能にしたい
- 将来的にCI/CDに組み込みたい

## 自動化対象
- 自社Saasの現場クラウドConne
- 全8つの機能のうち優先機能を6つに絞った
    - 優先機能はPMと一緒に決定

## 作成の流れ
- ユーザーストーリーマッピングを実施
- 自動化するシナリオを作成
- 作成したシナリオをAutifyシナリオ化
- Autify化したシナリオステップ数を適量にする
- 出来上がったテストを安定化させる為、週1で定期実行し失敗したら対策をくり返した
- 同じシナリオをステージング環境でも実行可能に環境を整備

## ユーザーストーリーマッピングを実施
- 各機能をどのような使われ方をしているのかビジネスサイド、開発メンバーから情報収集
- 収集した情報を元にユーザー像を作成
- ユーザーがどのような流れで操作していくのかをユーザーストーリーにマッピング
- 本来、関係者集めてワイワイつくるものらしいが、拘束時間節約するため私のほうでたたき台を作成

## 自動化するシナリオを作成
- 参加者は開発メンバー全員
- 作成したユーザーストーリーに指摘を入れてもらいブラッシュアップ
- 優先度が低い操作、自動化できない操作など同意をとりながら自動化対象を絞り込みシナリオ作成

## 作成したシナリオをAutifyシナリオ化
- シナリオ作成
    - レコーディング＆リプレイ
        基本的にはテストしたい操作をレコーディングすることで作成できます
        操作した結果を確認する「確認ステップ」はレコーディング中に追加できます
    - ステップグループ
        複数のシナリオで共通の操作があるような場合、ステップグループを使って共有のステップのまとまりを作ることができます
        例えば、ログイン操作などがそれに該当します
    - JSステップ
        レコーディングでは実現できない操作や確認については、javascriptを記載することで実現します
        その際にJSステップを追加して、そこにjavascriptを記載します
        ちなみにコード例はあらかじめAutify JavaScriptスニペットとして提供されていますのでコピーして作成できます
    - 変数
        シナリオ内で共有する変数を定義することができます
        各ステップでは定義した変数を入力値や確認時の期待値などに指定できます
        JSステップの引数にも指定できます
- テストプランの作成
    - 実行環境
        - 提供されているOS＋ブラウザの組み合わせを選択する
        （契約プラン及びオプションにより提供される組み合わせが異なります）
    - 定期実行
        - 定期的に実行したい場合に設定する
        - 週間隔で曜日と時間を指定するか時間間隔のいずれかを指定できます
    - 直列・並列
        - シナリオを並列で実行するか直列で実行するか選択する
    - シナリオ
        - 作成したシナリオから選択します
    - シナリオ内のURL置換
        - シナリオ内のURLを置換します
        - 同じシナリオを異なる環境で実行するとき便利です
    - 以下は今回使用しなかった機能
        - テストプラン変数
            - テストプラン内のシナリオ間で値を引き渡す際に使えるらしい
        - メール通知
            - メールアドレスを指定するとテストプランに関するメールが通知できるらしい
        - Slack通知
            - 設定するとテストプランに関する通知をSlackに連携できるらしい
            - 今回Chatworkに連携したので別の方法でおこなった
            （別の機会に投稿しようと思う）

## Autify化したシナリオステップ数を適量にする
- 最初にAutify化したシナリオが総ステップ数300ステップほどになった
    - 実行時間が45分
- Autifyサポートセンターに作成したシナリオをレビューしてもらった
    - １つのシナリオのステップが200ステップを超えるとサポートしてくれなくなるらしい
        - 理由１：失敗した時の調査、修正に時間がかかる
        - 理由２：実行時間がかかる
        - 理由３：不安定さが増す
    - １つのシナリオのステップ数を150ステップ以内に収めたほうが良いとアドバイスあり
- シナリオのステップ数を150に収まるようにシナリオの分割を実施
    - シナリオとシナリオが干渉しないようにテストデータも分割
    - どうしても150ステップに収まらない場合は200ステップ以内なら許容
    - 実行時間が15分程度なら150ステップを超えても許容

## 出来上がったテストを安定化させる
- 出来上がったシナリオは1週間おきに定期実行させる設定をおこなった
- 失敗したら原因を特定し対策
    - Githubにissue登録して失敗の理由を分類分けして管理
- 原因がわからなくてもサポートに問合せし必ず対策を行った
    - Autifyサポートでも解決しないものは該当箇所をシナリオから除外
    - 標準機能で実現できなくてもJSステップを使うと大抵実現できた
- 1か月エラー無しのシナリオは定時実行ペースを2週間おきに調整し消費ステップ数の節約をおこなった

## 同じシナリオをステージング環境でも実行可能に環境を整備
-　Autifyの機能でシナリオ内のURLを部分置換して実行する機能あり活用
-　テストデータを準備
-　ステージング環境特有の挙動が無いように設定を調整

## 成果
- Autifyによる自動テストを活用したリリースサイクルへ変更提案
    リリース対象のマージがすべて完了したらステージング環境でAutifyによるテストを実施し,もし不具合を検出したとしてもリカバリする時間的余裕をとれるようになる予定
- ユーザーストーリマップができた
    既存のリグレッションテストのリストが全機能に対し粗めの粒度で記載されたものだったこともありユーザーストリーマッピングによりユーザーが良く使うであろう流れをユーザーストーリマップに表現することができた
- Autify運用ルールを作成できた
    - シナリオの名前やラベルは検索しやすいようにルール化
        作成中のシナリオや、古いバージョンのシナリオなど運用を続けていくとシナリオが増加してくるのでルールがないとお目当てのシナリオが探せなくなる
    - シナリオのステップ数は150Step上限を目途にする
        200ステップを超えるとサポート対象外になってしまいますし、実行時間が長くなってしまいます
    - ステップグループはむやみに沢山つくらない
        シナリオからステップグループを作るのか簡単ですが、ステップグループを解除して元のシナリオに戻すのは手間がかかります
    - 何度も実行することを考慮する
        テスト前の状態に戻してシナリオを終了する
        なるべく並列実行できるようにシナリオ、テストデータを作成する
    - 実行ステップ数には上限があるのでむやみに実行しない
        失敗したテストは再実行により実行する（再実行ならカウント対象外）
    - Autifyでできないこと
        - 複数ファイルを選択してからのファイルアップロード操作
        - フォルダを選択してからのアップロード操作
        - D&D操作
            JSステップでできることがサポートサイトに掲載されているができなかった
        - クリップボードからの貼り付け
            例えばリンクをコピーしてから貼り付け
        - 他にも細々ありますが
            サポートセンターがとても充実しています
            困ったらまずはサポートセンターに問合せしてみるとよいです
            Autifyが対応してなくても何らか回避策を提供していただけます
- リグレッションテストの自動化率
    - 手動で行っていたテストを自動化できた割合
        75.97％
        ユーザーストーリーマッピングからシナリオを作りなおしたので100％にならなくてもOK
        Autifyでテストできない項目は今までどおり手動でテストを実施する
- テスト実行回数
        手動で行っていた時と比較し、266.67％増加
- 定性面の成果
        運用期間がまだ短いため、来期上期の終了時点で運用メンバーにアンケートを取ってみる予定

## 今後の展望
- SREと連携して待機系へのリリースが完了したらAutifyでテスト実行できように検討を進める
- Autifyによる自動テスト運用をConne開発チームに移管していく
- 来期上期を目途にConne開発チームに対しアンケートを取り定性面の成果を確認する
- 別のプロダクトにてAutifyのシナリオ作成が開始しているので週次定例で運用フォローを入れていく
- Autifyの自動テストだけではなく、より高速にフィードバックを得られるユニットテスト、統合テストを備えていく活動を強化していく
- プロダクトコードを修正した後、これらのテストを実行して修正が他の機能を壊していないことを即座に確認できる状態を目指す
- SREと連携してCI/CDに向けての次のステップを検討していく