日経コンピュータ 2001年6月4日号のエクストリームプログラミングの記事の写真のうちの1枚に DaveとAndyのRuby本が写っています。 よーく探してみましょう。
毎回、setupやteardownを実行するのじゃなくて、最初にたった1度だけsetupを実行して、最後に1度だけteardownを実行させたいなんてことがあります。
そんなときには、TestSetupモジュールを利用します。
require 'runit/ext/testsetup' class OnlyOnceSetup include RUNIT::EXT::TestSetup def setup ... end def teardown ... end end class TestFoo < RUNIT::TestCase def testA ... end def testB ... end end RUNIT::CUI::TestRunner.run(OnlyOnceSetup.new(TestFoo.suite))
という感じにします。 OnlyOnceSetup#setupは最初に1回だけ、OnlyOnceSetup#teardownは最後に1回だけ実行されます。 ここで、不満なのが、TestFoo#testAやTestFoo#testBからは、OnlyOnceSetupのインスタンス変数にアクセスする手段が無いということです。
そこで、RubyUnitでは、(とりあえず) decoratedメソッドを使うという手段を提供しています。
require 'runit/ext/testsetup' class OnlyOnceSetup include RUNIT::EXT::TestSetup def setup @v = 2 end def value @v end end class TestFoo < RUNIT::TestCase def decorated(decorator) @decorator = decorator end def testA assert_equal(4, @decorator.value * 2) end def testB assert_equal(4, @decorator.value + 2) end end RUNIT::CUI::TestRunner.run(OnlyOnceSetup.new(TestFoo.suite))
という感じで使います。
OnlyOnceSetup側で、インスタンス変数にアクセスするためのメソッドを定義しておきます。 (上の例では、valueメソッドがそれです。)
TestFoo側に、decoratedという名前のメソッドを定義しておきます。 decoratedメソッドは必ず引き数を1つ取らなくてはなりません。 decoratedメソッドの引数は、上の例では、OnlyOnceSetupオブジェクトになります。 TestFooのインスタンス変数としてOnlyOnceSetupオブジェクトを保持しておくことで、 TestFoo#testAから、OnlyOnceSetup#value経由で、OnlyOnceSetupのインスタンス変数にアクセスできる訳です。
ここで、TestFoo#decoratedは、OnlyOnceSetup.newが実行されたときに呼ばれます。 OnlyOnceSetup.newが実行されたときには、まだ、OnlyOnceSetupのインスタンス変数@vが定義されてません。 ですから、
def decorated(decorator) @decorator = decorator end
を
def decorated(decorator) @value = decorator.value end
としても、@valueはnilになります。
RubyUnitで全てのテストに共通の準備をするためのメソッドがsetup、後始末をするのが、teardownです。 この「全てのテストに共通」ってのが意外と曲者なのですね。 testA と testBに共通の準備は書けても、testCでは、その準備は必要なかったりとかする訳です。 いくつかのテストに共通の準備は書けても全テストに共通の準備ってのは意外と少ないんです。
そこで、RubyUnitでは、attach_setup, detach_setupなるものを用意してみました。
class TestFoo < RUNIT::TestCase def setup_for_A_and_B ... end def setup ... end def teardown ... end def teardown_for_A_and_B ... end def testA ... end def testB ... end attach_setup :setup_for_A_and_B, :testA, :testB attach_teardown :teardown_for_A_and_B, :testA, :testB def testC ... end end
という感じで使います。 RubyUnitは、testA(testB)を実行するときには、
setup -> setup_for_A_and_B -> testA(testB) -> teardown_for_A_and_B -> teardown
という順序で実行します。
testCを実行するときには
setup -> testC -> teardown
という順番で実行します。
読了。 帯に書いてある作品はわりと好きなので(内容は覚えてないのだが面白かったという記憶があるので) これにも手を出してみた。 どこがどうとうまく言えませんが、ちょっと物足りないような。
書き忘れたけど、アスキーから本を出版したからと言って、アスキー本社を知ってるとは限らないし、 知ってなくてはいけないということも無いのです。 本当に初めて行く知らない場所だったんです。決して行き方を忘れたのではありません。 大体、編集の人と初めて会ったのも、書店に本が並んだ後だったりするし。
朝起きたら、喉がガラガラ。やばい。今日喋らなあかんのに。 風邪ひいたのか? うがいして、コンビニで、のどあめ買って会場へ向かうことに。 初台の駅に着く頃には、少しまともに。
超方向音痴の私は、会場の場所が良くわからずうろうろしていると小林さんに遭遇。 二人で地図を再確認しながらうろうろしてるとMoonWolfさんと遭遇。 さらにうろうろしているとちょうどタクシーが前の方で停止。 ひょっとするとひょっとするかもと思いじっと見ていると、降りてきた人の中に見たことある人が。 あの人は、オープンソースまつりで「挑戦してみますか?」と私に声をかけてくださった人に違いない。 きっと、Tokyo Perl Mongers の人だろう。 思いきって声をかけてみたらやっぱりそうだった。ラッキー。 ということで、無事に会場に到着。
今回の教訓:イベントに何度か参加して、知ってる人を増やしておくと、知らない会場に向かうとき便利。
内容は、いろんな人がいろんなところでフォローしてくれると思うので、自分の感想だけ。
極道編は世界初のxUnitの解説本だったのか。自分でも知らんかった。まさに先行者だ。
Lightning Talksはちゃんと5分で終わらないのもそれはそれで面白い。
今回初めて立って喋ったので緊張した。
採算がとれてることがわかって良かった。
Ruby 2.0の「埋め込みに優しく」ってのは、RubyWinにも優しくしてくれるってことだろうか。
懇親会に参加。
なひさんや、たかはしさんとテストの話など、かなり濃い話をする。
今回も思ったこと。 やっぱり濃い話は、イベント後の懇親会とか、少人数で休憩時間に集ったときにしかできない。 で、それが一番面白かったりする。 あっ。そうか。そういうことをちゃんと時間をとって実現するのがBOFなんでしょうかね。
何とかなったので東京へ行けそうだ。
なんかいろいろあって疲れた。
ObjectDay 2001に参加するため、電車に乗ったら気持ち悪くなった。 振り子型とか呼ばれるらしいタイプの電車。 何でもカーブでスピードを落とさずに曲がれるようになっていて、その分、横揺れが激しいんだとか。
弁当を買って新幹線に乗った。隣の席が母娘らしき2人連れだった。 隣の席のテーブルには弁当が置かれてあった。 私も自分の目の前のテーブルに弁当を置いた。
ここで、難しいのが新幹線の車内でいつ、弁当を食べるかということだ。 食べている途中で、車掌が回ってきたり、停車駅にぶつかったりすると落ち着かないのだ。 さらに今回は、 隣の席の女性(娘の方)と私のどちらが先に弁当を開くかという非常にデリケートな問題が絡んでくる。
結局、私の方が先に開かねばなるまいと意を決して、弁当を開くことにした。 マラソンに例えるなら、2人並走の状態から私が一歩先に出た形である。 私が弁当を開ききって食べる体制に入った瞬間、隣から「私も食べよう」という声が聞こえてきた。 声が小さかったので、今、「私も」って言ったよね。「も」って。ねっ。絶対言ったよね。 私が弁当を開くのを待ってたんだよね。ねっ。一緒に並走してたんだよね。 と聞いて確認したかったのであるが、小心者の私には、とてもそんな真似はできなかったのである。
うーむ。オチも何もない話だ。
私が期待していた内容とはちょっと違っていました。
XP懐疑派からXPのココがダメなんじゃないの? とか この辺はどうやって克服するの? とか そういうストレートなツッコミが出て、 それに擁護派が反論する形で議論が展開されて、 XPがどういうものか明確になってくるのを期待してました。 ですが、いきなり懐疑派が変化球できたので、 出鼻をくじかれて、あらあらという感じでした。 結局、その変化球は、最後まで私には見えませんでした。
あと、XPの具体的な適用例とか失敗談とかそういうのを色々聞いてみたかったです。
XP談議が終わったあと、パネリストの一人と話し込んで、 それが一番有意義だったような気がします。 (わざわざ東京まで行って話し込む必要はないので、その意味では有意義度が下がります。)
来週も行くんだから、今週はやめときゃ良かった。
読了。訳は、前よりこなれている感じ。 もう1、2度読み返さないとちゃんと消化できそうにないです。
やっと読了。著者の二人はやっぱりパワフルだ。
Tokyo Perl Mongers の緊急例会があるらしい。 場所は、神楽坂のもんじゃやさんだとか。 やっぱり、そうだったのか。 (←そんなわけありません。)
ゴールデンウィーク以降、忙しいのか、暇なのか、わからない状態が続いている。 日々変更される予定。 本当は今日、全休したかったのだが、午後から出社。 でもって予定が変更されたので、全休でも実は良かったということになってしまった。
というWindow Managerがあるのを知って、ダウンロードして試す。 Window Managerが動いていないのと同じような状態になる。 あきらめて、Icewmに戻す。
Emacsで動く midnight commander clone.
安定ヴァージョンがリリースされるまで待つ。
もっといいのが無いか探す。
そのままだと私にとってかなり使いづらいので、これをベースに自分好みにいじる。
自分で一から作るために、emacs-lispの勉強を始める。
さて、どうしよう。
norton commander cloneの存在も知る。
ちなみに私は、midnight commanderもnorton commanderも使ったことがないので、 cloneとしての出来具合がいいかどうかわかりません。
freshmeetから。2.9.9がリリース。 あれっ? この前ダウンロードしたとき、既に、2.9.9だったような。
念のため、M-x cvs-update したら
PCL-CVS release v2_9_9
と表示される。
freshmeetに載る前の微妙なタイミングでダウンロードしたということか。
キーボードの触感というか操作感というかそういうのは、実際に触ってみないとわからないとあらためて感じた。
読了。半分ぐらい読んだところで、犯人の見当がつく。 勘のいい人だとわかるでしょう。 もうひとひねり欲しいところです。
XPだし、薄くてすぐ読めそうだったので。
考えるところがあって、CVSの解説書を1冊買うことに。 どれを買おうか迷った挙句、これにした。最後の決め手は、あとがき(笑)。 いろんな意味で、親近感が湧いてしまいました。 内容が良いかどうかはわからないけど、読みやすそう。
xtermよりも、rxvtの方が軽いらしいので、rxvtを使うことにした。