はじめに

皆さん、テスト自動化に取り組んでいますか?最近では有償・無償を問わず多くのテスト自動化ツール・サービスがあるので、自動テストに挑戦したことがあるという方は多いかと思います。しかし、導入してみたものの運用できず、諦めてしまったという方もまた多いのではないでしょうか。この記事では、自動テストの中でも「E2E(エンドツーエンド)テスト」に対象を絞って、自動化を成功に導くためのコツをお伝えします。

◆連載|テスト自動化の習慣を最速で定着させるためには
第1回:E2Eテストの自動化を最速で成功させる秘訣
第2回:毎日の自動テストを無理なく続けるためのキーワード
第3回:共通処理を活用してさらに効率的に自動化を進めよう

自動テストを対象の粒度で分類すると、以下の3つに分けられます。(出典:「初めての自動テスト」オライリー・ジャパン)

  • UIテスト:エンドユーザと同じくユーザーインターフェースを操作して行うテスト
  • 統合テスト:ユーザーインターフェースは使わず、その基盤となっているサービスの疎通を確認するテスト
  • ユニットテスト:プログラムの小さな単位をコードレベルでテストする、高速なテスト
図1 テストのピラミッド

この記事で「E2Eテスト」と呼ぶのは、上の分類で言うと「UIテスト」と同じものです。システム全体が問題なく結合し動作していることを外側からテストするという意味で「エンドツーエンド」という言い方をしています。

E2E自動テストで陥りやすい罠

自動テストが運用に至らない理由は様々ですが、たとえば以下のようなことが考えられます。

  1. 自動化したいテストの内容がツールで実現できなかった
  2. テスト作成の工数が取れなかった
  3. テスト結果が不安定で、信頼性のあるテストとならなかった
  4. 仕様変更にテストの変更が追いつかず、テストが陳腐化してしまった

中でも非常に多いのが4.の課題です。自動テストは一度作って終わりではなく、テスト対象のシステムに追随して常に変化し続ける必要があります。これが出来なくなると「テスト失敗≠不具合検出」となり、せっかく作ったテストが無駄になってしまいます。開発と同時に書かれて自然にメンテナンスできるユニットテストとは異なる、E2Eテスト特有の課題と言えるでしょう。この問題を防ぎ、きちんと不具合を検出できる「生きた」自動テストの習慣を組織に定着させるためには、「自動化の目的設定」「自動化を進める順序」が重要になります。

自動化の目的とは

「テスト自動化の目的=テストの工数を減らしてコスト削減」と考えがちですが、コスト削減のみを目的として掲げることはあまりおすすめできません。運用可能な自動テストを構築するにはそれなりの工数がかかります。テストの工数だけに着眼して「手動でテストを実行する時間」と「自動テストを作成する時間」を比較すると簡単に数十倍の差が出てしまうため、「コストを回収するのに何年もかかるなら自動化しなくて良い」という結論になってしまうこともあります。

代わりにおすすめしたいのは、「不具合・トラブルを迅速に検出することで開発・QA双方の生産性を向上させる」という目的です。自動テストは人的リソースを気にすることなく頻繁に実行できるので、開発環境で毎日実行することにより、開発期間中の不具合にすぐに気づくことができます。

開発者にとっては、不具合が迅速に検出されることで容易に修正できるというメリットがあります。もし開発期間が完了した後に不具合が見つかったとすると、開発期間中に追加された多数の変更の中からその原因を特定するのに大きな労力がかかります。特定できても、開発者が問題の変更を入れてから時間が経っているので、内容を思い出して修正するのに時間がかかります。また、開発中のコードに不具合があると、多くの開発者が開発中にその問題に遭遇し、調査に余計な時間を割かれます。テストを毎日実行することで、開発・テスト環境をクリーンに保ち、生産性を落とさずに開発業務を行えます。

一方、QAチームから見ても大きなメリットがあります。もし不具合が開発期間後のテスト期間中に見つかったとすると、その不具合の修正を待つ間テストのスケジュールは遅れ、リリース遅延にもつながります。また、テスト期間中にも毎日自動テストを回すことで、期間中に入った修正によるリグレッション(一度動作していた箇所が動作しなくなること)にも気づくことができます。

