Tests running on commit
If you are like me you like to have fast running tests and you don’t want failing tests in your repository. Normally you ensure this with developer discipline and a CI server running stuff when repos get pushed to the remote git server.
The other day I played with the thought of actually stopping a commit if the specs isn’t running.
You need to have blindlingly fast tests for this to be practical. Tests hitting the database or being
involved in I/O in general are out of the question here. With git you can put hooks on almost everything.
One place is the pre-commit
hook and it is suitable for this purpose. All the hooks are located in the
.git/hooks
folder of the repository. In a new repo there is a bunhc of samples here to give inspiration
about what is possible to do. The principle is easy. Any hook that returns a non-zero result will
interrupt the execution of the git command currently running. So for this purpose I just needed to add
one line of code to the new pre-commit
file.
exec rspec spec
This command returns non-zero when a test is failing so it will stop the commit from proceeding if there are failing tests.
Suppose you are running java and maven (like me at my current assignment)? Then you are out of luck. Just waiting for maven to get started is the kind of times we don’t have patience with when comitting code. Then we are lucky to have our build server doing it for us.