我一直在互联网上搜索实际的工作代码示例,我可以下载或粘贴到我的IDE,像你的典型教程“Hello World”示例源代码,但一个示例演示了单元测试和代码的构建过程覆盖分析。有没有人有一个完整的工作项目的小例子演示这些技术和过程?
(我有一个小的工作示例,我会回答我自己的问题,但可能有其他SO用户有更好的例子,我想出的。
解决方法
从您的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获得的构建目标的完整列表。
希望这个答案有助于某人在那里。不要害羞…请给这个答案添加注释,或者投票向上或向下告诉我答案是否帮助你。如果我在这个答案中的东西搞砸了,请评论,我会尽快更正。