• トップ
  • ブログ一覧
  • Ruby のテストフレームワーク minitestとRSpec
  • Ruby のテストフレームワーク minitestとRSpec

    エンジニア記事エンジニア記事
    2022.03.31

    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

    ここまで実行すると.rspecspec/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を絡めたテストの書き方について調べていこうと思います。

    ライトコードでは、エンジニアを積極採用中!

    ライトコードでは、エンジニアを積極採用しています!社長と一杯しながらお話しする機会もご用意しております。そのほかカジュアル面談等もございますので、くわしくは採用情報をご確認ください。

    採用情報へ

    エンジニア記事

    エンジニア記事

    おすすめ記事

    エンジニア大募集中!

    ライトコードでは、エンジニアを積極採用中です。

    特に、WEBエンジニアとモバイルエンジニアは是非ご応募お待ちしております!

    また、フリーランスエンジニア様も大募集中です。

    background