🚧

[RSpec]focus tagが入っていたらCIが必ず落ちるようにする

2021/04/25に公開

RSpecで特定のテストを実行する場合

RSpecで特定のテストだけを実行したい場合はいくつかの方法がありますが、僕はfocus tagが使いやすいと思っています。

# spec/spec_helper.rb

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

上記の設定を入れておくとdescribe/context/itにfをつけてfdescribe/fcontext/fitとすることでそのブロック内のテストだけが実行されます。

FYI:https://qiita.com/misogi@github/items/df6218114906a6a31270

focus tagの運用が難しいところ

fdescribe/fcontext/fitを書いてしまうとそのブロック内のテストしか実行されなくなるのでCIで全てのテストが実行されません。その結果変更によってテストが落ちていることに気づけなくなる可能性があります。focus tagは開発時は便利ですが、開発環境以外では使えなくするべきです。
そこで自分が普段開発しているプロジェクトだと2つの対策をしています。

  1. CIでfocus tagが使われていたら例外を起こす
  2. pre-commitを使ってfocus tagが入っていたらコミットできなくする。

1. CIでfocus tagが使われていたら例外を起こす

config.before(focus: true) でfocus tagが使われているかどうか検知できます。focus tagが使われた場合渡したblockが評価されるので、block内で例外を吐くようにしています。

# spec/support/focus_tag.rb 

RSpec.configure do |config|
  # CircleCIを利用しているのでCIという環境変数の有無で分岐する
  if ENV['CI']
    config.before(focus: true) { raise "Don't use focus tag in CI" }
  else
    config.filter_run_when_matching :focus
  end
end

2. pre-commitを使ってfocus tagが入っていたらコミットできなくする。

pre-commitのチェック対象として rspec_focus を指定するとfocus tagが使われているかどうかチェックしてくれます。

git config pre-commit.checks "[rspec_focus]"

Discussion