Perl构建,单元测试,代码覆盖:一个完整​​的工作示例

前端之家收集整理的这篇文章主要介绍了Perl构建,单元测试,代码覆盖:一个完整​​的工作示例前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
大多数Stackoverflow答案,我发现在Perl构建过程和单元测试和代码覆盖只是指向CPAN的文档。指向CPAN模块绝对没有什么错,因为这是完整的文档应该在哪里。我在很多情况下找不到完整的工作代码示例,但是。

我一直在互联网上搜索实际的工作代码示例,我可以下载或粘贴到我的IDE,像你的典型教程“Hello World”示例源代码,但一个示例演示了单元测试和代码的构建过程覆盖分析。有没有人有一个完整的工作项目的小例子演示这些技术和过程?

(我有一个小的工作示例,我会回答我自己的问题,但可能有其他SO用户有更好的例子,我想出的。

解决方法

它花了我一段时间,它也花了我从一些不同的来源小片段,并将它们融合在一起,但我想我有一个小的工作示例,充分地展示了一个Perl新手Perl构建过程,包括单元测试和代码覆盖分析和报告。 (我在Windows XP Pro PC上使用 ActiveState ActivePerl v5.10.0, Module::BuildTest::MoreDevel::Cover)

从您的Perl项目的目录开始,然后在项目目录下创建一个“lib”目录和一个“t”目录:

HelloPerlBuildWorld
        |
        |----------> lib
        |
        |----------> t

在“lib”目录中,创建一个名为“HelloPerlBuildWorld.pm”的文本文件。这个文件是你将要构建和测试的Perl模块。将以下内容粘贴到此文件中:

use strict;
use warnings;
package HelloPerlBuildWorld;

$HelloPerlBuildWorld::VERSION = '0.1';

sub hello {
   return "Hello,Perl Build World!";
}

sub bye {
   return "Goodbye,cruel world!";
}

sub repeat {
   return 1;
}

sub argumentTest {
    my ($booleanArg) = @_;

    if (!defined($booleanArg)) {
        return "null";
    }
    elsif ($booleanArg eq "false") {
        return "false";
    }
    elsif ($booleanArg eq "true") {
        return "true";
    }
    else {
        return "unknown";
    }

   return "Unreachable code: cannot be covered";
}

1;

在“t”目录中,创建一个名为“HelloPerlBuildWorld.t”的文本文件。此文件是您的单元测试脚本,将尝试完全测试上面的Perl模块。将以下内容粘贴到此文件中:

use strict;
use warnings;
use Test::More qw(no_plan);

# Verify module can be included via "use" pragma
BEGIN { use_ok('HelloPerlBuildWorld') };

# Verify module can be included via "require" pragma
require_ok( 'HelloPerlBuildWorld' );

# Test hello() routine using a regular expression
my $helloCall = HelloPerlBuildWorld::hello();
like($helloCall,qr/Hello,.*World/,"hello() RE test");

# Test hello_message() routine using a got/expected routine
is($helloCall,"Hello,Perl Build World!","hello() IS test");

# Do not test bye() routine

# Test repeat() routine using a got/expected routine
for (my $ctr=1; $ctr<=10; $ctr++) {
    my $repeatCall = HelloPerlBuildWorld::repeat();
    is($repeatCall,1,"repeat() IS test");
}

# Test argumentTest() 
my $argumentTestCall1 = HelloPerlBuildWorld::argumentTest();
is($argumentTestCall1,"null","argumentTest() IS null test");

# Test argumentTest("true") 
my $argumentTestCall2 = HelloPerlBuildWorld::argumentTest("true");
is($argumentTestCall2,"true","argumentTest() IS true test");

# Test argumentTest("false") 
my $argumentTestCall3 = HelloPerlBuildWorld::argumentTest("false");
is($argumentTestCall3,"false","argumentTest() IS false test");

# Test argumentTest(123) 
my $argumentTestCall4 = HelloPerlBuildWorld::argumentTest(123);
is($argumentTestCall4,"unknown","argumentTest() IS unknown test");

现在备份在您的顶级项目目录中,创建一个名为“Build.PL”的文本文件。此文件将创建您将在以后使用的构建脚本。将以下内容粘贴到此文件中:

use strict;
use warnings;
use Module::Build;

my $builder = Module::Build->new(
    module_name         => 'HelloPerlBuildWorld',license             => 'perl',dist_abstract       => 'HelloPerlBuildWorld short description',dist_author         => 'Author Name <email_addy@goes.here>',build_requires => {
        'Test::More' => '0.10',},);

$builder->create_build_script();

这就是你需要的所有文件。现在,从顶级项目目录中的命令行,键入以下命令:

perl Build.PL

您将看到类似于以下内容内容

Checking prerequisites...
Looks good

Creating new 'Build' script for 'HelloPerlBuildWorld' version '0.1'

现在你应该能够使用以下命令运行单元测试:

Build test

并看到类似这样的东西:

Copying lib\HelloPerlBuildWorld.pm -> blib\lib\HelloPerlBuildWorld.pm
t\HelloPerlBuildWorld....ok
All tests successful.
Files=1,Tests=18,0 wallclock secs ( 0.00 cusr +  0.00 csys =  0.00 cpu)

要使用代码覆盖率分析运行单元测试,请尝试:

Build testcover

你会看到这样的顺序:

t\HelloPerlBuildWorld....ok
All tests successful.
Files=1,12 wallclock secs ( 0.00 cusr +  0.00 csys =  0.00 cpu)
cover
Reading database from D:/Documents and Settings/LeuchKW/workspace/HelloPerlBuildWorld/cover_db


----------------------------------- ------ ------ ------ ------ ------ ------
File                                  stmt   bran   cond    sub   time  total
----------------------------------- ------ ------ ------ ------ ------ ------
D:/Perl/lib/ActivePerl/Config.pm       0.0    0.0    0.0    0.0    n/a    0.0
D:/Perl/lib/ActiveState/Path.pm        0.0    0.0    0.0    0.0    n/a    0.0
D:/Perl/lib/AutoLoader.pm              0.0    0.0    0.0    0.0    n/a    0.0
D:/Perl/lib/B.pm                      18.6   16.7   13.3   19.2   96.4   17.6
 ...
[SNIP]
 ...
D:/Perl/lib/re.pm                      0.0    0.0    0.0    0.0    n/a    0.0
D:/Perl/lib/strict.pm                 84.6   50.0   50.0  100.0    0.0   73.1
D:/Perl/lib/vars.pm                   44.4   36.4    0.0  100.0    0.0   36.2
D:/Perl/lib/warnings.pm               15.3   12.1    0.0   11.1    0.0   12.0
D:/Perl/lib/warnings/register.pm       0.0    0.0    n/a    0.0    n/a    0.0
blib/lib/HelloPerlBuildWorld.pm       87.5  100.0    n/a   83.3    0.0   89.3
Total                                  9.9    4.6    2.8   11.3  100.0    7.6
----------------------------------- ------ ------ ------ ------ ------ ------


Writing HTML output to D:/Documents and Settings/LeuchKW/workspace/HelloPerlBuildWorld/cover_db/coverage.html ...
done.

(有人请告诉我如何配置Cover忽略所有的Perl库,只是报告我在我写的单个文件,我无法得到Cover过滤工作根据CPAN文档!)

现在,如果刷新您的顶级目录,您可以看到一个名为“cover_db”的新子目录。进入该目录,双击“coverage.html”文件,在您喜爱的网络浏览器中打开代码覆盖报告。它给你一个漂亮的颜色编码的超文本报告,你可以点击你的文件名,看到详细的语句,分支,条件,子程序覆盖率统计的Perl模块在实际源代码旁边的报告。你可以在这个报告中看到,我们没有覆盖“bye()”例程,还有一行代码是不可达的,没有涵盖我们的预期。

你可以做一些事情来帮助你在你的IDE中自动化这个过程是做一些更多的“Build.PL”类型的文件,显式地执行我们手动从命令行执行的一些构建目标。例如,我使用具有以下内容的“BuildTest.PL”文件

use strict;
use warnings;
use Module::Build;

my $build = Module::Build->resume (
  properties => {
    config_dir => '_build',);

$build->dispatch('build');
$build->dispatch('test');

然后我设置我的IDE来执行这个文件(通过“perl BuiltTest.PL”),只需单击鼠标,它会自动运行我的单元测试代码从IDE,而不是我手动从命令行。用“dispatch(‘testcover’)”替换“dispatch(‘test’)”以实现自动代码覆盖执行。键入“构建帮助”以获取可从Module :: Build获得的构建目标的完整列表。

希望这个答案有助于某人在那里。不要害羞…请给这个答案添加注释,或者投票向上或向下告诉我答案是否帮助你。如果我在这个答案中的东西搞砸了,请评论,我会尽快更正。

原文链接:https://www.f2er.com/Perl/173560.html

猜你在找的Perl相关文章