Look at Test::Tester, it hijacks the Test::Builder object and replaces with
another that sometimes delegates to the real Test::Builder object and other
times delegates to a custom Test::Builder object that just collects results
without outputting anything or affecting the "real" test results.

You can probably do what you need just with Test::Tester::run_tests. This
returns are an array of test results including, pass/fail, diagnostics and
all the other stuff that's mentioned under details in the Test::Builder
docs, so for example

my @results = run_tests(
        sub {
                for my $i (1..1000)
                {
                        # these test calls get collected for later analysis
                        ok(test_for_i($i), "i=$i"); # name is "i=$i"
                }
        }
}

my @bad = grep {$_->{ok} == 0} @results;

if (@bad)
{
        @values = join("\n", map {$_->{name}} @bad);
        # these calls go to the real Test::Builder
        fail();
        diag(@bad." tests failed, value were\n$values\n");
}

F

On Sat, Feb 26, 2005 at 06:00:02PM -0500, Tom Moertel wrote:
> 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

Reply via email to