tapitapi’s blog

1日1杯タピオカ!エンジニア

【Ruby】Minitest, test-unit, RSpec の違い

Rubyのテストを自動化したいな、と思い、下記3種類のテスティングフレームワークを使ってみたので紹介

 

*Minitest

*test-unit

RSpec

 

テストに使うfizz_buzzメソッド

(3の倍数で"Fizz", 5の倍数で"Buzz", 15の倍数で"Fizz Buzz", それ以外は引数で与えられた数字を出力。世界のナベアツ の元ネタ、、、?)

は既に実装されている前提で、上記3種類を比較していきます。

 

*Minitest

Rubyをインストールした段階で、Minitestは一緒にインストールされているので、そのまま使えます

 

Minitestで使えるメソッド(わたしが使用したもの)は下記参考

www.rubydoc.info

 

コード例(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

 

結果(エラー時)の見た目

$ ruby test/fizz_buzz_test.rb

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と同じメソッドでした!)

www.rubydoc.info


コード例(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

RSpecが使用できる環境を作成する必要があります。

私は下記の記事を参考にさせていただきました。

qiita.com

 

使えるメソッド(わたしが使用したもの)は下記参考

relishapp.com

 

コード例(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:4

Finished in 0.03509 seconds (files took 0.1029 seconds to load)
1 example, 1 failure

Failed 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

Fizz Buzz
fizz_buzz

Top 1 slowest examples (0.00292 seconds, 37.5% of total time):
Fizz Buzz fizz_buzz
0.00292 seconds ./spec/fizz_buzz_spec.rb:4

Finished in 0.00779 seconds (files took 0.10961 seconds to load)
1 example, 0 failures

Randomized with seed 22307

 

違いは???

一番使われているのはRSpecのようですが、独自のDSLドメイン固有言語)を使うため、学習コストが高い。機能は豊富

Minitestやunit-testはRubyの文法で書ける。基本機能は少ないが、プラグインを使用して機能追加可能

 

参考(伊藤さんのブログは良く参考にさせていただいてます^^)

blog.jnito.com

 

結論

自分が好きなのを使おう^^

業務レベルのことをやるならRSpecが楽かも?

 

以上ですーーー!!

 

おやすみなさいぃぃーーー!