How to use Devel::Cover

Quick introduction and usage of Devel::Cover to get code coverage metrics for Perl

It’s time to deploy another version of my CPAN module. I have 57 files and 698 tests: the question is

Are my tests good enough? Did they cover all possible cases?

Mmh, it’s a difficult question, the answer depends on a lot of things … here comes Devel::Cover to the rescue. So we have this magic module that gives us some statistics to evaluate where are the gaps in our tests. Yes, I know, it is still a difficult question, but at least Devel::Cover gives us some answers, for sure it is a good starting point.

Consider I am on Windows, so I have set instead of export and dmake instead of make. My working folder, is C:\SVN_ROOT\PNI.

If it is not the first time you run it, launch a

C:\SVN_ROOT\PNI>cover -delete
Deleting database C:\SVN_ROOT\PNI\cover_db

Just set the environment variable HARNESS_PERL_SWITCHES=-MDevel::Cover and run your tests. For example

C:\SVN_ROOT\PNI>set HARNESS_PERL_SWITCHES=-MDevel::Cover
C:\SVN_ROOT\PNI>prove -l

Here it is the cool part!

C:\SVN_ROOT\PNI>cover
Reading database from C:\SVN_ROOT\PNI\cover_db
...

Writing HTML output to C:\SVN_ROOT\PNI\cover_db/coverage.html ...
done.

This will produce a coverage.html file in the cover_db/ directory.

Noooooo, my _node-perlfunc-int.t has a red entry with a 50% … mmh maybe because the test file is almost empty, it just checks default values.

int50

If I click on that ugly 50.0, I can see this.

int detail

I’m going to add some tests, checking some results and for example passing wrong parameters. This is the result:

C:\SVN_ROOT\PNI>prove -l t\_node-perlfunc-int.t
t\_node-perlfunc-int.t .. 1/? Devel::Cover: Deleting old coverage for changed file t/_node-perlfunc-int.t
t\_node-perlfunc-int.t .. ok
All tests successful.
Files=1, Tests=9,  2 wallclock secs ( 0.06 usr +  0.01 sys =  0.08 CPU)
Result: PASS

et voilà

int ok

Conclusion

Devel::Cover is a really powerful tool … just use it!

References