テスト肥大化
テストコードが過剰に増加し、維持コストが高くなる状態。テストが肥大化していること自体が問題なのではなく、構造的な問題のシグナルとして読み取るべき指標。
テスト肥大化のメカニズム
偶有的複雑性由来の肥大化
Structureが弱いと(不正な状態が型で排除されていないと)、テストで検証すべき状態空間が広がる。型で制約できた状態空間のぶん、テストが増える。
これは偶有的複雑性から生まれるテストケースの増加であり、Make Illegal States Unrepresentableによって削減できる。
単一インターフェースへの関心事過剰集中
1つのインターフェースが多すぎる関心事を引き受けているとき、そのインターフェースのテストが爆発的に増える。入出力パターンが多くなるため。
テスト肥大化のシグナルとして読む
テストが肥大化するのは、一つのインターフェースが多すぎる関心事を引き受けている兆候。
テストの肥大化を見たとき、問うべき問いは:
- このインターフェースは責任を取りすぎていないか?
- 型で表現できる制約がテストで検証されていないか?
- 本質的複雑性と偶有的複雑性が混在していないか?
本質的複雑性の局所化との関係
構造が良ければ、本質的複雑性(ドメインに内在する複雑性)は特定モジュール内に局所化される。モジュール内ではテストが多くなるかもしれないが、プロダクト全体から見れば肥大化していない。
テストの肥大化はテストの問題ではなく、構造の問題のシグナルである。
対処法
- 型で制約できるものは型に移す → Make Illegal States Unrepresentable
- インターフェースを分割する → 関心の分離
- 実装詳細テストをインターフェーステストに置き換える → インターフェーステスト