Turnipを使ってtappのテストを書いた話

WEB+DB PRESSのRubyわくわくナビでも紹介されたtappのテストについては社内でも定期的に上がる話題で、もう少し広い意味で考えると、標準出力を扱うアプリのテストをどうするかという話になったりするのですが、

tappの単体テストってなんかしっくりこないよね 標準出力に出すだけだしね そういえば、vim-ruby-refactoringっていうVimプラグインのテストがCucumberで書いてあるんですよ そういえば、jnicklas先生の新作Turnipっていうのがあって… それ使ってみましょう

という感じでTurnipを使ってAcceptance Testを書いてみました。

Turnipの特徴はこんな感じです。

記法はCucumberと同じGherkin Stepの定義に正規表現を使わずに、ただの文字列と、その中にコロン(:)をプレフィックスとしたプレースホルダで変数を扱う Stepに名前空間ある Stepの名前空間に変数が持てる

日本語で書けるかどうかは試してないですが、なかなかよさそうじゃありませんか?

Turnipで書いたtappのテストを下に載せておきます。 ただ、名前空間とかは使ってないので、Cucumberとは殆ど変わりませんね。

Feature: Object#tapp Scenario: Call tapp within methods chain Given I have the following code: """ require 'tapp' (1..5).tapp.select(&:odd?).tapp.inject(&:+) """ When Ruby it Then I should see: """ 1..5 [1, 3, 5] """

Step定義も合わせてどうぞ。 こっちは、よくある標準出力をテストする方法を使っています。

step "I have the following code:" do |code| @code = code end step "Ruby it" do stdout = StringIO.new $stdout = stdout begin eval @code ensure $stdout = STDOUT end @output = stdout.string.chop end step "I should see:" do |output| @output.should == output end

結構読みやすいと思うんですがどうでしょう。標準入出力を扱う簡単なツールは、こんな感じで単体テストよりもエンドツーエンドのテストを書いておいた方が価値があると思います。

デブサミ参加記録

(これは3/1に書きました)

去年はなんとなく参加しなかったデブサミですが、今年は少しだけ参加しました。

1日目: 平鍋さん 2日目: 角谷さん、松田さん

私にとって、デブサミと平鍋さんの組み合わせは特別なものなので、今年はどうしても行きたかったのです。

あれは2005年、学生として潜り込んだデブサミで平鍋さんの見える化の話を聞いたのが、私と永和の出会いだったのです。 その7年後の2012年に、平鍋さんから聞くアジャイルの10年という話は、あの頃の衝撃を思いださせてくれる、平鍋さんにしかできない話で感動しました。

角谷さんの話は、だいたい会社で話してることや、耳に入ってくる話が中心ではあるんですが「自然なソフトウェアの作り方」と「オープンソースソフトウェア」という話は、なるほどなーと思いました。オープンソースソフトウェアはすごい。

最後の松田さんは、もうあれは聞かなかった人は、スライドだけでも見るべきですね。必修科目です。GitHubとはなんなのか、何故GitHubなのか、彼等は何をなしとげたのか、すごく綺麗にまとまっていました。 これを聞いてから、GitHubの事を他の人に話そうとしても、松田さんの言ってたことをそのまま言うしかなくなってしまって少し困っています。

1年振りに参加したデブサミはとても満足できたのですが、一方で技術的なセッションがソーシャル系というかビッグデータ系ばかりなのは、ちょっと寂しいというか、もう少し何か話題がないのかな〜と思いました。

(本当は、1日目の和智さんも聞きにいく予定だったのですが仕事で間に合わず。後日Twitterを眺めて雰囲気を楽しみました。)