技術 ブログ

読書メモ:テスト駆動開発



はじめに


世間では、テスト駆動開発(TDD)という言葉を聞くようになり随分と経ちますが、原案者である Kent Beck 氏の本でしっかりと学びたいと思い今回購入しました。

この本を読む前は、「先に失敗するテストを書いて成功したらプログラムの完成、その後はCI/CD環境に組み込んで自動テストに使う」程度の恥ずかしい認識でした。

勿論、アプリケーションやシステムの要件によっては、それでも十分満足します。

しかし、この本では実践形式でテスト駆動開発 (以下TDD) について詳しく解説されおり、実際の開発におけるTDDに求められる濃淡についてや、開発技法とテスト技法の境界を見分けるのに非常に参考になりました。

簡単に読書メモを書きます。


内容の要約

前半



まず、多国通貨を扱うソフトウェアで、ドルとスイスフランを計算するプログラムをTDDすることから始まります。

ハンズオン形式で話が進むので Kent Beck 氏とペアプログラミングをしているような感覚で読み進めることができました。

全体を通してコードの写経をするとTDDだけでなくオブジェクト指向開発の理解がはかどると思います(自分は時間の関係上していません)。

TDDにおける重要な点として、まず簡単なテストを書き、べた書きのコードでテストを成功させます。

その後、他の値(三角測量と呼ばれる?)でも成功するように変数化を行ったり、メソッド化によってリファクタリングを行います。

これで成功したら終わりではありません、インターフェース化やオブジェクト化をして副作用を失くしたり、その度にテストを追加しては失敗すること(レッド)を確認し、実装して成功(グリーン)させます。

このプロセスを、何度も繰り返して自身でリファクタリングすることでコードとテストを洗練させます。

前半では、このような作業をJavaを使って丁寧に説明しており、大変わかりやすくまとまっています。

実践的なJavaのオブジェクト指向開発の勉強にもなる内容です(正直Javaの専門書より役立つかもしれません)。


中盤



中盤では、PythonのxUnitを使ってテストツールを開発しテストツール自身でTDDしていくという複雑な内容です。

前半の復習と応用を兼ねており、私的にはPythonの方が簡単だと思っていましたが、想像以上に応用的なプログラムなため難しく感じました。

私は、Pythonのオブジェクト指向プログラミングに精通してないため、読解が正直厳しい感じとなってしまいました。

しかし、スクリプティング的な使い方ではなくPythonを使ったオブジェクト思考開発の模範的な内容をTDDも含めて学べる点で非常に貴重な内容でした。


後半

最後に、TDDについて、開発現場でよく発生する状況をパターンとして解説していきます。


細かくなるため、詳しくは書きませんが、良い椅子にすわることで一日をフレッシュに保てることから、どのようにユニットテストで例外を発生させるか等、例えば「衝突実験ダミー人形パターン」などが解説されています。

また、「Factory method」パターンや「Imposter」パターンなど代表的なオブジェクト指向開発のパターンを使って、どのようにTDDでアプローチするのかも簡単に解説されておりました。

リファクタリングの具体的な方法も載っており、既存のプログラムからリファクタリングする方法も学べます。

締めとしては、QA形式でTDDに関する疑問点についての簡単な著者の回答が述べられておりました。



まとめ


テスト駆動開発(TDD)は、単にテストを先に書けばよいというものではなく、まずTODOリストにプログラムから得たい値や、そのプログラムの改善点などをリスト化して、それに対してテストを考えます、そのテストが失敗することを確認して(レッド)、簡単なべた書実装で成功させます(グリーン)。

次に、TODOリストに新たに必要なこと(三角測量、変数のスコープ、丸め、ポリモーフィズム、スーパークラス化)を追加していき、リファクタリングを繰り返して、品質の高いプログラムを書く開発手法です。

また、テスト技法とは区別されており、どちらかというと開発手法に区分されるようです。

TDDによってテストされやすく開発されたコードは、追加や変更が発生した場合や、再度リファクタリングをする際にも保守がしやすくなるという特徴があります。

理由としては、機能が小さく個別にテストされやすいように設計されるため、プログラムをシンプルに保てるからです。

非常に勉強になる内容でしたので、お勧めの本の一つです。

ここまで読んでくださりありがとうございました。








コメント投稿フォーム

メールアドレスが公開されることはありません。 が付いている欄は必須項目です