🚧
[RSpec]focus tagが入っていたらCIが必ず落ちるようにする
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つの対策をしています。
- CIでfocus tagが使われていたら例外を起こす
- 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