# foo.t use strict; use warnings; use Test::More; # don't put a plan here use t::Helper qw/multi_test/; # i.e. t/Helper.pm my @cases = ( { label => "describe this case", input => "data to operate on", output => "expected result", }, # ... repeat as needed ... ); # set plan after populating @cases my $tests_per_case = 2; plan tests => 1 + $tests_per_case * @cases; # start testing here require_ok( "Some::Object" ); for my $case ( @cases ) { my $obj = Some::Object->new; multi_test( $obj, $case ); } #### # t/Helper.pm use strict; use warnings; use base 'Exporter'; our @EXPORT = qw/multi_test/; sub multi_test { my ($obj, $case) = @_; local $Test::Builder::Level = $Test::Builder::Level + 1; is( $obj->wibble( $case->{input} ), $case->{output}, "wibble: $case->{label}" ); ok( $obj->wobble, "wobble: $case->{label} ); } 1;