在开发过程中测试perl模块的正确方法是什么?

时间:2012-01-09 01:26:18

标签: perl testing module

我正在开发一个个人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模块时运行测试的正确方法是什么?

5 个答案:

答案 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,那么绝对值得一看。

  • 您可以使用插件轻松地将其与VCS连接。 (包括Git
  • 您可以创建一个插件以部署到您的服务器上。这将允许您在允许部署([TestRelease])之前确保所有测试文件都通过。
  • 如果您不喜欢源文件中的选项卡,则无需自己编写测试([NoTabsTests])即可对其进行测试。

非CPAN dist

的最小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:

答案 3 :(得分:0)

为了帮助您,我建议您查看Testing Files and Test Modules

答案 4 :(得分:-2)

继续深入挖掘和实验,我发现以下两件对我有用的事情:

  1. 在'./AWSTOOLS/Framework'目录中使用prove -l。根据{{​​3}}页面,当Perl运行“t”目录中的所有测试时,它会将“lib”目录添加到路径中。

  2. 要单独/直接运行脚本,我将以下内容添加到use Test::More行上方脚本的开头:

     use FindBin qw($Bin);
     use lib "$Bin/../lib";
    

    这让我直接通过commad行和我的编辑器(TextMate)运行脚本。这是基于prove perldoc本书。

  3. 使用-l标志来证明看起来非常像正确的事情。

    至于“使用lib”解决方案,我怀疑这实际上是一种最佳实践。如果是的话,我希望模块制作者可以用它来创建001_load.t测试文件。