テスト駆動が出来なくて困っている貴方へ
追記 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