#! /usr/bin/perl -T use strict; use warnings; my @ORDER = qw ( start1 start2 setup1 setup2 test1 tear1 tear2 setup1 setup2 test2 tear1 tear2 end1 end2 ); package Foo::Test; use base qw(Test::Class); use Test::More; sub trace_ok { my $caller = (caller(1))[3]; $caller =~ s/^.*://s; my $expected = shift @ORDER; is($caller, $expected, "called $expected"); }; sub start1 : Test(startup=>1) { trace_ok() }; sub start2 : Test(startup=>1) { trace_ok() }; sub setup1 : Test(setup=>1) { trace_ok() }; sub setup2 : Test(setup=>1) { trace_ok() }; sub test1 : Test(1) { trace_ok() }; sub test2 : Test(1) { trace_ok() }; sub tear1 : Test(teardown=>1) { trace_ok() }; sub tear2 : Test(teardown=>1) { trace_ok() }; sub end1 : Test(shutdown=>1) { trace_ok() }; sub end2 : Test(shutdown=>1) { trace_ok() }; package main; use Test::More; Foo::Test->runtests(+1); ok(@ORDER==0, 'all expected methods ran');