2006年10月25日 15:25 [Edit]

テキストエディタさえあればできるTDD

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

『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


この記事へのトラックバックURL

この記事へのトラックバック
404 Blog Not Found:テキストエディタさえあればできるTDD
404 Blog Not Found:テキストエディタさえあればできるTDD【】at 2012年01月21日 12:09
TDDは歯磨きみたいなものだ。 #突拍子もないような話をする馬鹿だと思うかもしれない。 最初にある集落で歯を磨いたやつがいたとしよう。それを見たやつも真似をして歯を磨き、そして最初のやつと同じようにそれを毎日続けるようになった。そしていつしかその集落の人間は
[Agile]ドライブするということ【NAgilerの日記】at 2006年10月27日 10:36
『404 Blog Not Found ― テキストエディタさえあればできるTD...
「それがわからないのであれば、あなたはTDDがわかってないのだ」【翔ソフトウェア (Sho's) Fujiwo の日記】at 2006年10月26日 12:28
この辺りのお話で。 角谷HTML化計画(2006-10-24) 404 Blog Not Found:テキストエディタさえあればできるTDD JavaもPerlも俺の中では、かなり上位にランクインする好きな言語なんだけど、なんか両者の文化圏は妙に対立することが多いよね。 今回のは、小飼さんの「Eclipseの
[development] JavaとPerlとTDDと回想と。【nothing but trouble】at 2006年10月26日 03:56
この記事へのコメント
例になっているPerlのコードですが、<id>100<id>という部分は<name>kent</name>と比べると、/がなくて変に見えます。
と言ってもコメントの方も同じ書き方なので、問題ないのでしょうか。
Posted by メテコ at 2006年10月26日 21:26
↑ コメント欄に書くとインデントが消えてしまうようです。
Java のコードの方はインデントを入れて読んでください。
Posted by 小野和俊 at 2006年10月26日 16:26
うーん、この比較はちょっとずるいと思います。

上の引用の仕方は改行の部分や 「XML としての比較」と「文字列としての比較」との違い etc. で意図的に Java の方が難しく見えるようにしているように思えてしまいます。

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

■ Java
=======
import junit.framework.TestCase;

public class Test extends TestCase {
public void test() {
assertEquals("<sampleBean>\n<id>100<id>\n<name>kent</name>\n</sampleBean>\n", xml);
}
}

とすべきです。

この両者の間に「プログラマーでないとできない」かどうかの開きがあるでしょうか?

私はほとんど差がないと思います。
Posted by 小野和俊 at 2006年10月26日 16:15
言語で伝えられる事って微少なのだ、というのを痛感させられる議論のような気が。おそらくDan氏も「それくらい補間せえよおまいら」と思っているだろうが、別段彼は、「プログラマ!=テストする人」というのをメイン議論にはしてないと思う(ということもある、というくらいで)。どっかで視点変換ツールとか言っている人がいたが、それって同じ事でしょ。実際JavaでやろうとするとJava文法とクラス記述の概念が必要なのに対して、Perlでは文法のみで後はマッチングでしょう。
文章ってのは叩こうと思えばいくらでも叩ける物。なるべく好意的に解釈するようにしないと本質からずれた不毛な議論になってしまうよ。みなさん。
Posted by 初学者K at 2006年10月26日 13:09
金持ちにとって最も偉大な習慣とは、
金持ちでない人たちの立場になってものを
考えられるかではないのか。

ある意味そうかも。
もちろん「金持ちでない人のため」ではない。
Posted by おためちゃんのメシアコンプレックス at 2006年10月26日 01:52
「とにかく、なぜPerlをはじめとするLLでTDDが普及したかというと、テストという行為そのものをなるべく楽になる工夫というのをこらしてきたからだ。」って、これLLに限った話ではなくて、TDDそのものの存在理由にすぎなくないですか?LLならではの理由がまるでないような。
あと、上記の他にLLは他に何が先行しているのかが気になります。「ずっと」というからにはこれだけではないはずですよね。
Posted by すずき at 2006年10月25日 21:45
このエントリがお笑いなのは「プログラマーにとって最も偉大な習慣とは、プログラマーでない人たちの立場になってものを考えられるかではないのか。」とかいっときながらながら、自分がぜんぜんプログラマーでない人たちの立場になってものを考えられていないこと。
しかもそのことに気づかずにSIerとして、一般の人とのコミュニケーションをとる方法でははるかに鍛えられている角谷さんにえらそうに説教している点(まさに釈迦に説法)。

 まず一般人にテキストエディタのような何でもありの状態で、いくら簡単だとは言えPerlのような構造化されたテキストを書くなんてムリです。(それ以前にテキストエディタを使えるような人はそんなにいませんが)。
 もし、プログラマでない人にテストを作ってもらいたいなら、Excelにデータを入力してもらって、それを読み込みながらテストをするプログラムを書くとかしないとムリ。
Posted by と at 2006年10月25日 19:51
どっちもめんどくさいと。
Posted by とれ丸 at 2006年10月25日 17:31
use Test::More qw(no_plan);
is "<sampleBean>\n<id>100<id>\n<name>kent</name>\n</sampleBean>\n", xml;

 これをPerlプログラマ以外がかける気がぜんぜんしないんですが。
そりゃ自分はPerlプログラマなんだから、Perlのほうが簡単に見えるのは当たり前な話。
Posted by と at 2006年10月25日 16:35