I've been playing with Test::Class lately and, I must say, it's a heck of a nice module. Only thing that I wish it had is the possibility to report each test as a single pass/failure, no matter the number of assertions done in the function. Just like Test::Group does.
Hmmm... But wait a second. Could it be possible to somehow stuff the caramel-like sweetness of Test::Group in the smooth chocolatey wrapping of Test::Class? Turns out that yes, it's perfectly possible! And even more, without even having to muck with the guts of either modules:
package Some::TestSuite; use base qw/ Test::Class /; use Test::Group; use Test::More; sub Test :ATTR(CODE,RAWDATA) { my ( $pkg, $funct, $code ) = @_; no warnings; # black magic starts here my $func_name = *{$funct}{NAME}; my $fullname = $pkg.'::'.$func_name; *{$funct} = sub { print "begin test [", scalar localtime, "]\n"; Test::Group::test( $fullname => \&{$code} ); print "end test [", scalar localtime, "]\n"; }; Test::Class::Test( @_ ); } sub aTest : Test { ok 1, 'eins'; ok 1, 'zwei'; ok 1, 'drei'; } sub otherTest : Test { ok 1, 'un'; ok 0, 'deux'; ok 1, 'trois'; } Some::TestSuite->runtests;Which gives
$ perl test.t 1..2 begin test [Thu Jun 19 22:17:16 2008] ok 1 - Some::TestSuite::aTest end test [Thu Jun 19 22:17:16 2008] begin test [Thu Jun 19 22:17:16 2008] # Failed test 'deux' # in a.t at line 32. not ok 2 - Some::TestSuite::otherTest # Failed test 'Some::TestSuite::otherTest' # at a.t line 17. # (in Some::TestSuite->otherTest) end test [Thu Jun 19 22:17:16 2008] # Looks like you failed 1 test of 2.
This method, though, has two modest caveats: