この記事は、 ギルドワークス アドベントカレンダー の三日目の記事です。
テスト駆動開発は難しい
テスト駆動開発とは、もう殆どの皆さんには説明の必要はないでしょうが、 テストを先に書き、その後に実装を行う という開発方法です。テスト駆動開発を行うことで、素早いフィードバックを得ながらコードを書き、そして洗練させていくことができると 言われています 。
ですが、テスト駆動開発を取り組むにあたって、いきなりうまく回していくのは、かなり難しいです。
一体どれくらいの粒度のテストを書けばいいのか? テストが通らない「レッド」状態をどう抜け出せばいいのか? リファクタをどんなタイミングでどんな規模でやっていけばいいのか?
こういった疑問や不安が、TDDをやり始めると浮かんでくると思います。
TDD Kata をやろう!
そこで、TDD Kata です。
Kata とは 「方」、すなわち、武道などで行われる「形稽古」のことです。
形稽古では、決められた動きを決められた手順でトレースすることで、動きを体に覚え込ませます。そこに一切のアレンジを入れてはいけません。守破離の「守」を徹底的に行う稽古ですね。
同様に、TDD Kata とは、TDDの基礎的なプラクティスを、守るべき「方」として定義しています。
しかし、プログラミングの方ってどういうものか、ちょっとわからないですよね?それでは、いくつか例を見てみましょう
TDD Kata の実例
今回取り上げるのは、TDDの父の一人でもある、”アンクル・ボブ” Bob Martin氏が公開している、以下のTDD Kata を見ていきましょう。
-
BowlingGameKataという名前のとおり、ボウリングのスコア計算を行うものです。
Kataというからには、本当に一挙手一投足まで、細かく定義されています。例えば、このような具合です。
はじめに
- BowlingGameKata という名前のProjectを作成する
- BowlingGameKataTest というテストクラスを作成する
- この時点で、まずテストを実行すると、”No tests found in BowlingGameTest” というエラーが発生する
このように、プロジェクトの名前だけでなく、 どのタイミングでコンパイルを行い、どのタイミングでテストの実行を行うのか といった、プログラミングの所作まで定義しています。コードそのものについては、どこを消すか、どこを増やすかというのを各ステップごとに分かるように、ステップごとのコード全体を以下のように表示しています。

このように、各ステップその通りにコードを書いていくことになります。この例だと、「この段階ではテストが失敗する」ということも示されていますね。
TDDの悩みの一つである、リファクタリングをいつ行うかについても、ステップの中で行うタイミングや行うポイントをわかりやすく示しています。以下のような場面でリファクタリングが行われています。
- 重複処理をまとめてメソッド化する
- setup メソッドにテストの初期化処理を集約する
- 説明的なコメントを含む処理をメソッドに切り出す
最後に
ここまで紹介してきましたが、実際には自分で手を動かしてみるのが一番です。本家であるJava版は パワーポイントをダウンロードできます ので、是非それを参考にKataをやってみてください。
また、他の言語についても、 Githubに様々なポーティングが投稿されています。
是非、試してみて下さい。
ただし、大切なことは、「方」を守ること。そして、繰り返し行うこと。慣れてくれば30分で終わる方です。私はお昼休みに一ヶ月間解き続けて、TDDの呼吸がなんとなく掴み取れたかな、と思っています。
これからTDDする方も、一度諦めた方も、いまやっている方も、ぜひ一度形稽古を!
この記事もどうですか?
-
関係の質を上げるスモールトーク
この記事は、 ギルドワークス アドベントカレンダー の4日目の記事です。 今回は、スモールトーク(雑談)の紹介をします。 なにそれ? 毎週日曜日の朝1時間程度の市谷と私の2人のオンラインミーティングです。 この「スモールトーク」の名付け親は…
-
「根本的な帰属の誤り」という考え方
こんなことはありませんか? 皆さんはタクシー待ちの列に並んでいます。そこに人が割り込んで来たとします。その時、割り込んだ人にどのように感じたでしょうか? 「秩序を壊す人だ」「ルールを守らない、いい加減な人だ」 と感じたでしょうか? ※注意:…
-
タイムラインをつかっていこう!(後半)
この記事は、 ギルドワークス アドベントカレンダー の23日目の記事です。 今回は、ふりかえりの技法「タイムライン」をつかって良かったことを、お話しをしたいと思います。 #タイムラインについての説明は、 「タイムラインを使っていこう!(前半…