Preventing Minitest Focus During CI
I really love using Minitest along with Minitest Focus during the development process with Rails.
All it takes is adding focus
before a test (or multiple tests), and running rails test
will only run those tests. This makes it very handy when working through a specific issue and continually running only those selected tests.
require "test_helper"
class MyControllerTest < ActionDispatch::IntegrationTest
focus
test "should render index page" do
# Test goes here.
# Only this test will run
end
test "should render show page" do
# Test goes here.
# This will get skipped
end
end
The way minitest-focus
works is that it basically changes the arguments passed to minitest to only include tests defined after the focus
statement. Very helpful!
However, one issue that I’ve run across during development of Kwikcal is accidentally leaving a focus
statement in a PR. It’s a small line, so easy to miss during code reviews. When this happens, your CI integration might give a false positive as your CI might only execute the focused tests!
Aside from catching this during a code review, a simple way to prevent accidentally leaving focus
statements in a pull request is to patch the method to throw an exception while in a CI environment.
To do this, I created a file named prevent_focus_in_ci.rb
and placed it in my test/support
folder, as these files are automatically loaded in my test helper.
if ENV["CI"] # Or "CIRCLECI"
class Minitest::Test
def self.focus
raise StandardError.new("FOCUS CALLED IN ERROR: #{self.name}")
end
end
end
With this little snippet you’ll get notified through a failing test suite if this method is ever left over in any of your test files. The raised error will let you know the test file it was added to.
Below is example output from Circle CI
1: from /home/circleci/project/test/models/example_test.rb:61:in `<class:ExampleTest>'
/home/circleci/project/test/support/prevent_focus_in_ci.rb:8:in `focus': FOCUS ADDED IN ERROR: [ExampleTest] (StandardError)
Very handy for making sure your entire test suite runs on CI, while still being able to use the very helpful focus
method during development.