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

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

created_at: 2015-08-06 10:43:33 +0900
updated_at: 2015-08-06 10:43:33 +0900