👀

RSpecで特定のテストを実行する方法

2020/12/13に公開

RSpec で特定のテストを実行する方法について書きます。
処理を追加したときや、落ちたテストを修正して確認したい時などに便利で使っています。

特定のテストだけを実行する方法

// 実行したいテストのファイル名と行数を指定
$ rspec spec/models/user_spec.rb:12

このようにファイル名と行数を指定すれば、特定のテストだけを実行することができますが、行数を確認する手間が掛かったり、複数のテストを実行したいときに困ります。

個人的には次の方法がおすすめです。
spec_helper.rb に以下の記述を追記して、focus: true を使えるようにします。

spec_helper.rb
RSpec.configure do |config|
  config.filter_run_when_matching :focus
end

以下のように実行したいテストブロックに f をつけることで、そのテストブロックのみ実行されます。
fdescribe, fcontext, fit のように使うことができます

user_spec.rb
RSpec.describe User, type: :model do
  describe "Validation" do
    # テストは省略しています

    it "is invalid without a name" do
    end

    # 実行したいテストブロックに f をつける。
    fit "is invalid without a email" do
    end

    it "is invalid without a password" do
    end
  end
end
$ rspec spec/models/user_spec.rb

User
  Validation
    is invalid without a email

以下のように書いても OK ですが、上の書き方が楽なのであまり使わないかもしれません。

focus "is invalid without a email" do
end

it "is invalid without a email", focus: true do
end

it "is invalid without a email", :focus do
end

気をつけること

私はよくfを消し忘れてしまいます。
RubocopClass: RuboCop::Cop::RSpec::Focus を設定しておくと消し忘れた場合に検知できます。あわせて pre-commitCI を使って自動で Rubocop を実行するようにしておくと便利です。

Discussion