Is there any good way to temporarily suspend or, even better, take control of a Test::Builder testing session?
The reason I ask is because I am working on a specification-based testing system for Perl that utilizes random-testing methods in which a single property check can involve thousands of random test cases. It would be great if testers could take advantage of Test::More and other Test::Builder-based testing modules in their property declarations, but right now that is tricky.
The problem is that when somebody uses a function such as like() or is_deeply() within a property, it ends up getting called thousands of times when the property is checked. Test::Builder naturally thinks each one of these calls represents a complete test case, and it generates thousands of "ok" outputs and so on. Oops.
What I want is for each property check to be seen as a single test.
How I do do this now is somewhat hackish. For the duration of a property check, I redefine some Test::Builder internals like so:
sub check_property { no warnings 'redefine'; my $property = shift; my $diags = []; local *Test::Builder::ok = sub { $_[1] ? 1 : 0 }; local *Test::Builder::diag = sub { shift; push @$diags, @_; 0 }; return ( $diags, Test::LectroTest::TestRunner->new(@_)->run($property) ); }
The idea is to sever the part of Test::Builder that reports back to the caller (which I want) from the part that reports back to the test harness (which I do not want). It seems to work fine, but mucking around with another module's internals carries with it an element of risk that I don't like, and I would rather have a cleaner option.
Is there a cleaner option? If not, can/should we create one?
Cheers, Tom
For more background, see the following:
http://community.moertel.com/LectroTest http://search.cpan.org/dist/Test-LectroTest/lib/Test/LectroTest/Compat.pm