電波ビーチ

☆(ゝω・)v

Rubyでの開発で最近学習したこと Rspec

or3.hatenablog.com

のシリーズの続きのつもりです。

環境

rbenv versions
  system
  2.5.0
* 2.5.1

gemでbundlerのみインストール済み

基礎

「とりあえず写経/コピペするだけだし'test'ってフォルダ/ファイル/class/メソッド名でいいや。そういうのgithubでよく見るし」

常にこの姿勢であったが、駄目っぽい。そもそもtestって 「なんか調べてたら使えそうなやつあったから手元で動かしてみるか」 程度の意味だと思っていた。

TDD?

名前くらいは聞いたことあるし言及している記事も読んだことがあるが、開発の経験がないし、生活のなかで適当にその場限りのプログラムを書き捨てるだけの人間なので、テストという頻出単語がいったいなんなのか分からん。
要するに、今回の試みで導入した感じで、先にテストコードを書いてから、そのような結果になるように実際のロジックを実装する、という感じ(だと思う多分)。
rubyだとMinitestなどが該当する。

BDD?

Behavior Driven Development. TDDがテストを視座にした概念で、BDDは振る舞いを視座にした概念。
TDDの文法は「こういう入力に対してのこういう出力」みたいな感じで、BDDではこれが「このメソッドにこうすると、こういう結果を期待する」みたいな感じ。意味は同じように感じるが、要求仕様を説明(テスティングフレームワークではdescribe文とかが使われることが多いようだ)している点が(たぶん)違い。Minitestの例をみると、テストメソッド名が長々と説明的になっているものをみかけるが、RSpecの流儀に従えばそのようなことはなくなる。英語的にちゃんと意味が通るように書いてみればよい。
RubyだとRspecとかが該当する。

spec?

テストフレームワークワークという文言に思考が引っ張られるけど、 Specification(仕様) のことらしい。

プロジェクトフォルダ作成

適当な場所に。

$ tree
.
└── lib
    └── fizz_buzz.rb

bundlerでRSpecをインストール

bundle init

したらGemfileが出来るのでrspecを入れるように指定

# frozen_string_literal: true

source "https://rubygems.org"

git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }

gem "rspec"

bundle install --path vendor/bundle

パスは指定してやらないとグローバルにインストールされるので注意
ちなみにここでGemfile.lockが作成される

以降はexecをつけて実行

bundle経由でやるので。

rspecの初期化

bundle exec rspec --init
するとspecフォルダと.rspecファイルが作成される。

specフォルダにはspec_helper.rbが作成されている。.rspecとあわせてどう使うのはわからん。

とりあえずこのフォルダにターゲットのファイルの名前_spec.rbという感じでテストコードを書いていく。

テストコードを書く

fizz_buzz_spec.rbとして、

# require './lib/fizz_buzz'
require 'fizz_buzz' # この書き方でも自動で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 'FizzBuzz'
        expect(fizz_buzz(18)).to eq 'Fizz'
        expect(fizz_buzz(19)).to eq '19'
        expect(fizz_buzz(20)).to eq 'Buzz'
        expect(fizz_buzz(30)).to eq 'FizzBuzz'
    end
end

としてみた。

テストしてみる

なんどもいうが、今回はbundle経由なので。

bundle exec rspec

よくできました。

参考

Railsでデフォルトで使われるからか、Railsを扱った例が多く見つかる。純粋にRSpecだけをやるやつがほしいのに。。

久しぶりにbundler使ったけどおさらいがてらこれでおk bundlerでgemをプロジェクトごとに管理する

railsが絡んでこないrspecの記事ならこれで必要十分わかる【RSpec】知識ゼロから始めるRSpecの基本構文理解と使い方まで

rspec単体でのシンプルなチュートリアル はじめてのRSpec - まずテスト書いてからコード書くシンプルなチュートリアル

そのあとやったらいいやつ Rspec 入門