Ruby のテストフレームワーク minitestとRSpec
IT技術
はじめに
今回は私がRubyを学習する上で、テストフレームワークについて調べて、実践してみた内容をまとめてみようと思います。
Rubyのテストフレームワークにも様々種類がありますが、今回は minitest と RSpec について実際にコードを動かしてみます。
Rubyのテストフレームワーク
minitestとは
minitestとは、Rubyの標準のテストフレームワークです。Rubyをインストールすれば一緒にインストールされています。特に追加でセットアップは必要ありません。
RSpecとは、Ruby on Railsの開発でよく使われているテストフレームワークです。このフレームワークを使うには追加でgemのインストールが必要になっています。
環境構築
Rubyのインストールにはanyenv+rbenvを使ってインストールしようと思います。
anyenvとは各プログラミング言語に作られている、言語のバージョンを管理するためのツール(Rubyであればrbenv、Nodeであればnodenvなど)がまとめられたオールインワンのパッケージ管理ツールです。
公式ページにインストール方法があるのでそれを使ってインストールしていきます。(Macを使っているので今回紹介するのはHomebrewでのインストールです。)
以下のコマンドを実行していきます。
1$ brew install anyenv
2
3$ anyenv init
4# Load anyenv automatically by adding
5# the following to ~/.bash_profile:
6
7eval "$(anyenv init -)"
anyenv initを実行するとbash_profileに追加するように指示があるので、追加します。(各シェル環境によって異なる部分だと思います。)
1$ echo 'eval "$(anyenv init -)"' >> ~/.bash_profile
ここまで設定したら、ターミナルを開き直します。
1ANYENV_DEFINITION_ROOT(/Users/riywo/.config/anyenv/anyenv-install) doesn't exist. You can initialize it by:
2> anyenv install --init
このような表示が出ていれば、指示に従い、anyenv install --init
を実行して、再度ターミナルを開き直します。
ここまでくれば、anyenvのインストール完了です。
次にrbenvをインストールします。
1$ anyenv install rbenv
ターミナルを開き直して、rbenvでrubyをインストールします。(今回インストールするバージョンは3.1.1です)
1$ rbenv install 3.1.1
今回作成するサンプルコードを実行するディレクトリを作ります。
1$ mkdir ruby_test
2$ cd ruby_test
ディレクトリ移動後に以下のコマンドを実行するとrubyが対象のバージョンに切り替わっていることを確認できます。
1$ rbenv local 3.1.1
2$ ruby -v
3ruby 3.1.1p18 (2022-02-18 revision 53f5fc4236) [x86_64-darwin20]
サンプルテストコード
今回はrubyの大文字小文字変換をするupcase, downcase, capitalizeを対象としたテストコードを書いてみようと思います。
minitest
先程作ったディレクトリruby_test
で以下のコマンドを実行します。
1$ mkdir test
2$ touch test/sample_minitest_test.rb
作成したファイルsample_minitest_test.rb
で以下のコードを記載してください
1require 'minitest/autorun'
2
3class SampleMinitestTest < Minitest::Test
4 def test_case
5 assert_equal 'RIGHTCODE', 'rightcode'.upcase
6 assert_equal 'rightcode', 'rightcode'.downcase
7 assert_equal 'Rightcode', 'rightcode'.capitalize
8 end
9end
1行目でminitestを読み込み、3行目でminitestのクラスを作成し、各メソッドを利用したテストを記載しています。
テストコマンドを実行すると以下のように結果が表示されます。
1$ ruby test/sample_minitest_test.rb
2Run options: --seed 45661
3
4# Running:
5
6.
7
8Finished in 0.001178s, 848.8963 runs/s, 2546.6890 assertions/s.
9
101 runs, 3 assertions, 0 failures, 0 errors, 0 skips
failuresが0, errorsが0ですべてのテストケースが成功しています。
sample_minitest_test.rb
の5行目を以下のように変更して、実行するとテストが失敗することが確認できます。
1assert_equal 'rightcode', 'rightcode'.upcase
1$ ruby test/sample_minitest_test.rb
2Run options: --seed 59814
3
4# Running:
5
6F
7
8Finished in 0.001145s, 873.3627 runs/s, 873.3627 assertions/s.
9
10 1) Failure:
11SampleMinitestTest#test_case [test/sample_minitest_test.rb:5]:
12Expected: "rightcode"
13 Actual: "RIGHTCODE"
14
151 runs, 1 assertions, 1 failures, 0 errors, 0 skips
このように、何行目で、どういう内容でテストが失敗しているかを表示してくれます。
今回は予期する値になっていないという内容でテストが失敗しています。
RSpec
次にRSpecを使ったテストを行います。別途インストールが必要なので、bundlerを使ってインストールしていきます。
minitestと同じくディレクトリruby_test
で以下のコマンドを実行します。
1$ touch Gemfile
作成したGemfileに以下の内容を記載します。
1source "https://rubygems.org"
2
3gem "rspec", ">= 3.0.0"
次のコマンドでインストールします。
1$ bundle install
2
3$ bundle exec rspec --init
ここまで実行すると.rspec
とspec/spec_helper.rb
のファイルが作成されて、RSpecが実行可能になっています。
次にRSpecのテストコードを書いていきます。以下のコマンドでファイル作成します。
1$ touch test/sample_rspec_test.rb
sample_rspec_test.rb
に以下の内容を記載します。
1RSpec.describe 'Sample test' do
2 example 'test_case' do
3 expect('rightcode'.upcase).to eq 'RIGHTCODE'
4 expect('rightcode'.downcase).to eq 'rightcode'
5 expect('rightcode'.capitalize).to eq 'Rightcode'
6 end
7end
実行すると以下の結果になります。
failuresが0ということですべてのテストケースが成功しています。
1$ bundle exec rspec test/sample_rspec_test.rb
2.
3
4Finished in 0.00494 seconds (files took 0.13493 seconds to load)
51 example, 0 failures
次に3行目を以下のように変更して実行すると、失敗した実行結果が得られます。
1 expect('rightcode'.upcase).to eq 'rightcode'
1$ bundle exec rspec test/sample_rspec_test.rb
2F
3
4Failures:
5
6 1) Sample test test_case
7 Failure/Error: expect('rightcode'.upcase).to eq 'rightcode'
8
9 expected: "rightcode"
10 got: "RIGHTCODE"
11
12 (compared using ==)
13 # ./test/sample_rspec_test.rb:3:in `block (2 levels) in <top (required)>'
14
15Finished in 0.01935 seconds (files took 0.13322 seconds to load)
161 example, 1 failure
17
18Failed examples:
19
20rspec ./test/sample_rspec_test.rb:2 # Sample test test_case
このように失敗した箇所と理由を明示してくれます。
まとめ
Rubyのテストフレームワークである、minitestとRSpecについて調べて、実践してみました。
今回はrubyのメソッドを対象としたテストのみでしたが、今後は実際に自分がコードのテストやDatabaseを絡めたテストの書き方について調べていこうと思います。
ライトコードでは、エンジニアを積極採用中!
ライトコードでは、エンジニアを積極採用しています!社長と一杯しながらお話しする機会もご用意しております。そのほかカジュアル面談等もございますので、くわしくは採用情報をご確認ください。
採用情報へ
「好きを仕事にするエンジニア集団」の(株)ライトコードです! ライトコードは、福岡、東京、大阪、名古屋の4拠点で事業展開するIT企業です。 現在は、国内を代表する大手IT企業を取引先にもち、ITシステムの受託事業が中心。 いずれも直取引で、月間PV数1億を超えるWebサービスのシステム開発・運営、インフラの構築・運用に携わっています。 システム開発依頼・お見積もり大歓迎! また、現在「WEBエンジニア」「モバイルエンジニア」「営業」「WEBデザイナー」を積極採用中です! インターンや新卒採用も行っております。 以下よりご応募をお待ちしております! https://rightcode.co.jp/recruit
おすすめ記事
immichを知ってほしい
2024.10.31