2009-01-22 148 views
20

我写了一个小的Perl脚本,现在我想为它创建一个测试套件。我认为能将use脚本作为一个模块,导入脚本中定义的潜艇并对其进行测试会很好。有没有办法让脚本既是独立的Perl脚本又是Perl模块? (我不想剧本拆分成独立的模块和“可执行”,因为我打算分发脚本为单个文件。)如何测试独立的Perl脚本?

还是有更好的方法来测试脚本?

回答

29

由于布赖恩似乎是睡着了,现在,这里是一个指针,他所谓modulinos。这基本上是构建可以像脚本一样运行的模块或模块的脚本的配方。听起来完全像你正在寻找的东西。

Mastering Perl绝对是一本值得一读的(和购买)。

+0

谢谢,这正是我一直在寻找的。 – zoul 2009-01-22 12:46:20

1

为什么不写一个测试套件在一个shell脚本,与被称为像任何其他shell命令的Perl脚本?

+0

是的,这当然是一个选项,但直接使用subs对我来说似乎更方便。 – zoul 2009-01-22 11:29:17

6

(我不想剧本拆分成独立的模块和“可执行”,因为我打算分发脚本为单个文件。)

大多数人缝合在一起文件如这在构建时。 CPAN上的App :: Ack是一个可以像这样构建的东西的例子。

如果你真的想测试你的应用程序正确,你需要把功能模块中,然后写一个测试::基于更多测试脚本,行使该模块提供的功能。然后实际的脚本只是一个瘦包装模块周围,通常是这样的:

#!/usr/bin/env perl 
use Your::Class; 
Your::Class->new(args => \@ARGV)->run; 

参见:MooseX::Getopt

2

这取决于你是否想测试脚本本身,或测试弥补了剧本的潜艇。如果你想测试脚本,那么外部测试会更合适,例如,一个shell脚本。如果要测试组成该脚本的函数,则可以将这些测试作为更多函数写入脚本中,或者将这些元素重构为Perl模块并测试模块(您称之为不想执行的模块) 。

如果脚本足够小,则重构可能不是必需的。只需添加一个'-test'命令行参数并调用一个测试子,然后再测试其他一切。如果这样做,我喜欢打印某种进度指示器(例如,每次通过测试的'。')。

但是,如果脚本比较复杂,您可能需要考虑将位重构为一个或多个模块,并使用Test::SimpleTest::More进行测试。

3

我想要做同样的事情。有没有理由不这样做? (我不是perl的专家,虽然这个解决方案似乎对我很好。):

在脚本的开始处我要求一个开关(“-test”)或任何东西,然后转到子是这样的:

my $myargs = CmdLineOptions->new(args=>\@ARGV); 
if ($myargs->was_given(option=>"-test")) { &tests; } 

sub tests { 
    require "Test/More.pm"; 
    Test::More->import('no_plan'); 

    is(1,1,"my tests go here"); 
    exit; 
} 

(使用要求和进口我消息打压使用时,我得到“使用测试::更多”没有做任何测试“#没有运行测试!”。我想这也减少了开销。)