【问题标题】:What is the proper way to test perl modules during development?在开发过程中测试 perl 模块的正确方法是什么?
【发布时间】:2012-01-09 01:26:17
【问题描述】:

我正在开发一个个人 Perl 模块来构建一个基本的脚本框架并帮助我更多地了解该语言。我通过命令行工具modulemaker 使用ExtUtils::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 编辑器中),它会失败并显示:

在 @INC 中找不到 AWSTools/Framework.pm....

如果我尝试在./AWSTOOLS/Framework 目录中运行prove,它也会失败。

问题是:在开发 Perl 模块时运行测试的正确方法是什么?

【问题讨论】:

  • 如果您打算将其上传到CPAN,我建议您查看Dist::Zilla
  • 我不打算将这个发送到 CPAN。我正在做更多的事情来了解该语言,同时为自己构建一个开箱即用的基本帮助脚本。也就是说,我仍然会深入研究 Dist::Zilla,假设至少其中一些仍然适用,不管这个模块只是为我准备的。
  • 进一步的研究还发现了“How can I run Perl test suite automatically when files change?”和对Test::Continuous的引用。它在每次文件更改时运行您的测试。与我最初询问的不同,但我发现它在使用autoprove -l 运行时非常有用。 (我还不知道如何让autoprove -b 工作。)

标签: perl testing module


【解决方案1】:

如果您想运行单个测试文件,您需要告诉perl 在哪里可以找到您的模块,就像您对任何其他程序一样。我使用blib 自动添加正确的路径:

 $ perl Makefile.PL; make; perl -Mblib t/some_test.t

您也可以使用prove 来做同样的事情。我不使用prove,但你可以阅读它的文档来弄清楚。 -b 开关应该可以做到这一点,但我遇到了问题,它没有做正确的事情(可能只是我自己的白痴)。

【讨论】:

  • 您应该声明您需要-b-l 才能使prove 工作。
  • 我还是新手。我花了一点时间才弄清楚,在我第一次运行它之前,我必须运行 perl Makefile.PL
【解决方案2】:

如果您使用的是典型的工具链 (ExtUtils::MakeMaker),它将使用 perl Makefile.PL 生成一个 makefile,然后每次都使用 make test。这些命令应该从模块的根目录运行。见http://search.cpan.org/perldoc?ExtUtils::MakeMaker#make_test

编辑:不要全部手动完成,否则你会讨厌测试。 (嗯,比平时更多。)您还需要至少简要查看一下 Test::Tutorial 和 https://www.socialtext.net/perl5/testing

您可能还想在您首选的 IRC 网络上的 #perl 或相关频道中询问友好*的人。

*实际上并不友好

【讨论】:

    【解决方案3】:

    我实际上认为Dist::Zilla 足够灵活,可以让您在所有开发中使用它。如果您没有上传到CPAN,请确保您的dist.ini 中没有[UploadToCPAN]。还要确保从提供它的任何插件包中 [@Filter] 它。

    Dist::Zilla 对于只安装一个您不会经常接触的快速模块来说可能太多了。如果您有多个正在开发的 dist,那么绝对值得一看。

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

    非 CPAN 分配的最小 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]
    

    测试分布:

    dzil test
    dzil xtest
    

    如果您在以后决定将其上传到 CPAN:

    【讨论】:

      【解决方案4】:

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

      【讨论】:

      • 这肯定会对我以后的一些测试有所帮助,但并没有让我得到我想要开始的测试脚本。
      【解决方案5】:

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

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

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

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

        这让我直接通过逗号在我的编辑器 (TextMate) 中运行脚本。这是基于this page from the Programming Perl book。

      使用 -l 标志来证明似乎非常正确。

      至于“使用 lib”解决方案,我怀疑这实际上是最佳实践。如果是这样,我希望模块制造商一开始就会创建 001_load.t 测试文件。

      【讨论】:

      • 您不想直接从 lib 中进行测试。这是个坏习惯。您也不想将代码添加到测试文件中以查看 blib 以外的任何位置。
      • 正如我所说,不要使用 lib 中的东西进行测试。
      • 啊,对,'-l' 就是这样做的。还在学习这个。你能帮我理解为什么使用 lib 而不是 blib 是一个坏习惯吗?我的搜索只会吸引我认为是噪音的内容。
      猜你喜欢
      • 1970-01-01
      • 2013-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-12
      • 1970-01-01
      相关资源
      最近更新 更多