[XP]テスト駆動開発の定義と運用事例(2024 Advent Calendar 14日目)
この記事は私をシニアエンジニアにしてくれた「真のアジャイル開発」体験記の14日目の記事です。このアドベントカレンダーは「ある機能開発チームでスクラム, XP, DevOps を一度に実践したら真のアジャイル開発ができた」という内容です。執筆者は全てプログラミングをするパンダです。
テスト駆動開発
本記事ではXPのテスト駆動開発の定義と自分たちのプロジェクトでの運用を紹介します。
テスト駆動開発の定義
XP本は「テストファーストプログラミング」というプラクティスを紹介していますが、その内容は明らかにTDD(テスト駆動開発)を指しています。両者の違いを簡単に説明すると、テストファーストプログラミングは「テストを先に書いてから実装する」ことを指し、TDDは「クラスの形すらもテストから導き出す設計手法」を意味します。以下ではTDDとして解説を進めます。
TDDを実践することで「これも必要かもしれないから先に実装しよう」というYAGNI原則が指摘する問題を避けることができます。テストが通ればその時点で実装が完了したと判断できるためです。プロジェクトにまで広げるとスコープクリープ(Scope creep。プロジェクトのスコープの肥大化)の問題にも一部対処していると言えるかもしれません。
また、先にテストを書くことで、自然とテストしやすいクラスを設計できるようになります。その結果、コードにテストが含まれることでチームメンバーからの信頼を得られるでしょう。
さらに、ローカルでテストを実行すればすぐにフィードバックが得られるため、実装した処理が期待通りに動いているかを即座に確認できます。「このような入力値が来たらバグるかもしれない」と不安に思った場合には、そのテストケースを追加して挙動を確認することが可能です。もしテストが失敗した場合は必要な追加実装を行い、テストが通ればそのテストは残しておきましょう。
あなたが追加したテストケースは、将来チームの他のメンバーが抱くかもしれない不安を解消することになるのです。
テスト駆動開発の運用
TDDの具体的な実践方法についてはTDDの解説記事をご参照ください。 TDDはプログラミングスタイルの一つであり、一人でも始められます。ただし、ペアプログラミングでTDDを行う場合にはいくつかの工夫が必要です。
まずテストを先に書くことを徹底する必要があります。最初は意外にこれができません。特に相手がTDDにどの程度積極的か分からない場合に困ることがあります。私自身も開発に着手した当初は「どんな処理にすると良いでしょうか」と話しながらプロダクションコードを書いてしまっていました。TDDが好きではあったものの、他の人に強制するのは良くないと考えていたため、中途半端になっていたのです。
しかし、あるスプリントの振り返りでチームメンバーが「テストファーストを徹底できていない。プロダクションコードから書き始めてしまったら、テストから書こうとお互いに声を掛け合おう」と提案してくれました。この提案を受けてから、チーム全体がテストからコードを書くスタイルを確立しました。このように、一度スタイルを決めたら中途半端にせず徹底することが重要です。
設計が必要な場合には簡単な図を描いて共有することが有効です。TDDはテストを先に書きながらクラス設計を行う手法であり、事前に設計を完璧にする必要はありません。ただし、設計はドメインモデルに基づいて行われるため、頭の中にある考えを言葉や図にして形式知化しないと相手に伝わりません。
例えば、ブログのシステムを作る場合を考えます。データベースに保存されたMarkdownのテキストをHTMLに変換する機能を実装するとします。このとき、「Markdownを渡したときにHTMLに変換する」という名前のテストを書きます。テストで「# が h1 タグになる」というアサーションを追加すると、ペア同士で「## はどうする?」「**はどう処理する?」「データベースから値を取得する必要がある」といった会話が発生します。その際、考えている内容を簡単な図で表現すると効果的です。
このような図は、チーム外に提出する正式な設計図である必要はありません。ペア相手との間で設計案を共有し、フィードバックを得るためのもので十分です。この図を描くのに5分もかかりません。図を基に議論を重ねることで、より良い設計にブラッシュアップできます。
頭に浮かんだことを積極的に話すことも重要です。不安や疑問点、例えば「このクラス名で良いか」「メソッド名は処理内容を的確に表しているか」「メソッドの引数や順番は適切か」など何でも共有します。クラスやメソッドの分割についても自分の意見が正しいと思い込まずに相手の意見を聞いて考えます。
自分からは「こんな簡単なことを聞いたらバカにされるかも」といった不安を捨て質問をしましょう。また、相手を尊敬して謙虚な姿勢で他の人のアイデアを取り入れることが大切です。自分たちの会社の採用チームを信頼して、社内には攻撃的な態度を取る人がいないと考えましょう。万が一嫌なことを言われた場合はマネージャーに相談すれば良いのです。まずは相手を信頼して行動することが大切です。
テスト駆動開発をペアプログラミングで実践することでチームメンバー同士の信頼感が高まります。それがより良い設計と実装に繋がります。TDDとペアプログラミングという最高のコミュニケーションプロセスを通じて、チーム全体で効率的かつ信頼性の高い開発が可能になるのです。
TDDで開発した結果、自分たちの書いたコードのテストカバレッジは96%を達成することができました。
次回はインクリメンタルな設計の定義と運用を紹介します。
Happy Coding 🎉