Dumper the lexical variables after failed test case(Just Idea)

Hi,

I got an another hacking idea for perl testing.

Hook the Test::Builder::ok using PadWalker. Dump the lexical vars in testing context.

package Test::Power {
    no warnings 'redefine';
    use Test::Builder ();
    use PadWalker ();
    use Data::Dump::Streamer;
    use Data::Dumper;
    my $orig_ok = \&Test::Builder::ok;
    *Test::Builder::ok = sub {
        # my ($self, $test, $msg) = @_;
        {
            local $Test::Builder::Level = $Test::Builder::Level + 1;
            $orig_ok->(@_);
        }
        unless ($_[1]) {
            my ($pkg, $filename, $lineno) = caller($Test::Builder::Level);
            if (defined $pkg) {
                my $lexicals = PadWalker::peek_my($Test::Builder::Level+1);
                local $Data::Dumper::Terse = 1;
                local $Data::Dumper::Indent = 1;
                local $Data::Dumper::Maxdepth = 3;
                $_[0]->diag(Dumper($lexicals));
            } else {
                # users testing env is broken.
            }
        }
    };
}

Example testee code.

package Square {
    use Moose;
    has x => (is => 'rw');
    has y => (is => 'rw');
    sub area {
        my ($self) = @_;
        return $self->x * $self->y;
    }
}

Example test code

package main {
    use Test::More;

    my $sq = Square->new(x => 4, y => 5);
    is($sq->area, 24);

    done_testing;
}

Then, you get a dumped lexical vars automatically. It may be useful for debugging(I hope).

not ok 1
#   Failed test at hoge.pl line 51.
# {
#   '$sq' => \bless( {
#       'y' => 5,
#       'x' => 4
#     }, 'Square' )
# }
#          got: '20'
#     expected: '24'
1..1
# Looks like you failed 1 test of 1.

It's just idea. What do you think?

Thanks.

Published: 2012-10-23(Tue) 22:14