Today I’m releasing test/spec 0.2, a library to do BDD with Test::Unit.
(See below for changes in version 0.2.)
What is test/spec?
test/spec layers an RSpec-inspired interface on top of Test::Unit, so you can mix TDD and BDD (Behavior-Driven Development).
test/spec is a clean-room implementation that maps most kinds of Test::Unit assertions to a ‘should’-like syntax.
Consider this Test::Unit test case:
class TestFoo < Test::Unit::TestCase
def test_should_bar
assert_equal 5, 2 + 3
end
end
In test/spec, it looks like this:
require 'test/spec'
context "Foo" do
specify "should bar" do
(2 + 3).should.equal 5
end
end
test/spec does not include a mocking/stubbing-framework; use whichever you like to—FlexMock and Mocha have been tested.
test/spec has no dependencies outside Ruby 1.8.
Mixing test/spec and test/unit
test/spec and Test::Unit contexts/test cases can be intermixed freely, run in the same test and live in the same files. You can just add them to your Rake::TestTask, too. test/spec allows you to leverage your full existing Test::Unit infrastructure.
test/spec does not change Test::Unit with the exception of monkey-patching Test::Unit::TestSuite to order the test cases before running them. (This should not do any harm, but if you know a way around it, please tell me.)
Wrapped assertions
assert_equal:should.equal,should ==assert_not_equal:should.not.equal,should.not ==assert_same:should.beassert_not_same:should.not.beassert_nil:should.be.nilassert_not_nil:should.not.be.nilassert_in_delta:should.be.closeassert_match:should.match,should =~assert_no_match:should.not.match,should.not =~assert_instance_of:should.be.an.instance_ofassert_kind_of:should.be.a.kind_ofassert_respond_to:should.respond_toassert_raise:should.raiseassert_nothing_raised:should.not.raiseassert_throws:should.throwassert_nothing_thrown:should.not.throwassert_block:should.satisfy
Additional assertions
These assertions are not included in Test::Unit, but have been added to test/spec for convenience:
should.not.satisfya.should.predicate(works likeassert a.predicate?)a.should.be operator(where operator is<,<=,>,>=, or===)should.output, to check what is printed
SpecDox and RDox
test/spec adds two additional test runners to Test::Unit, based on the console runner but with a different output format.
SpecDox, run with --runner=specdox (or -rs) looks
like RSpec’s output:
spec.output
- works for print
- works for puts
- works with readline
RDox, run with --runner=rdox (or -rr) can be
included for RDoc documentation (e.g. see SPECS):
== spec.output
* works for print
* works for puts
* works with readline
SpecDox and RDox work for Test::Unit too:
$ ruby -r test/spec test/testunit/test_testresult.rb -rs
Test::Unit::TC_TestResult
- fault notification
- passed?
- result changed notification
Finished in 0.106647 seconds.
3 specifications (30 requirements), 0 failures
specrb
Since version 0.2, test/spec features a standalone test runner called specrb. specrb is like an extended version of testrb, Test::Unit’s test runner, but has additional options. It can be used for plain Test::Unit suites, too.
$ specrb -a -s -n should.output
should.output
- works for print
- works for puts
- works with readline
Finished in 0.162571 seconds.
3 specifications (6 requirements), 0 failures
See specrb --help for the usage.
Changes in version 0.2
- Better, module-based implementation
- Official support for FlexMock and Mocha
- More robust
Should#output Should#operator- Nested contexts
- Standalone test/spec runner, specrb
- -w warning free
Roadmap
Version 0.3 (November 2006): deprecate underscore forms.
Version 1.0 (Late November 2006): first stable release.
Contact
Please mail bugs, suggestions and patches to chneukirchen@gmail.com.
Darcs repository (“darcs send” is welcome for patches):
http://chneukirchen.org/repos/testspec
Thanks to
- Eero Saynatkari for writing should.output.
- Thomas Fuchs for script.aculo.us BDD testing which convinced me.
- Dave Astels for BDD.
- The RSpec team for API inspiration.
- Nathaniel Talbott for Test::Unit.
Copying
Copyright (C) 2006 Christian Neukirchen
test/spec is licensed under the same terms as Ruby itself.
Where can I get it?
You can download test/spec 0.2 at:
http://chneukirchen.org/releases/testspec-0.2.0.tar.gz
Alternatively, you can checkout from the development repository with:
darcs get http://chneukirchen.org/repos/testspec
(Patches using “darcs send” are most welcome.)
Happy hacking and have a nice day, Christian Neukirchen
d59a0412f8930bf8354d1fe2e089a49d testspec-0.2.0.tar.gz
NP: David Gilmour—Mihalis