Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Devel::Cover Fails to Report Coverage on Tested Statement

4 views
Skip to first unread message

James E Keenan

unread,
Jul 24, 2006, 7:33:10 AM7/24/06
to per...@perl.org
I have encountered an anomaly in my use of Devel::Cover.

Suppose that I have two packages, Alpha and Beta, each of which
implements a sayhowdy() method, albeit slightly differently from each other.

# in Alpha.pm

sub sayhowdy {
my $self = shift;
my $string = q{};
open my $fh, ">", \$string;
print $fh "Howdy, alpha\n";
close $fh;
return $string;
}

# in Beta.pm

sub sayhowdy {
my $self = shift;
my $string = q{};
open my $fh, ">", \$string;
print $fh "Howdy, beta\n";
close $fh;
return $string;
}

(You can play along at home by downloading this tarball:
http://thenceforward.net/perl/misc/Alpha-0.01.tar.gz.)

The only other non-trivial difference between the two packages is that
the final statement in Beta.pm assigns Beta::sayhowdy() to
Alpha::sayhowdy() should Alpha::sayhowdy() somehow be (or get) undefined.

*Alpha::sayhowdy = \&sayhowdy if ! defined &Alpha::sayhowdy;

I can write the following test file to demonstrate that this
reassignment can actually be made:

use Test::More qw( no_plan);

use_ok( q{Alpha} );

my $class = q{Alpha};
my $self = $class->new();

isa_ok($self, $class);
can_ok($class, q{sayhowdy} );

is($self->sayhowdy(), qq{Howdy, alpha\n},
"alpha sayhowdy okay");

undef &Alpha::sayhowdy;
eval { $self->sayhowdy(); };
like($@, qr/^Undefined subroutine &Alpha::sayhowdy called/,
"Alpha::sayhowdy() is now undefined");


require_ok('Beta');
is($self->sayhowdy(), qq{Howdy, beta\n},
"Beta::sayhowdy is now Alpha::sayhowdy");

... which produces:

[Alpha] 539 $ prove -vb t/03_gamma.t
t/03_gamma....ok 1 - use Alpha;
ok 2 - The object isa Alpha
ok 3 - Alpha->can('sayhowdy')
ok 4 - alpha sayhowdy okay
ok 5 - Alpha::sayhowdy() is now undefined
ok 6 - require Beta;
ok 7 - Beta::sayhowdy is now Alpha::sayhowdy
1..7
ok
All tests successful.
Files=1, Tests=7, 0 wallclock secs

So far, so good. But when I run Devel::Cover on this distribution, the
coverage report treats the glob assignment line above as if it weren't
even there.

$ cover -delete
$ make test HARNESS_PERL_SWITCHES=1
$ cover cover_db --report=txt > coverage.txt

# in the section of coverage.txt reporting on lib/Beta.pm:
# (for simplicity, displaying only statement coverage)

blib/lib/Beta.pm

line err stmt code
1 package Beta;
2 #$Id#
3 2 use strict;

# [snip]

16 2 print $fh "Howdy, beta\n";
17 2 close $fh;
18 2 return $string;
19 }
20
21 *Alpha::sayhowdy = \&sayhowdy
if ! defined &Alpha::sayhowdy;
22
23 1;

The test file above clearly exercises line 21, but Devel::Cover reports
nothing at all about that line. Has anyone encountered/can anyone
explain this?

Thanks in advance.

Jim Keenan

0 new messages