成功の鍵は「毎日テストを回す」習慣

前節でも述べたとおり、「開発・QAの生産性を向上させる」という目的は「毎日テストを回す」ことと直結しています。実は、これが自動テストを組織に定着させる秘訣なのです。毎日テストを実行することで、以下のような効果があります。

  • 毎日自動テストのメリットを実感することになるのでチームメンバーが恩恵を実感しやすく、毎日結果を確認するので習慣化も進む
  • 月1回や週1回しか回さない時と比べて単純に実行回数が多く、自動化の費用対効果が向上する
  • 毎日のテストの場合「手で実行する」ことは不可能なので、メンテナンスが大変なことがあっても「やっぱり手動テストでいいや」ではなく「頑張ってメンテナンスしよう」というマインドになる
  • チーム全体で自動テストをメンテナンスする意識が高まるため、最初に導入を進めたメンバーがいなくなった後でも自然と運用を続けやすい

逆に、せっかく自動テストを作ってもリリース前にしか流さない場合はこの記事の最初に出てきたような問題が起こりがちです。

  • 開発期間中の変更を全部まとめてテストするので、エラーが出たときに自動テストの問題なのか実際に不具合があるのかの切り分けが難しい
  • 切り分けが難しいためエラーが放置されてテストがメンテナンスされず、「いつも失敗している」テストとなって実質的に陳腐化する
図2 自動テストの運用方法による違い

