From: Christian Neukirchen Date: 2006-09-30T01:34:07+09:00 Subject: [ANN] test/spec 0.1, a BDD interface for Test::Unit Hello, today I'm releasing test/spec, a library to do BDD with Test::Unit. == 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. 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.) You can use assert_* freely in specify-blocks; Object#should works in Test::Unit test cases, too, but doesn't increase the assertion count. == Wrapped assertions assert_equal: should.equal, should == assert_not_equal: should.not.equal, should.not == assert_same: should.be assert_not_same: should.not.be assert_nil: should.be.nil assert_not_nil: should.not.be.nil assert_in_delta: should.be.close assert_match: should.match, should =~ assert_no_match: should.not.match, should.not =~ assert_instance_of: should.be.an.instance_of assert_kind_of: should.be.a.kind_of assert_respond_to: should.respond_to assert_raise: should.raise assert_nothing_raised: should.not.raise assert_throws: should.throw assert_nothing_thrown: should.not.throw assert_block: should.satisfy == Additional assertions These assertions are not included in Test::Unit, but have been added to test/spec for convenience: * should.not.satisfy * a.should. (works like assert a.?) * 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 == 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.1 at http://chneukirchen.org/releases/testspec-0.1.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.) == Links Behavior-Driven Development:: RSpec:: script.aculo.us testing:: Happy hacking and have a nice day, Christian Neukirchen 9861cf92ec39cce7a5e96504f1fdb6f0 testspec-0.1.0.tar.gz -- Christian Neukirchen http://chneukirchen.org