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

11.1
手作業のテスト → 開発者手動の自動化されたテスト への進化
自動テストの目的は
- バグを補足すること
- 変化を可能とする能力に備えておくため
- (システムの設計の改善)
Googleにて、自動テストのプロセスを全社的にスケールさせる際に学んできた知見から学ぶ。

Googleのプロジェクトの一つであるGoogle Web Server(GWS)では、新規変更に対して必ず自動テストを含めるというポリシーを制定した結果、hotfixが半減した。
バグが発生するたびにデバッガを使用してバグを調査するコストと比べて、自動テストのコストは低い。

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

テストの自動化は以下の3つからなる
- テストを書くこと
- テストを実行すること
- テストの失敗に反応すること

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

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

Googleにおけるテストの種類
- 「小テスト」: 単一のプロセス内
- 「中テスト」: 単一のマシン上
- 「大テスト」: 任意の好きな場所
テストの重要な特性は
- 速度
- 決定性

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

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

大テスト
複数マシン間で通信してもOK
柔軟性が増す
速度低下と非決定性を招く
Googleでは、大テストを小・中テストから分離して頻繁にテストしないようにすることがあるらしい。

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

テスト範囲
- 狭い範囲
- ユニットテスト
- 中範囲
- インテグレーションテスト
- 大範囲
- ファンクショナルテスト、エンドツーエンド、システムテストなど
テストの範囲が狭い、とは、実行されているコードではなく、検証されているコードの範囲の狭さを指している。
より狭い範囲のテストを書くべき

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

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

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

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

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

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

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

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

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

11.6 結論
本章は、テストについてのGoogleの考え方に読者がなれてもらうために書かれた。
- 自動テストの重要性
- テストスイートの分類
- テストで考慮すべき属性
- Googleが取ってきたテスト文化の啓蒙方法