筆者はMagicPod(https://magicpod.com/)というテスト自動化プラットフォームの開発をしています。長期間に渡って自動テストを活用し成果を上げているお客様の多くは、実際に「開発・QAの生産性向上」というメリットを重視し、毎日テストを実行されています。勿論MagicPodの社内でも当初より毎日自動テストを実行していますが、他にも色々と注意すべき点がある中で、沢山のお客様のお話を伺ってきてやはり最も重視すべきは「毎日実行すること」だという思いを強くしました。

立ち上げ時はとにかく小さく

さて、実際にテスト自動化を始めようとしたときまず行うことは何でしょうか(ツール選定は済んでいるものとします)。最初に作るべきは、

  • 開発中のシステムの最新のバージョンに対して
  • 毎日何らかのテストが実行され
  • 結果がチームに通知される

という仕組みです。テストの数は1つでかまいません。対象のシステムに対して、最低限動作していなければいけない重要な動作を選んで自動化してみましょう。1ケース作成したら、ケースを増やす前に繰り返し実行するための仕組みを先に作ります。チームで運用する基盤になると同時に、作成したテストケースが安定して動作していることを簡単に確認できるようになります。

1ケースだけではなかなか不具合の検出まではされませんが、場合によっては開発中にときたま起こる致命的な問題(重要な画面遷移ができないなど、QAの作業をブロックしてしまうような問題)を検出できることもあります。

これだけ?と思われるかもしれませんが、チームにテスト自動化を浸透させるときに最も重要なのは早くアウトプットを出すことです。小さくてもアウトプットが見えていれば、上司やチームメンバーから継続することへの理解が得やすくなります。また、自動テストがどんな風に動き、どんな通知が来るのかを早めに見せておくことで、メンバーが運用イメージを持ちやすくなります。

本格導入へのステップ

テストを毎日実行する基盤ができたら、本格的に自動テストを拡大していきます。次のような順番がおすすめです。

  1. まずは最初の1ケースを毎日実行する
  2. 少しずつケースを増やして様子を見る
  3. システムの一通りの機能を広く浅く網羅する
  4. ケースを増やさない運用期間を設ける
  5. E2E以外の手段も考慮しつつケースを拡充する

1.は立ち上げ時に達成されているはずです。2.以降について1つずつ解説していきます。

少しずつケースを増やして様子を見る

毎日テストを実行してみると、テストの安定性など、実行してみるまで気付かなかった様々な問題にぶつかります。これらを解決しながら、少しずつテストを増やしていきます。まとまった時間を確保して一気にテストを作り、その後毎日回した方が効率がよいと感じるかもしれませんが、それは幻想です。メンテナンスできるかどうか検証されていない大量のテストがいきなり増えても、誰もメンテナンスできずすぐに使われなくなります。少しずつ検証しながら、着実にチームに浸透させていきましょう。

この段階で、継続運用のための仕組みやルールもさらに整備していくと良いでしょう。たとえば、以下のようなポイントが考えられます。

  • テストケースの実装のための規約(命名規則、共通化する単位など)の決定
  • 繰り返し実行しても同じ結果になるためのテスト環境のデータ整備
  • 日時の計算が絡むテストを、日付が変わっても繰り返し成功させるための仕組み

システムの一通りの機能を広く浅く網羅する

まずは基本的な機能や画面が一通り動くかのチェックを自動化します。1つの機能に対し様々な条件で詳細に自動化するのではなく、広く浅く一通りの機能・画面を網羅しましょう。これまで実行していた手動テスト用のテストケースを上から順番に自動化してはいけません。優先順位をつけて、まずは基本的なテストケースだけを自動化します。

ここまで来れば、主要な機能のリグレッションが自動テストで検知できるようになります。

ケースを増やさない運用期間を設ける

いったんケースの拡充を止め、1〜2ヶ月ほど運用してみてきちんとメンテナンスできるか、チームでの運用に課題がないかを確認します。運用時に必要な作業は主に

  • 毎日の実行結果のチェック、エラーの切り分け(システムの不具合かテストケースの不備か、その他の外部要因か)
  • 不具合の場合は報告
  • テストケースの不備の場合は修正

となります。こういった作業が大きな負担なく行えるかを確認します。E2Eテストは一般的にユニットテストよりも結果が不安定になりやすいですが、あまりに不安定なものが多いと切り分けに時間がかかり運用の負担が大きくなります。テストケースの実装を工夫するか、どうしても難しい場合には自動テストから除外するといった判断が必要になります。

E2E以外の手段も考慮しつつケースを拡充する

きちんとメンテナンスができそうだということが分かったら、エラーメッセージの動作確認や特殊な状況下での動作確認など、より複雑なテストケースの自動化に進みます。ただし、すべてをE2Eでテストすると実行時間も長くなりますし無駄が多くなります。複数のサブシステムや外部サービス等を含めた疎通が必要な場合はE2Eテストが有効ですが、そうでない場合はテストしたい内容に応じてユニットテストやAPIテストも利用し、より迅速なフィードバックサイクルを作りましょう。

まとめ

E2Eテスト自動化を最速で成功させるためには

  • 目的の設定:問題の早期検出による開発&QAの生産性向上
  • 進める順序:テストを毎日実行可能な状態にし、その後テストの数を増やす

という2つの軸が重要です。

少しずつ着実にテストを積み重ね、持続可能なテスト自動化を目指しましょう!

連載一覧

第1回:E2Eテストの自動化を最速で成功させる秘訣
第2回:毎日の自動テストを無理なく続けるためのキーワード
第3回:共通処理を活用してさらに効率的に自動化を進めよう

SHARE

  • facebook
  • twitter

SQRIPTER

玉川 紘子(たまがわ ひろこ)

株式会社MagicPod テックリード

記事一覧

様々な現場へ自動テストを導入・運用する経験を経て、2019年より機械学習を活用した自動テストプラットフォーム「MagicPod」の開発に従事。子育てと仕事の両立に日々奮闘中。

訳書:「初めての自動テスト」「Seleniumデザインパターン & ベストプラクティス」(監訳)

RANKINGアクセスランキング
#TAGS人気のタグ
  • 新規登録/ログイン
  • 株式会社AGEST
NEWS最新のニュース

Sqriptsはシステム開発における品質(Quality)を中心に、エンジニアが”理解しやすい”Scriptに変換して情報発信するメディアです

  • 新規登録/ログイン
  • 株式会社AGEST