テスト駆動が出来なくて困っている貴方へ

追記 2011/06/13
Twitter からリンクされてますが、リンク先が違うので誘導
ATOK 2011 for Vista 64bit のお話は -> http://bit.ly/jRrdxt

テスト駆動が出来なくて困っている貴方へ。
テスト駆動だと思い込んでいる貴方へ、お贈りします。
「貴方」には、この文章を書いている「私自身」も含まれています。
インターネットで調べて分かることはテスト機能の使い方。テストをやったことがある人向けなので、ピンと来るはずがありません。まず、テストってなんぞや?という基本から学ばなければなりません。

やりたいこと(ロジック)を考えます。その時データベース設計は後にします。
データベース設計は大事だけど、なにかやりたいときに、「あっ、この情報が必要だな。」って後から思いつくもの。パスタが目の前にある。さぁ食べよう!あれ?フォークはどこ? でいきましょう。というか、使うか分からないスプーンのことを考えたりナプキンとか水とか考え出すと、先に進まないから。

この、やりたいことは紙に書きましょう。タイプするより手を動かした方が冴えます。そして、箇条書きで進めていきます。
ここでは、Web サービスにログインしたあとの処理(ロジック)を作ることにします。アカウントは OpenID など、他のWeb サービスを利用した場合です。

1.ログインをしたら個人情報を用意する。
2.なかったら作る。

と、ここで簡単だし実装コードを書きたくなりますが、そこはぐっとこらえてテストを用意します。

テストコードは、期待通りに動いているか確認するためのものです。「はい!先生!できました!」と言うものなのですが、すぐに答えを出してはいけません。そして、答えはすべて 「出来ました。」 です。出来ていません。とは、答えてはいけません。

では、コンピュータがわかる言語に落としていきましょう。

user = getUser(name)
if user not in None:
    print ’get OK!'

if user in None:
    user = createUser(name)
    if user not in NULL:
        print 'create OK'

しかし、これだと普通のソースコードで、print デバッグしているだけで、まったくテストじゃありません。しかも、ロジック的にスマートではありません。では、これをテストコードにするにはどうしたらよいのでしょうか?
ひとつめは、「表示はするな!」です。
表示する命令は失敗しません。テストに100%成功する事は書いては行けません。
ふたつめが、「テストにはロジックは書かない。」です。テストにロジックを書くと、そのロジックが正しいのかテストしなくてはいけませんね?本末転倒です。ロジックは実装コードに書きましょう。

assertEqual(getuser(name),True)
assertEqual(createUser(name),True)

ロジックは書かない!と言われたので、 if 分を無くしてみました。print も無くしたらすっきりしました。そう Test クラスのメソッドを使えばいいんですね。ということで、Test クラスのメソッドは全て覚えましょう。

これで、テストがすべて OK になるように実装コードになるよう…。あれ?
これおかしいですよね。そう、これは「すべてOKにはならない」テストコードなのです。
getUser が成功したら、createUser は失敗しなければなりません。というか、createUser は実行しないようにしないと。

うーむ、どこかが間違ってます。根本的に。

つづく。

おまけ
assertEquals and assertEqual
http://stackoverflow.com/questions/930995/assertequals-vs-assertequal-in-python