ZenTest provides 4 different tools and 1 library: zentest, unit_diff, autotest, multiruby, and Test::Rails.
ZenTest scans your target and unit-test code and writes your missing code based on simple naming rules, enabling XP at a much quicker pace. ZenTest only works with Ruby and Test::Unit.
unit_diff is a command-line filter to diff expected results from actual results and allow you to quickly see exactly what is wrong.
autotest is a continous testing facility meant to be used during development. As soon as you save a file, autotest will run the corresponding dependent tests.
multiruby runs anything you want on multiple versions of ruby. Great for compatibility checking!
Test::Rails helps you build industrial-strength Rails code.
Changes:
3.9.0 / 2008-01-30
15 minor enhancements:
- Added Wilson's patch to allow unit_diff to work with mspec. Adding rspec next.
- Minor overhaul for autotest:
- Added -f flag to start up without testing.
- Added -q flag to autotest to make it extra quiet. Patch by Aaron Patterson.
- Added ability to set test execution order, defaults to :random. EVIL!
- Added completedre and failedresults_re to help subclasses like rspec.
- Added deprecation warnings for hooks. Deprecated :run.
- Added find_directories accessor, defaults to ['.']
- Added sleep accessor, defaults to 1 second.
- Changed findfiles to order files in the same order as finddirectories.
- Changed how autodiscover works with $:, added lib to the front.
- Cleaned out nearly every @ and use accessor methods instead. You should too.
- Made test_mappings ordered.
- Removed @files, adding @findorder and @knownfiles.
- Renamed testsforfile to testfilesfor.
- testfilesfor now only returns known files.
- http://rubyforge.org/projects/zentest/
- ryand-ruby@zenspider.com

"* Cleaned out nearly every @ and use accessor methods instead. You should too."
Excuse me if this is a dense question, but I'm somewhat new to Ruby. What the heck does this mean? You can't have gotten rid of all the instance variables in the code, can you? Is there some nuance here I'm missing? Thanks.
Ben, good question... it simply means I'm going through my ivar accessors almost 100% now. It is the difference between @a = @b * @c and self.a = self.b * self.c or even self.a = b * c.
Thanks for responding!
I guess I don't see the advantage (or difference very clearly). I don't want to bug you repeatedly about this one comment, so is there some... article or... something you could link me to?
The chief difference, here, is that self.a = self.b * self.c is calling two accessor methods to get b and c (presumably @b and @c, but I guess they could be calculated or otherwise figured out) and then calling a method a= to assign the value to (presumably) @a?