[Chicago-talk] perl tests with overhead
Greg Fast
gdf at speakeasy.net
Tue Jul 26 09:37:44 PDT 2005
On Tue, Jul 26, 2005 at 09:57:57AM -0500, JT Smith wrote:
> The problem comes in that I don't want each test to have to seperately
> establish a session before running if I can help it. What I'd like to do
> is create a session and then pass each test a reference to the session.
I recently hacked together a solution to a similar testing problem,
using the previously-unknown-to-me Test::Harness::Straps. This is the
chunk of Harness that runs the test scripts and analyzes/summarizes
the output ("1..251", "ok 1", etc).
I overrode Straps and swapped out the execution of "perl t/$n.t" with
my own test driver. This allowed me to factor a large chunk of common
code out of a test suite (basically: configure a server, fork a
server, configure a client, run a client, join and cleanup).
The relevant bits:
package MyStraps;
use base 'Test::Harness::Straps';
sub analyze_file {
my $self = shift;
my $case_file = shift;
# run "<driver> <case_file>"
my $cmd = $self->_command_line( $self->driver_cmd ) . " $case_file";
open( my $fh, "$cmd |" ) || die $!;
return $self->analyze_fh( $case_file, $fh );
}
and:
use Test::Harness;
$Test::Harness::Strap = MyStraps->new();
runtests( @cases ); # t/1.t, t/2.t, ...
So this lets you do arbitrary work for each test case. In your
example, you could easily replace the exec of the test command ("perl
t/1.t") with a in-process execution that provides a shared session
(Straps has an analyze() method that takes plain text input), or you
could write a driver script that loads and stores the session before
providing it to an exec'd script (to avoid local pollution).
Normally when you do a "make test", it basically runs runtests(). I
haven't bothered to hack up Makefile.PL to make it use my straps
(because this is an integration test suite that requires external
setup), but it should be possible.
--
Greg Fast
gdf at speakeasy.net
http://cken.chi.groogroo.com/
More information about the Chicago-talk
mailing list