Study & Practice

北海道札幌市のプログラマによる技術とか雑記のブログ

読書感想文『そろそろはじめるテスト駆動開発』

はじめに

Software Design 2022年3月号の特集『そろそろはじめるテスト駆動開発』を読んだので覚えておきたいなと思ったことをまとめます。

今回は自動テスト編です。

特集のおおまかな内容

著者は日本におけるテスト駆動開発の第一人者、和田卓人さん。「テスト書いてないとかお前それ@t_wadaの前でも同じこと言えんの?」というライオンのアスキーアートでお馴染み方です。

前半では自動テスト、テストファーストテスト駆動開発がそれぞれどのようなもので、どのような違いがあるのかについて解説している。後半ではテスト駆動開発をするにはどのような手順踏めばよいのか、どのように考えると良いのかをJavaScriptの実際のコードをベース解説している。

今回はその中から自動テストについて書かれている部分について覚えておきたいと思ったことをまとめていきます。

自動テストとは

テストもコードで書いて、そのコードを実行することでテストの実施を自動で行っていく取り組みのこと

自動テストに必須の特性

自動テストで効果をあげるために必須となる性質

自己検証可能

テストの結果を人が見て判断しなくても成功か失敗かがわかること。つまりコードの実行結果が期待しているものかどうかの判断をコンピュータが行える状態。Pass/Failedをアサーションなどで判別して行うのが一般的。

繰り返し可能

テストがいつでもどの環境でも同じように動くこと。ローカル環境、開発環境、CI環境それぞれで同じように動き、テスト後の後処理なども人間が行う必要がない状態

必須ではないが強く推奨される特性

独立していること

テストを行う順番や並列実行による影響を受けないこと。どんな順番でどのタイミングに実行されても変わらない結果が得られる状態

高速であること

コードが自分の考えた通りに動いているかを判断するため、できる限り高速に動く必要がある。実行に時間がかかってしまうようだとテストが億劫になって実行頻度が下がり、コードが壊れたことに気付くのが遅れてしまう。

自動テストのメリット

根拠のある自信

開発しているシステムが想定通り動いていることで自信が生まれるようになります。これが根拠のある自信であり、著者が自動テストの最大の効果であると述べています。自動テストが整備されていれば既存のコードを壊してしまうかもしれないという心理的負担を感じずにリファクタリングを行うことができる。この安心感が継続的な変更と改善を支える。

デバッグを大幅に軽減できる

自動テストは既存のコードを壊してしまってもすぐに気づくことができる回帰テストリグレッションテスト)としての効果があります。バグの混入にいち早く気付けるようになることで、デバッグの時間を大幅に削減できます。

詳細なドキュメントになる

実際のソフトウェアと用意されたドキュメントに乖離しているという状態は誰しも経験があると思います。自動テストはもし乖離が起きてもテストが失敗することで乖離に気付くことができます。テストコードはよりコードに近い、詳細なドキュメントとしても活かすことができます。

自動テストの注意点

学習コストがかかる

過去のさまざまな事例からテストを書くコストはデバッグの時間の軽減などで相殺され、むしろ黒字になるのでテストを書き慣れているプログラマーはテストを書いたほうが早く開発を進められる。しかし、テストを描き慣れていないプログラマーはテストの書き方を学びながら開発を進める必要があるので、より時間がかかってしまう。

メンテナンスコストがかかる

自動テストは設計変更の影響を受けるため、テストコードの可読性や変更容易性も意識しないとメンテナンスコストが高くなってしまう。そのため、テストコードも定期的にリファクタリングを行なって適切な状態を保っていく必要がある。

品質保証としてはもの足りない

自動テストによって欠陥を減らし品質を高めることができるが、それによって品質が保証されているというわけではない。自動テストとは別に、コードレビューやペアプログラミングなど、品質を高める施策を行なっていく必要がある。

感想

自動テストのメリットは品質や開発効率という面にあると思っていたので、1番の利点が心理的なものであるというのは意外でした。言われてみると確かに自動テストがあることでリファクタリングを行うときにも、既存の機能にバグを生み出してしまうかもしれないといった恐怖感を低減できる。それによって品質や開発効率の向上という効果が生まれる、というのは納得ができます。メリットを活かすためにも、十分なカバー範囲を持ったテストを実装する必要がありますし、個人でなくチームレベルで自動テストの文化を作っていくためにも、今後は自動テストの手法について学んでいこうとおもいます。