Run all your tests with rake
14. February, 2012 2 Comments
When writing automated tests one of the things you will always want to do is execute them. When using RSpec the only thing you have to do is type rspec
into your console and of they go. All your tests i.e. specs get executed. Now you might have already heard about rake a.k.a. Ruby make. Within rake there is a test task that can be used to execute tests in the RSpec style described before with only a few lines of Ruby.
So lets started, open your Rakefile[1] and add the following lines of code, I’m using MiniTest::Spec for some of my projects but I’ll explain in a bit how you can modify the task to suit your needs.
require 'rake/testtask'
Rake::TestTask.new do |t|
t.libs = ["lib"]
t.warning = true
t.verbose = true
t.test_files = FileList['spec/*_spec.rb']
end
This lets us run all spec files that are in the spec directory and the filenames end with _spec.rb
by typing rake test
into the console.
If your using another test library e.g. TestUnit you can change the seventh line to t.test_files = FileList['test/*_test.rb']
, which will run all your tests analog to the spec command but in another directory i.e. with a different filename ending.
Now what are all the other configurations for? Well lets go through them one by one.
- libs: In the example case loads the lib directory into as default environment, this allows you to use
require 'my_class'
in your unit tests instead of having to use relative paths e.g.require_relative '../lib/myclass'
. - waring: This runs your tests with the warning flag enabled i.e.
ruby -w
, this shows you possible problems and we don’t want to give other people potential problems do we? - verbose: Verbose output e.g. files used in test
It’s up to you which flags you want to enable and disable the one argument you should provide is test_files.
Separating slow tests
Now not every test you write may be a unit test and those tests that aren’t have the tendency to run slower then a unit test, which leads to favoring separation of unit tests and for example integration tests.
I like to add an additional directory for my integration tests within the spec directory. Which then looks something like this:
|-spec
|---integration
Our original rake task will not work with this structure i.e. it will just ignore the specs we store under spec/integration
. Further we would actually like to run our unit tests and integration tests separately. So lets add a new task for our integration tests.
#previous code omitted
Rake::TestTask.new do |t|
t.libs = ["lib", "spec"]
t.name = "test:integration"
t.warning = true
t.test_files = FileList['spec/integration/*_spec.rb']
end
If we now type rake test:integration
into the console all our integration tests will be run. Note that by adding the spec folder you can require 'spec_helper.rb'
in the integration tests.
Naming a test task allows you to choose between them, but there is a more convenient way of naming a test task. Let me show you by adding a further task that will execute all our specs/tests in the spec directory including sub folders.
#previous code omitted
#integration test code omitted
Rake::TestTask.new("test:all") do |t|
t.libs = ["lib", "spec"]
t.warning = true
t.test_files = FileList['spec/**/*_spec.rb']
end
With rake test:all
we can now run all our tests in one go. And if we decide to add another category of tests they will also be run with this approach.
References
Rake:TestTask
Ruby Inside MiniTest::Spec
Further reading rake
A good point to get some more rake skills is the Rake Tutorial by Jason Seifer or the Official Rake Tutorial.
—-
[1] If not present just create a file named Rakefile and continue on reading.
Pingback: JUnit Tutorial « Zeeshan Akhter
Pingback: A geek with a hat » Unit testing is for lazy people