【Ruby】Minitest, test-unit, RSpec の違い
Rubyのテストを自動化したいな、と思い、下記3種類のテスティングフレームワークを使ってみたので紹介
*Minitest
*test-unit
テストに使うfizz_buzzメソッド
(3の倍数で"Fizz", 5の倍数で"Buzz", 15の倍数で"Fizz Buzz", それ以外は引数で与えられた数字を出力。世界のナベアツ の元ネタ、、、?)
は既に実装されている前提で、上記3種類を比較していきます。
*Minitest
Rubyをインストールした段階で、Minitestは一緒にインストールされているので、そのまま使えます
Minitestで使えるメソッド(わたしが使用したもの)は下記参考
コード例(test/fizz_buzz_test.rb)
require 'minitest/autorun'
class FizzBuzzTest < Minitest::Test
def test_fizz_buzz
a = ''
assert '1' === fizz_buzz(1)
assert_empty a
assert_equal 'Fizz', fizz_buzz(3)
assert_equal '5', fizz_buzz(4) # ここでエラーが起こるようにしています
assert_equal 'Buzz', fizz_buzz(5)
assert_equal 'Fizz', fizz_buzz(6)
assert_equal 'Fizz Buzz', fizz_buzz(15)
end
end
結果(エラー時)の見た目
Run options: --seed 18684
# Running:
F
Failure:
FizzBuzzTest#test_fizz_buzz [test/fizz_buzz_test.rb:9]:
--- expected
+++ actual
@@ -1 +1,2 @@
-"5"
+# encoding: US-ASCII
+"4"
bin/rails test test/fizz_buzz_test.rb:5
Finished in 0.010100s, 99.0099 runs/s, 396.0396 assertions/s.
1 runs, 4 assertions, 1 failures, 0 errors, 0 skips
結果(ALL OK)の見た目
$ ruby test/fizz_buzz_test.rb
Run options: --seed 7797# Running:
.
Finished in 0.000913s, 1095.2903 runs/s, 8762.3220 assertions/s.
1 runs, 8 assertions, 0 failures, 0 errors, 0 skips
*test-unit
Rubyをインストールした段階で、test-unitは一緒にインストールされているので、そのまま使えます
使えるメソッド(わたしが使用したもの)は下記参考。(Minitestと同じメソッドでした!)
コード例(test/fizz_buzz_test_unit.rb)
require 'test/unit'
class FizzBuzzTest < Test::Unit::TestCase
def test_fizz_buzz
a = ''
assert '1' === fizz_buzz(1)
assert_empty a
assert_equal 'Fizz', fizz_buzz(3)
assert_equal '5', fizz_buzz(4) # ここでエラーが起こるようにしています
assert_equal 'Buzz', fizz_buzz(5)
assert_equal 'Fizz', fizz_buzz(6)
assert_equal 'Fizz Buzz', fizz_buzz(15)
end
end
結果(エラー時)の見た目
$ ruby test/fizz_buzz_test_unit.rb
Loaded suite test/fizz_buzz_test_unit
Started
F
==============================
Failure: test_fizz_buzz(FizzBuzzTest)
test/fizz_buzz_test_unit.rb:10:in `test_fizz_buzz'
7: assert '1' === fizz_buzz(1)
8: assert_empty a
9: assert_equal 'Fizz', fizz_buzz(3)
=> 10: assert_equal '5', fizz_buzz(4)
11: assert_equal 'Buzz', fizz_buzz(5)
12: assert_equal 'Fizz', fizz_buzz(6)
13: assert_equal 'Fizz Buzz', fizz_buzz(15)
<"5">(UTF-8) expected but was
<"4">(US-ASCII)diff:
? 5
? 4
? Encoding: UTF-8
? S ASCII
==============================
Finished in 0.008437 seconds.
-----------------------------------------
1 tests, 4 assertions, 1 failures, 0 errors, 0 pendings, 0 omissions, 0 notifications
0% passed
-----------------------------------------
118.53 tests/s, 474.10 assertions/s
結果(ALL OK)の見た目
$ ruby test/fizz_buzz_test_unit.rb
Loaded suite test/fizz_buzz_test_unit
Started
.Finished in 0.000493 seconds.
-----------------------------------------
1 tests, 7 assertions, 0 failures, 0 errors, 0 pendings, 0 omissions, 0 notifications
100% passed
-----------------------------------------
2028.40 tests/s, 14198.78 assertions/s
RSpecが使用できる環境を作成する必要があります。
私は下記の記事を参考にさせていただきました。
使えるメソッド(わたしが使用したもの)は下記参考
コード例(spec/fizz_buzz_spec.rb)
※ruby ファイルの名前を、最後がspecでおわる(xx_spec.rb)ようにしないと動きませんでした。
require './lib/fizz_buzz'
RSpec.describe 'Fizz Buzz' do
it 'fizz_buzz' do
a = ''
expect('1' === fizz_buzz(1)).to be true
expect(a).to be_empty
expect(fizz_buzz(3)).to eq 'Fizz'
expect(fizz_buzz(4)).to eq '5' # ここでエラーが起こるようにしています
expect(fizz_buzz(5)).to eq 'Buzz'
expect(fizz_buzz(6)).to eq 'Fizz'
expect(fizz_buzz(15)).to eq 'Fizz Buzz'
end
end
結果(エラー時)の見た目
$ bundle exec rspec
Randomized with seed 10875
Fizz Buzz
fizz_buzz (FAILED - 1)
Failures:
1) Fizz Buzz fizz_buzz
Failure/Error: expect(fizz_buzz(4)).to eq '5'
expected: "5"
got: "4"
(compared using ==)
# ./spec/fizz_buzz_spec.rb:9:in `block (2 levels) in <top (required)>'Top 1 slowest examples (0.03074 seconds, 87.6% of total time):
Fizz Buzz fizz_buzz
0.03074 seconds ./spec/fizz_buzz_spec.rb:4Finished in 0.03509 seconds (files took 0.1029 seconds to load)
1 example, 1 failureFailed examples:
rspec ./spec/fizz_buzz_spec.rb:4 # Fizz Buzz fizz_buzz
Randomized with seed 10875
結果(ALL OK)の見た目
$ bundle exec rspec
Randomized with seed 22307
Top 1 slowest examples (0.00292 seconds, 37.5% of total time):
Fizz Buzz fizz_buzz
0.00292 seconds ./spec/fizz_buzz_spec.rb:4Finished in 0.00779 seconds (files took 0.10961 seconds to load)
1 example, 0 failuresRandomized with seed 22307
違いは???
一番使われているのはRSpecのようですが、独自のDSL(ドメイン固有言語)を使うため、学習コストが高い。機能は豊富
Minitestやunit-testはRubyの文法で書ける。基本機能は少ないが、プラグインを使用して機能追加可能
参考(伊藤さんのブログは良く参考にさせていただいてます^^)
結論
自分が好きなのを使おう^^
業務レベルのことをやるならRSpecが楽かも?
以上ですーーー!!
おやすみなさいぃぃーーー!