2012/3/4
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 01:43:33 +0900
updated_at: 2018-06-05 06:14:04 +0900