スポンサーリンク

RubyでFizzBuzzとそのテスト(プロを目指す人のためのRuby入門[改訂2版]を写経してみる)

2022年2月16日

Everyday Rails – RSpecによるRailsテスト入門が難しくて疲れてしまったので、Rubyをちゃんと勉強しようと思い、プロを目指す人のためのRuby入門[改訂2版]を購入して読んでみています。

その第2章で、

  • FizzBuzzプログラムを作る
  • FizzBuzzプログラムをMiniTestでテストする
  • FizzBuzzプログラムをRSpecでテストする

という項目があったので、写経してみたいと思います。

スポンサーリンク

開発環境

Windows 10 Pro 21H1
Hyper-Vを有効化
VisualStudioCode (wsl用の拡張機能インストール済み)

WSL2 Ubuntu 20.04 LTS
rbenv 1.2.0-8-ga76c4aa
ruby 3.1
nvm 0.39.1
node 16.13.2
yarn 1.22.17
sqlite3
google-chrome-stable

FizzBuzzプログラムを作る

WSL2のUbuntu20.02を開き、以下を入力します。

mkdir ruby-book
cd ruby-book
code .

VisualStudioCodeが開くので、Ctrl+@でターミナル画面を開いておきます。

lib/ ディレクトリを作成し、その中に、fizz_buzz.rb ファイルを作成します。

FizzBuzzプログラムとは

FizzBuzzプログラムの仕様は以下の通りです。

  • 3で割り切れる数値を引数に渡すと、"Fizz"を返す
  • 5で割り切れる数値を引数に渡すと、"Buzz"を返す
  • 15で割り切れる数値を引数に渡すと、"FizzBuzz"を返す

コードが動くことを確認

puts "Hello World!"

と保存して、ターミナル画面で、以下を入力して実行

ruby lib/fizz_buzz.rb

fizz_buzzメソッドの作成

fizz_buzz(n)関数は、以下のような関数です。

fizz_buzz(1) #=> "1"
fizz_buzz(2) #=> "2"
fizz_buzz(3) #=> "Fizz"
fizz_buzz(4) #=> "4"
fizz_buzz(5) #=> "Buzz"
fizz_buzz(6) #=> "Fizz"
fizz_buzz(15) #=> "Fizz Buzz"

n=1, n=2のときの結果を満たすコードを書く

まずは、

fizz_buzz(1) #=> "1"
fizz_buzz(2) #=> "2"

を満たす関数を定義します。to_sメソッド(数値を文字列に変換するメソッド)を用いて

def fizz_buzz(n)
  n.to_s
end

puts fizz_buzz(1)
puts fizz_buzz(2)

n=3のときの結果も満たすコードに改変する

3で割り切れたときに、"Fizz"を返すようにします。if else end を使います。

def fizz_buzz(n)
  if n % 3 == 0
    'Fizz'
  else 
    n.to_s
  end
end

puts fizz_buzz(1)
puts fizz_buzz(2)

n=4,5,6のときの結果も満たすコードに改変する

if elsif else end を用います。

n=15のときの結果も満たすコードに改変する

n % 3 == 0 よりも上に記載します。これでFizzBuzz関数は完成です。

こうやって、プログラムって書いていくんですね。 プロを目指す人のためのRuby入門[改訂2版]は、プログラムを組んでいく過程の説明が理論的で非常にわかりやすく、読んでいて楽しいのと、すごく役に立つ気がします。

Minitestでテストを書く

プロを目指す人のためのRuby入門[改訂2版]には、丁寧に順を追って解説されているのですが、ここでは最終版のコードのみ記載します。

test/fizz_buzz_test.rb を新規作成

ターミナル画面に以下を入力して、testを実行してみます。

ruby test/fizz_buzz_test.rb

あ、failしました。

assert_equal '6', fizz_buzz(6)

のところを以下のように訂正して、もう一度テストを実行すると、ちゃんとpassしました。

RSpecでテストを書く

https://techtechmedia.com/ruby-setup-rspec/

上記サイトを参考に、RSpecの環境構築を行います。

/ruby-book/rspec/ ディレクトリを作成し、bundle initでGemfileを作成します。具体的には、ターミナル画面に以下を入力します。

mkdir rspec
cd rspec
bundle init

Gemfileに以下を追記します。

gem "rspec"

(変更前)

(変更後)

次に、ターミナル画面に以下を入力します。

bundle install
bundle exec rspec --init

spec/spec_helper.rb を開き、 49行目 の「=begin」と、97行目の「=end」を削除します。

spec/fizz_buzz_test_spec.rb ファイル(ファイル名の最後が、xxx_spec.rb となるようにします。最初、ここでハマって焦りました。)を新規作成し、以下を入力します。

require_relative '../../lib/fizz_buzz'

RSpec.describe 'Fizz Buzz' do
  example 'fizz_buzz' do
    expect(fizz_buzz(1)).to eq '1'
    expect(fizz_buzz(2)).to eq '2'
    expect(fizz_buzz(3)).to eq 'Fizz'
    expect(fizz_buzz(4)).to eq '4'
    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

無事、テストが通りました。

RSpecテストのファイル名の末尾は必ず「_spec.rb」とする必要がある

なお、fizz_buzz_test_spec.rb のファイル名を、_spec.rbで終わらないファイル名、例えば、

fizz_buzz_test_rspec.rb

にして、bundle exec rspec を実行すると、以下のようになってしまいます。

No examples found.

Randomized with seed 12337


Top 0 slowest examples (0 seconds, 0.0% of total time):

Finished in 0.0013 seconds (files took 0.07704 seconds to load)
0 examples, 0 failures

Randomized with seed 12337

重要なことは、

rspecのテストのファイル名の末尾は、 “_spec.rb"

とするということみたいです。

Rails

Posted by twosquirrel