ニワトリのたまご

宇宙とソフトウェア開発

【書評】単体テストの考え方/使い方

私のプロジェクトではテストコードがなく常に人手を介してテストを実施している。そこでテストコードを導入したいと考え、指針を探していた。世間には単体テスト結合テストの手法に関する書籍が多い中、本書は良いテストとは何かを深く掘り下げており、最適な内容だった。

著者はVladimir Khorikov氏。アメリカのソフトウェアエンジニアでPluralsightという学習サービスで講師も務めている。ブログも最近までは更新されているようだ。

enterprisecraftsmanship.com

この本は私のように、これからテストコードを書いていきたい人がぜひ読むべき一冊だ。本書では良い単体テストが備えるべき性質を4つ挙げており、それらの性質を備えるためにテストコードで考慮するべき事項を解説している。

  • 退行に対する保護: テスト実行時になるべくたくさんのプロダクションコードを含めること
  • リファクタリングへの耐性: 内部的なコードではなくテスト対象の実行結果をテストする
  • 迅速なフィードバック: テストを速やかに行えるようにする(実行時間、準備の容易性)
  • 保守のしやすさ: テストケースのサイズを小さく、プロセス外依存を少なく

また、単体テスト/結合テストで注力すべき点や目指す点についても説明しており、テストコードをプロジェクトに導入していく際にどこから取り組むべきなのかの指針を与えてくれる。

本書で特に印象的だったのは、「コードもテストも負債である」という考え方だ。テストは多ければ多いほど良いと考えがちだが、実際にはコードもテストも増えるほどバグのリスクが高まり、保守コストも上がる。そのため、テストを資産ではなく負債と捉え、最小限で最大の価値を生むよう設計するべきだと説いている。

よくある誤解の一つが、テストの網羅率を100%にするべきという考えだ。網羅率を100%にすると、重要なロジックがない部分にもテストを書かなければならない。しかし、本書では「取るに足らないコードにはテストを書かず、重要なロジックに集中するべき」と述べている。

さまざまなロジックに対してどうテストを書くかというのはよく議論されるが、テストを書かなくてもよい点に言及しているのは他の書籍ではあまり見られない視点であり、コードとテストに対する考え方を見直すきっかけになった。