我正在开发一个个人Perl模块来构建一个基本的脚本框架,并帮助我了解有关该语言的更多信息。我通过命令行工具ExtUtils::ModuleMaker使用modulemaker
创建了一个名为“AWSTools :: Framework”的新模块。我正试图找出在开发过程中测试它的适当方法。
创建的目录结构包括以下内容:
./AWSTOOLS/Framework/lib/AWSTools/Framework.pm ./AWSTOOLS/Framework/t/001_load.t
自动生成的001_load.t
文件如下所示:
# -*- perl -*-
# t/001_load.t - check module loading and create testing directory
use Test::More tests => 2;
BEGIN { use_ok( 'AWSTools::Framework' ); }
my $object = AWSTools::Framework->new ();
isa_ok ($object, 'AWSTools::Framework');
如果我尝试直接运行脚本(从命令行或在我的TextMate编辑器中),它将失败并显示:
Can't locate AWSTools/Framework.pm in @INC....
如果我尝试在./AWSTOOLS/Framework
目录中运行prove
,它也会失败。
问题是:在开发Perl模块时运行测试的正确方法是什么?
答案 0 :(得分:5)
如果要运行单个测试文件,则需要告诉perl
在何处查找模块,就像对待任何其他程序一样。我使用blib自动添加正确的路径:
$ perl Makefile.PL; make; perl -Mblib t/some_test.t
您也可以使用prove
执行相同的操作。我不使用prove
,但您可以阅读其文档来弄清楚。 -b
转换应该这样做,但是我遇到了问题,没有做正确的事情(可能只是我自己的白痴)。
答案 1 :(得分:2)
如果您正在使用典型的工具链(ExtUtils :: MakeMaker),那么perl Makefile.PL
将生成一个makefile,然后每次make test
生成一个makefile。这些命令应该从模块的根目录运行。见http://search.cpan.org/perldoc?ExtUtils::MakeMaker#make_test
编辑:并且不要手动完成所有操作,否则您会讨厌测试。 (好吧,比平常更多。)你还想要至少简要地看一下Test :: Tutorial和https://www.socialtext.net/perl5/testing
您可能还想在首选的IRC网络上询问#perl或相关频道中的友好*人。
*实际上并不友好
答案 2 :(得分:1)
我实际上认为Dist::Zilla足够灵活,允许您将其用于所有开发。如果您没有上传到CPAN,请确保dist.ini
中没有[UploadToCPAN]
。另外,请确保[@Filter]
出自提供它的任何插件包。
Dist::Zilla可能只为一个您不会经常触摸的快速模块安装太多。如果您在开发中有多个dist,那么绝对值得一看。
[TestRelease]
)之前确保所有测试文件都通过。[NoTabsTests]
)即可对其进行测试。 dist.ini
name = Your-Library
author = E. Xavier Ample <example@example.org>
license = Perl_5
copyright_holder = E. Xavier Ample <example@example.org>
copyright_year = 2012
version = 0.001
[GatherDir]
[PruneCruft]
[PruneFiles]
filename = dist.ini
filename = TODO.txt
match = ^.*[.]te?mp$
[NoTabsTests]
[TestRelease]
[CheckExtraTests]
[ModuleBuild]
[FakeRelease]
测试dist:
dzil test
dzil xtest
如果以后您决定将其上传到CPAN:
[FakeRelease]
替换为[UploadToCPAN]
。获取暂停ID,并设置~/.pause
。
user YOUR-PAUSE-ID
password YOUR-PAUSE-PASSWORD
dzil release
答案 3 :(得分:0)
为了帮助您,我建议您查看Testing Files and Test Modules。
答案 4 :(得分:-2)
继续深入挖掘和实验,我发现以下两件对我有用的事情:
在'./AWSTOOLS/Framework'目录中使用prove -l
。根据{{3}}页面,当Perl运行“t”目录中的所有测试时,它会将“lib”目录添加到路径中。
要单独/直接运行脚本,我将以下内容添加到use Test::More
行上方脚本的开头:
use FindBin qw($Bin);
use lib "$Bin/../lib";
这让我直接通过commad行和我的编辑器(TextMate)运行脚本。这是基于prove perldoc本书。
使用-l标志来证明看起来非常像正确的事情。
至于“使用lib”解决方案,我怀疑这实际上是一种最佳实践。如果是的话,我希望模块制作者可以用它来创建001_load.t测试文件。