はじめに
OPENLOGI Advent Calender 2020 の12月17日の記事です。
本日はオープンロジ歴4ヶ月の金井が担当します。
前職まではメーカー勤務で畑違いでしたが、ソフトウェアの品質管理に興味が湧きQAエンジニアとしてエンジニアのキャリアをスタートしました。
今年も終わりが近づき初心を振り返るために、入社前に 「QAエンジニアならテスト書かな!!」 と自作のアプリの単体テストを書いていたのでそれを振り返ってみようと思います。
(実際は開発者が単体テストを書いているので直接関与することはありませんでしたが、QAチームでテストの自動化に絶賛取り組んでいるので完全に無駄になることはないは、、ず。。。)
実装言語、環境は
- Ruby2.5
- Ruby on Rails5.2
(自分の初学言語であり、社内では使用していないです。)
そもそもRspecとは
Ruby用のテスティングフレームワークです。
今回はRuby on RailsにRspecを導入します。
factory_botとは
Rspecでテストを書いていて、
毎度対象のインスタンスを生成(User.newのところ)するのは面倒です。
例えばこんな感じで(Userモデルの単体テスト)
require 'rails_helper'
describe User do
describe '#create' do
it "usernameがないと登録できない" do
user = User.new(username: "", email: "test@example.com", password: "111111", password_confirmation: "111111")
user.valid?
expect(user.errors[:username]).to include("が入力されていません。")
end
it "emailがないと登録できない" do
user = User.new(username: "テストさん", email: "", password: "111111", password_confirmation: "111111")
user.valid?
expect(user.errors[:email]).to include("が入力されていません。")
end
end
end
そこで使えるのが factory_botです。
予めインスタンスの情報を記述しておけば、User.newでいちいちインスタンスを生成せずに、
buildやcreateといったメソッドで簡単に呼び出すことができます。
factory_botの導入
まずGemfileに以下を記述します。
gem 'factory_bot_rails'
次にspecディレクトリ直下にfactoriesフォルダを作成し、
その配下にそれぞれのファイルを置いていくというのが慣例みたいです。
今回の例であればusers.rbファイルを新規作成します。
FactoryBot.define do
factory :user do
username {"テストさん"}
email {"test@example.com"}
password {"111111"}
password_confirmation {"111111"}
end
end
これであとは呼び出すだけです。
*** factory_botの呼び出し
user = FactoryBot.build(:user)
作成したインスタンスは上記で生成されます。
今回はbuildメソッドですが、createメソッドでも生成されます。
createメソッドの場合は一時的にテスト用のDBにデータが保存されます。
例えば一意性の確認の時に、最初にcreateメソッドで1人目を登録しておくことで、
2人目が同じ内容を登録した時にバリデーションが働いているかを確認することができます。
そして、FactoryBotという記述を省略することができます。
そのためにはrails_helper.rbファイルに以下を記述しましょう。
このファイルはRspecをRailsにインストール後、
rails g rspec:instal
で生成されるファイルの一つです。
RSpec.configure do |config|
# 下記を追記
config.include FactoryBot::Syntax::Methods
最終的にはこうなります。
# factory_bot導入前
user = User.new(username: "テストさん", email: "test@example.com", password: "111111", password_confirmation: "111111")
# factory_bot導入後
user = build(:user)
かなりスリムになりました!
ちなみに、特定の箇所を変更したい場合は以下の通りです。
user = build(:user, username: "")
これでusernameが空のインスタンスが生成されることになります。
最後に
簡単な内容だったと思いますが、数ヶ月前の自分のような初学者の助けになれたら幸いです。