[ANN] test/spec 0.2, a BDD interface for Test::Unit

Hello,

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.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.<predicate> (works like assert 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 <tt>--runner=specdox</tt> (or <tt>-rs</tt>) looks
like RSpec's output:

    spec.output
    - works for print
    - works for puts
    - works with readline

RDox, run with <tt>--runner=rdox</tt> (or <tt>-rr</tt>) 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
<mailto: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 <http://purl.org/net/chneukirchen>
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.)

== Links

Behavior-Driven Development:: <http://behaviour-driven.org/>
RSpec:: <http://rspec.rubyforge.org/>
script.aculo.us testing:: <http://mir.aculo.us/articles/2006/08/29/bdd-style-javascript-testing>
FlexMock:: <http://onestepback.org/software/flexmock/>
Mocha:: <http://mocha.rubyforge.org/>

Happy hacking and have a nice day,
Christian Neukirchen

d59a0412f8930bf8354d1fe2e089a49d testspec-0.2.0.tar.gz

···

--
Christian Neukirchen <chneukirchen@gmail.com> http://chneukirchen.org

Hi Christian

This all looks very neat, I'd like to give it a try. Two quick questions:

* have you heard any feedback on how well it works w/i rails,
especially the multiple aliases of setup/teardown and similiar hackery
that goes on?

* why are.method.calls done with periods instead_of nice underscores?

- Rob

···

On 10/18/06, Christian Neukirchen <chneukirchen@gmail.com> wrote:

== Roadmap

Version 0.3 (November 2006):: deprecate underscore forms.

--

"Rob Sanheim" <rsanheim@gmail.com> writes:

Hi Christian

This all looks very neat, I'd like to give it a try. Two quick questions:

* have you heard any feedback on how well it works w/i rails,
especially the multiple aliases of setup/teardown and similiar hackery
that goes on?

I didn't try it with rails yet, but it uses the same mechanisms as the
mocking libraries, so it should work. Feedback is welcome.

* why are.method.calls done with periods instead_of nice underscores?

Because that's far easier to implement and extend (and I actually
think it looks better).

···

- Rob

--
Christian Neukirchen <chneukirchen@gmail.com> http://chneukirchen.org