http://www.perlmonks.org?node_id=1072954


in reply to Looking for help for unit tests and code coverage on an existing perl script

I would extract a module from your script and unit test the module directly via Test::More and the prove command. I like to keep my script mainlines as short as is practicable, with all the heavy lifting done in (unit-tested) module/s. There are many examples of this general approach on the CPAN; see, for example, the perltidy command, part of the Perl-Tidy distribution and the perlcritic command, part of the Perl-Critic distribution.

As an alternative, and perhaps a bit less work, you could re-structure your script as a "modulino", that is, a script that can masquerade as a module for ease of testing. This approach is described at:

... though modulinos are too sneaky/clever for my tastes ("scripts should use modules, not pretend to be modules").

References Added Later

PM Nodes:

Updated: Many extra references were added long after the original reply was made.

  • Comment on Re: Looking for help for unit tests and code coverage on an existing perl script (modulino References)
  • Select or Download Code

Replies are listed 'Best First'.
Re^2: Looking for help for unit tests and code coverage on an existing perl script
by tizatron (Novice) on Feb 03, 2014 at 23:22 UTC

    Good links there. Appreciate it.

    In this theme, I went ahead and tried to setup an env similar to the layout described in this link:

    StackOverFlow Complete build/unittest/codecoverage

    couple of things that I did:

    • Created the layout described. Made directories for 'lib' and 't'.
    • Copied my script to lib. Flipped the extension to pm. Added a package statement to the script. Also added: __PACKAGE__->main( @ARGV ) unless caller();
    • Wrapped the main block of code, what I called the implied main, in sub main{...}

    Then I was able to add a stanza to my test file.

    my $my_dev_1 = sample::main("my-dev-1"); is($my_dev_1, "--- classes: - all - dev ", "my dev 1 test");

    Not sure how I feel about the sample::main("my-dev-1"). Would appreciate some feedback on that to see if I am calling this correctly.

    That said, I was able to generate code cover from this setup.

    $ ./Build test
    $ ./Build testcover
    

    ---------------------------- ------ ------ ------ ------ ------ ------ ------
    File                           stmt   bran   cond    sub    pod   time  total
    ---------------------------- ------ ------ ------ ------ ------ ------ ------
    blib/lib/sample.pm             97.4   91.7    n/a  100.0    0.0  100.0   93.2
    Total                          97.4   91.7    n/a  100.0    0.0  100.0   93.2
    ---------------------------- ------ ------ ------ ------ ------ ------ ------
    

    That processes pumps out a cover.html file that kinda aligns more with what I was hoping to see. The changes to the original code are not significant, but they are changes, more than what I was hoping to make, perhaps digging in harder on Test::Output would help.