in reply to How can I write Test::Finished?

exec is enough to make me think this is a bad idea. And there are other reasons why this wouldn't really address the "problem".

Instead write Test::AutoPlan that you use like:

perl -MTest::AutoPlan -e0 t/*

and it would run each of your t/* files and then modify them to record the current plan count, notifying you how the counts had changed.

Instead of writing your t/* files like:

use Test::More ( ... ); ...

you'd write them like:

use Test::AutoPlan qw( Test::More ... ); ...

and perl -MTest::AutoPlan t/* would change that to

use Test::AutoPlan 23 qw( Test::More ... ); ...

and you could even make it so "make plan" updates the test count plans.

The Test::AutoPlan code goes something like this:

my $plan; sub VERSION { $plan = $_[1]; } sub import { my $self = shift(@_); goto &UpdateTests if ! @_; my $module = shift(@_); my @plan = "no_plan"; if( defined($plan) ) { @plan = ( tests => $plan ); } elsif( "Test::Simple" eq $module ) { @plan = ( tests => 0 ); } unshift @_, $module, @plan; my $import = $module . "::import"; undef $plan; goto &$import; } sub UpdateTests { for my $test ( @ARGV ) { my $plan = RunTestsAndCount( $test ); @ARGV = $test; $^I = ".old"; while( <> ) { s{ ^( [\w\s]* (?<![\w:]) Test::AutoPlan ) (\s+\d+)? }{ $1 . " " . $plan }ex; print; } } }

The first argument could be Test::Simple instead of Test::More (or whatever other modules you decide to support).

- tye        

Replies are listed 'Best First'.
Re^2: How can I write Test::Finished? (auto count)
by samtregar (Abbot) on Jun 21, 2004 at 21:27 UTC
    I might have misunderstood, but I think this would require me to run

       perl -MTest::AutoPlan t/*

    every time I add a new test. That's definitely an improvement over having to manually adjust a magic number, but it's still a long way from the no-work solution I'm looking for.

    -sam

      Well, you could use it how you like. I'd run "make plan" every time I released a new version of the module. You could even make "make dist" run "make plan" (for your modules).

      If I'm about to make a lot of incremental changes to some test plans, then I could remove the number from the "use Test::AutoPlan" line to revert to plan-less testing.

      I'd think even you would do "make test" every time you added new tests so I'm not sure why replacing that with "make plan; make test" (or perhaps just "make plan test") is such a hardship for you. I'd think the "work" is doing the counting. If you can't handle typing those few extra characters, then I don't know how you managed to produce a module in the first place. (:

      [ Update: Actually, "make plan" should tell you if any tests failed so you could just always use "make plan" instead of "make test" and fool people into thinking that you use plans when you never do. If you have "make plan" be smart enough to not update test files if they already report the correct plan number, then this seems like it might even be little enough work / change for you (if I can be so presumptuous as to make such a guess). ]

      But it sounds like you don't care at all about the types of failures that plans are meant to catch, so perhaps you should just add:

      ok( 1, "NO, I don't *WANT* a plan" ) if rand() < 0.5;

      to the end of all of your test files to prevent those annoying patches from coming it.

      - tye        

        I'm not sure why replacing that with "make plan; make test" (or perhaps just "make plan test") is such a hardship for you.

        It's a hardship because I'll forget to do it. My fingers know how to type 'make test' all by themselves; they don't even ask my spinal column for guidence.

        But it sounds like to don't care at all about the types of failures that plans are meant to catch

        That's almost true. I certainly don't care enough to maintain a magic number at the top of all my test files. But I do care enough to bang out a module that I can add once and forget about. It sounds like some combination of a source filter and fork() will do the trick, so I think I'll give that a try.

        -sam

Re^2: How can I write Test::Finished? (auto count)
by dragonchild (Archbishop) on Jun 21, 2004 at 19:52 UTC
    Hear hear!

    ------
    We are the carpenters and bricklayers of the Information Age.

    Then there are Damian modules.... *sigh* ... that's not about being less-lazy -- that's about being on some really good drugs -- you know, there is no spoon. - flyingmoose

    I shouldn't have to say this, but any code, unless otherwise stated, is untested