テスト自動化の目的

 最近あるMLでテスト自動化の目的について考える機会があったのですが、今回は整理としてそこで言及したことをまとめたいと思います。

色々な目的

 よく言及されていますが、テスト自動化の目的は単に「人がやっていることをツールにやらせて楽をする」といったものに限りません。思いつくものでも、例えば以下があります。

  • 繰り返し作業を効率化する
    何度も繰り返す作業を自動化して、繰り返しによる作業重複分を効率化します。
    • 継続的なテストの実現
      テストの繰り返し実行を容易にして、高頻度の回帰テストを実現します。例えばCIへのテストの組み込み等を実現します。
      • 素早いフィードバックの実現
        継続的なテストの実現により、コミットといった小さな追加・変更のステップごとのテスト実行を実現します。これによりプロダクトやテストの追加・変更を小さな単位でテストをしつつ進められるようにします。
      • バグの早期検出の実現
        頻繁な回帰テストの実行により、より短いスパンでバグ混入を検出できるようにします。
    • 時系列の評価の効率化
      テストの評価(カバレッジや進捗評価等)を頻繁に実行可能にして、時系列の推移の評価を容易にします。例えばコードカバレッジの低下を監視して、ユニットテストの劣化を評価する等します。
    • テストの維持
      テストのビルドエラーや実行エラーの高頻度なチェックを実現して、テストを常時使用可能な状態に維持するため保守作業をサポートします。
    • 組み合わせやカバレッジの拡充
      実行手順を自動化することによって、テスト実行の入力(テストデータや操作、設定等)の数や組み合わせを容易に増やせるようにします。
  • 複雑な作業を簡略化する
    複雑で手間のかかる作業を自動化でサポートします。
    • 手間のかかる実行手順を簡略化
      人手がかかる作業を自動化でサポートします。
    • テストデータの簡略化
      テストデータの自動生成を行うことで、テストデータの抽象化・簡略化を実現します。
    • テスト設計の簡略化
      テストケースの自動生成を行うことで、テスト設計作業を簡略化します。例えば状態遷移表や原因結果グラフから自動的にテストケースを求める等します。
    • テスト設計の入力の簡略化
      テストケースの自動生成を行うことで、テスト設計の入力の抽象化・簡略化を行います。例えばセキュリティ検証ツールの導入でソフトウェアによらない標準的な検査を追加したり、あるいは非常に簡単なモデルや仕様記述言語から冗長性を持つテストケースを生成させたりします。
  • 人間の曖昧さを排除する
    自動化によりミスや判断のぶれ、属人的な偏りを軽減します。
    • 再現性の確保
      テストの実行手順・結果をいつでも再現可能にします。またテスト実行時の情報を後から追跡可能にします。
    • 属人的な判断の排除
      論理的・機械的に正確な判断を実現します。またテスト作業中の判断の根拠を後から追跡可能にします。
    • 人為的ミスの防止
      ミスしやすい作業を自動化で代行したり、ミス検出のチェック作業を自動化で支援したりします。
    • 統計的・数学的な整合性の確保
      例えばランダムテストでも、一様乱数、正規分布など適切な分布や網羅性、確率に則ったパターンに基づいてテストできるようにします。
  • 時間・環境の制約を回避する
    自動化によってテスト実行上の時間的・環境的な制約を緩和します。
    • 時間の制約を回避する
      例えば人手のいない夜間のテスト実行を実現したりします。あるいはテストの並列実行など実現します。
    • 環境の制約を回避する
      例えば自動化で専用のテスト環境を容易に使えるようにして、開発環境とテスト環境を分離して開発を効率化したり、数の限られたテスト環境を複数人で共有可能にしたりします。
    • リソースの共有を効率化する
      例えば自動化で専用のテスト環境を容易に使えるようにして、テスト環境のリソース割り当て管理、変更管理、結果の共有などを効率化し、テスト環境の共有をより容易にします。

自動化の目的の軸

 上記のようにテスト自動化の目的は様々ですが、整理の軸として観点を絞ると考えやすくなります。例えば以下のような観点を用いると、自動化の目的を整理できるようになります。

テストプロセスのフェーズ
  • テストの設計を自動化する
  • テストの実行を自動化する
  • テストのモニタリングを自動化する
  • デバッグ関連作業・不具合管理を自動化する
テスト実行の4フェーズ
  • Setupを自動化する
  • Exerciseを自動化する
  • Verifyを自動化する
  • Teardownを自動化する
ロール
  • 開発者をサポートする
  • 検証者をサポートする
  • 管理者をサポートする
既存のテスト/新規のテスト
  • 既存の作業を自動化する
  • 自動化により新たな作業を実施可能にする:例えば人手が使えない夜間実行を実現する等
作業そのもの/作業の繰り返し
  • 作業を効率化する
  • 作業の繰り返しを効率化する

さいごに

 テスト自動化を活用できる領域は現場によって様々なので、上記のリストは一律に適用できるものではありません。ただできること(目的)とそのやり方を広く把握しておくと、問題解決や改善の糸口にはなると思います。