On Fri, Jul 09, 2004 at 12:10:52PM -0500, Pete Krawczyk wrote:
> Consider the following code:
> 
>     $impclass ||= implementor($scheme) ||
>         do {
>             require URI::_foreign;
>             $impclass = 'URI::_foreign';
>         };
> 
> That's in URI.pm, lines 54-58.
> 
> Devel::Cover treats that as a conditional.  So short of deleting
> URI::_foreign, that do BLOCK is never going to return false.

There's a whole set of these sort of problems.  

    sub new {
        my $proto = shift;
        my $class = ref $proto || $proto;

Devel::Cover wants you to consider the case where both ref $proto and $proto
are false.  This is an (almost) impossible condition and certainly not an
interesting one to bother testing.

Then there are conditions that can't both occur in a single environment.

        if( $^O eq 'MSWin32' ) {
                do this;
        }
        else {
                do that;
        }

Unless you start combining the coverage runs from all hopolites.  Which
might not be a bad thing.  It certainly would help things like Class::DBI
which looks like it has piss poor coverage because it has so many optional
modules for testing.


Don't be mesmerized by 100% coverage.  Devel::Cover isn't perfect and even
if it was there are uncoverable things.  Even if you were to achieve 100%
coverage that doesn't guarantee anything.  Coverage doesn't say anything
about the data being tested against, things going funny because the 
environment changed, or an external utility (database).

Test coverage is a useful *heuristic* for test effectiveness.  Like all
heuristics if you push it too far it falls apart.  Get as close to 100% as
is useful and don't worry about the rest.


-- 
Michael G Schwern        [EMAIL PROTECTED]  http://www.pobox.com/~schwern/
11. Every old idea will be proposed again with a different name and
    a different presentation, regardless of whether it works.
     -- RFC 1925

Reply via email to