Closed22

Googleのソフトウェア・エンジニアリング 11章 テスト概観

akkyakky

11.1

手作業のテスト → 開発者手動の自動化されたテスト への進化

自動テストの目的は

  1. バグを補足すること
  2. 変化を可能とする能力に備えておくため
  3. (システムの設計の改善)

Googleにて、自動テストのプロセスを全社的にスケールさせる際に学んできた知見から学ぶ。

akkyakky

Googleのプロジェクトの一つであるGoogle Web Server(GWS)では、新規変更に対して必ず自動テストを含めるというポリシーを制定した結果、hotfixが半減した。

バグが発生するたびにデバッガを使用してバグを調査するコストと比べて、自動テストのコストは低い。

akkyakky

製品の品質を評価する手続きをスケールさせるためには、自動化が必須である。

akkyakky

テストの自動化は以下の3つからなる

  1. テストを書くこと
  2. テストを実行すること
  3. テストの失敗に反応すること
akkyakky

テストする利点は以下の通り

  1. デバッグの減少
  2. 変更への信頼の増大
  3. ドキュメンテーションの改善(テストが実行可能なドキュメンテーションとして機能する)
  4. レビューの単純化
  5. 思慮に富む設計(テストしやすいコードは、よくモジュール化されている)
  6. 高速で高品質なリリース
akkyakky

11.2 テストスイートを設計する

「小さい」テストは、より速く、安定し、デバッグがしやすい。
「小さい」とは、規模・範囲の2つの次元で表現される。

akkyakky

Googleにおけるテストの種類

  • 「小テスト」: 単一のプロセス内
  • 「中テスト」: 単一のマシン上
  • 「大テスト」: 任意の好きな場所

テストの重要な特性は

  • 速度
  • 決定性
akkyakky

小テスト

  • 制約
    • 単一プロセス内
    • sleepできない、I/Oできない、ブロックする関数を呼び出せない(より速く、決定的なテストにするため)
akkyakky

中テスト

  • 小テストの制約を緩和したもの
    • 複数プロセス間・スレッドでのテストが可能
    • localhostへのネットワーク呼び出しを含め、ブロックする関数を呼び出せる(外部マシンとの通信はNG)
akkyakky

大テスト

複数マシン間で通信してもOK
柔軟性が増す
速度低下と非決定性を招く

Googleでは、大テストを小・中テストから分離して頻繁にテストしないようにすることがあるらしい。

akkyakky

すべてのテストにおいて共通で守るべき属性

  • テストは、テスト環境の組み立て・実行・解体の情報を全て含むのが望ましい
  • テストは、挙動を実行するために必要な情報のみを含むべき
  • テストにはテストがないため、テストの正しさを検証するためには、手作業でのレビューが必須となる
    • そのため、簡潔なテストに留めるべき
akkyakky

テスト範囲

  • 狭い範囲
    • ユニットテスト
  • 中範囲
    • インテグレーションテスト
  • 大範囲
    • ファンクショナルテスト、エンドツーエンド、システムテストなど

テストの範囲が狭い、とは、実行されているコードではなく、検証されているコードの範囲の狭さを指している。

より狭い範囲のテストを書くべき

akkyakky

実際にテストがいる挙動・属性はどれか?
→破綻してほしくないもの全部をテストすべき
システムの特定の挙動が正しいと確信を持つためには、自動テストが必須である。

akkyakky

テストスイートの品質は、単一の数値だけで判断できない
テストの品質は、テストされる挙動を考慮できているかで判定される。

akkyakky

11.3 Google規模でのテスト

Googleのコードの大半が、単一のモノリシックなリポジトリに保持されている。
Googleのコードベースは、社内に開かれている
Googleでは、リポジトリでのブランチは行わず、全ての変更はヘッドに対してコミットされる(!?)

akkyakky

既存コードの変更を速く行えるようにするには、小規模なテストに抑えることが必要である。

システムの成長に伴い、テストはより大規模になっていき、その実行時間が長くなる
テストが決定的・高速でないと、生産性が落ちる。
テストコードは、本番環境向けのコードと同様に扱うべきであり、テストに対するインセンティブを与えるべきである。

akkyakky

11.4 Google でのテストの歴史

Googleでの自動テストの啓蒙に対する3つのアプローチ

akkyakky

オリエンテーション講習

新入社員に対して、テストに対する講習が行われるようになった
講習で教えられたテストに対する観念を、社内での標準のプラクティスであるかのように提示することで、テストの文化が全社的に広がることになった

akkyakky

テスト認定プログラム

テストプロセスの習熟度を理解するための指標
テストプロセス改善方法の各種手順書がまとまっている

akkyakky

トイレでのテスト

トイレの個室にテストに関する記事を掲載した

akkyakky

自動テストは、テストのタスク全てに適しているわけではない

akkyakky

11.6 結論

本章は、テストについてのGoogleの考え方に読者がなれてもらうために書かれた。

  • 自動テストの重要性
  • テストスイートの分類
  • テストで考慮すべき属性
  • Googleが取ってきたテスト文化の啓蒙方法
このスクラップは2023/03/14にクローズされました