Perl是否只对模块进行单元测试,而不是程序?

时间:2012-02-03 19:31:01

标签: perl testing

我在'net和我所拥有的书 Perl Testing 周围找到的文档,或者说或建议Perl的单元测试通常在创建模块时完成。

这是真的吗?有没有办法使用Test::More和堂兄弟对实际程序进行单元测试?

2 个答案:

答案 0 :(得分:11)

当然,您可以使用Test::More测试脚本。这更难,因为大多数脚本需要作为一个单独的进程运行,从中捕获输出,然后根据预期的输出进行测试。

这就是 modulinos (参见第17章:brian d foyMastering Perl,第二版,O'Reilly,2014)的原因。 modulino是一个也可以用作模块的脚本。这样可以更容易测试,因为您可以将modulino加载到测试脚本中,然后像常规模块一样测试其功能。

modulino的关键特征是:

#! /usr/bin/perl
package App::MyName; # put it in a package

run() unless caller; # Run program unless loaded as a module

sub run {
  ... # your program here
}

该功能不必称为run;如果你是C程序员,可以使用main。您通常还需要run根据需要调用的其他子例程。

然后,您的测试脚本可以使用require "path/to/script"加载您的modulino并运用其功能。由于许多脚本涉及编写输出,并且通常更容易打印而不是执行print sub_that_returns_big_string(),因此您可能会发现Test::Output有用。

答案 1 :(得分:0)

这不是测试代码的最简单方法,但您可以直接测试脚本。您可以使用system(或更好IPC::Run3)运行包含特定参数的脚本,捕获输出并将其与预期结果进行比较。

但这将是一个顶级测试。很难说出代码的哪一部分会导致问题。 单元测试用于测试单个模块。这样可以更轻松地查看问题的来源。另外,单独测试函数要容易得多,因为您只需要考虑在较小的代码片段中会发生什么。 测试方式取决于您的项目规模。您可以将所有内容放入单个文件中,但将代码放入模块(甚至将其拆分为不同的模块)将在未来为您带来好处:代码可以更容易地重用和测试。