なんかえらい誤解されているのだけど、私も舌足らずだったかもしれない。

『WEB+DB PRESS Vol.35』:実演! テスト駆動開発 - 角谷HTML化計画 (2006-10-24)
TDDはハッカーのための技術ではない。ハッカーにTDDは要らない。ただただハックすればよい。偉大なプログラマは偉大なプログラミングをすればよい。だが、ハッカーならぬ凡百たる私のような"普通の"プログラマはそうはいかない。TDDは我々が日々の仕事に自信を持ち、誇りを持って定時に帰るための思想だ。

私が言いたかったのは、Test Driven Development (TDD)に関しては、JavaよりPerlをはじめとするLLの方がずっと先行しているんですよ、TDDを語るならJavaだけ見てていいんですか?ということなのだけど。

私自身、過去にこう書いている。

404 Blog Not Found:perl - 勝手に添削 - MLD::Infoまたはtestの不在
どんなプログラムも、はじめにあるのはプログラムではなく、構想。そこに何を入れたら何が帰ってくるか。それを具現化するのがプログラミングとも言える。だから、テストを先に書くというのは、仕様書を書くのと実はおなじなのだ。

そのTest、Perlではこんな簡単だ。

perldoc Test::More
use Test::More tests => $Num_Tests;
# or
use Test::More qw(no_plan);
# or
use Test::More skip_all => $reason;

BEGIN { use_ok( 'Some::Module' ); }
require_ok( 'Some::Module' );

# Various ways to say "ok"
ok($this eq $that, $test_name);

is($this, $that,$test_name);
isnt($this, $that,$test_name);

# Rather than print STDERR "# here's what went wrong\n"
diag("here's what went wrong");

like($this, qr/that/, $test_name);
unlike($this, qr/that/, $test_name);

cmp_ok($this, '==', $that, $test_name);

is_deeply($complex_structure1, $complex_structure2, $test_name);

SKIP: {
skip $why, $how_many unless $have_some_feature;

ok( foo(),$test_name );
is( foo(42), 23, $test_name );
};

TODO: {
local $TODO = $why;

ok( foo(),$test_name );
is( foo(42), 23, $test_name );
};

can_ok($module, @methods);
isa_ok($object, $class);

pass($test_name);
fail($test_name);

BAIL_OUT($why);

# UNIMPLEMENTED!!!
my @status = Test::More::status;

こういった期待値と実測値をisとかlikeとかで並べて書くだけ。この環境は、Perlがあれば漏れなく付いてくる。テストを書く方はプログラミングを全く知らなくてもテストを書くことが出来る。

これがTest::Baseを使うとさらに簡単になるが、説明はShibuya Perl Mongers : Shibuya Perl Mongers テクニカルトーク #7miyagawa君のslideに譲る

とにかく、なぜPerlをはじめとするLLでTDDが普及したかというと、テストという行為そのものをなるべく楽になる工夫というのをこらしてきたからだ。

これがJava、というより当該記事だとどうだろう。

WEB+DB Vol. 35 pp.32
public class XStreamLearningTest extends XMLTestCase{ public void testXStreamでオブジェクトからXMLを生成する学習テスト() String expected = "<sampleBean>\n" + "<id>100</id>\n" + "<name>kent</name>\n" + "</sampleBean>\n"; assertXMLEqual(expected, xml); }

となってしまう。Javaプログラマーでなければテストそのものが書けない。Perlなら、この部分、

use Test::More qw(no_plan);
is "<sampleBean>\n<id>100<id>\n<name>kent</name>\n</sampleBean>\n", xml;

で済んでしまう。どちらがテストする気になるだろうか?

『WEB+DB PRESS Vol.35』:実演! テスト駆動開発 - 角谷HTML化計画 (2006-10-24)
我々は偉大なプログラマにはなれないかもしれない。だが、偉大な習慣を身につけたプログラマにはなれる。確実に。TDDとは、そういうことだ。

プログラマーにとって最も偉大な習慣とは、プログラマーでない人たちの立場になってものを考えられるかではないのか。テストを書く人はプログラムを書く人と同じとは限らない。いや、本当のところは違っていた方がいいのだ。

私が「eclipseを使っている人はいいけど」と言ったのは、まさにそのことだ。

それがわからないのであれば、あなたはTDDがわかってないのだ。

Dan the Man with Too Many Tests to Run