Perl POD覆盖脚本和测试(不是模块)

时间:2012-09-25 14:09:01

标签: perl code-coverage pod

有没有办法衡量脚本的POD覆盖率(例如*.pl)?

我可以使用Pod::CoverageTest::Pod::Coverage衡量软件包的文档范围,但我无法衡量脚本,因为{{1}并且基础Pod::Coverage使用Devel::Symdump来检查包的内容,该内容由于缺少require文件而失败。

有办法解决这个问题吗?

(我必须在.pm文件中包含POD文档,因此将所有内容移动到模块中并将其记录在那里对我来说并不是一个好的解决方案。无论我在哪里,它都已经这样做了。)

2 个答案:

答案 0 :(得分:4)

Pod :: Coverage加载(执行)模块以让它创建subs等。您必须以某种方式阻止.pl正常运行。

#!/usr/bin/perl
...
main(@ARGV) if !$ENV{NO_RUN};
1; # For do()

但是一旦你这样做了,这很简单,因为你告诉Pod :: Coverage要检查哪个包(package)以及要检查的文件(pod_from)。

#!/usr/bin/perl

use strict;
use warnings;

use Test::More tests => 1;

use Pod::Coverage qw( );

{
    package the_script;
    local $ENV{NO_RUN} = 1;
    do "script.pl" or die $@;
}

my $pc = Pod::Coverage->new(
   package  => 'the_script',
   pod_from => 'script.pl',
);

# P::C expects "require the_script;" to succeed.
$INC{"the_script.pm"} = 1;

my $coverage = $pc->coverage();
die $pc->why_unrated()
   if !defined($coverage);

ok($coverage)
   or diag("Not covered: ".join(', ', $pc->naked()));

1;

测试。

答案 1 :(得分:4)

让你的程序成为modulino。那是what ikegami is doing,但他让你设置一个环境变量。

run(@ARGV) unless caller;

一旦您的程序真的是具有某些默认行为的模块,您就可以在其上使用模块工具。