掌握Perl的测试工作马Prove

Prove是Perl自带的一个测试运行工具,它拥有许多选项,对于初学者来说可能会感到困惑。如果你从未使用过Prove或者对其使用不太自信,请不要灰心!本文将帮助你熟悉Prove及其最常用的选项。

基础知识

如果你已经安装了Perl,那么Prove也应该已经安装好了。为了演示Prove的功能,我将使用Git克隆Mojolicious仓库。我喜欢用Mojolicious来演示Prove,因为它有一个庞大的测试套件。在命令行

$ git clone https://github.com/kraih/mojo
$ cd mojo

所以我已经克隆了Mojolicious仓库,并切换到了项目目录。现在,我准备使用Prove运行一些测试了!

$ prove -l t/mojo/asset.t

我使用prove命令执行了Prove。我包含了-l选项,这样Prove就会加载位于lib目录下的Mojolicious代码。如果不这样做,Perl将找不到在t/mojo/asset.t中引用的Mojolicious代码,并引发错误,或者更糟糕的是,它可能会针对我系统上已经安装的Mojolicious的较旧版本运行测试。

有时要包含的代码并不直接位于lib目录中。对于这些情况,Prove提供了-I选项,表示“包含”

prove -I/path/to/lib /path/to/test_file

Prove可以运行单个测试文件,或者如果提供了一个包含多个测试文件的目录,它将运行所有这些文件

$ prove -l t/mojo

这将在t/mojo目录下运行所有测试文件。

使用“r”递归执行测试文件

Mojolicious项目在t目录下的几个不同目录中都有测试文件。找到所有这些目录路径并告诉Prove可能会很繁琐。相反,Prove提供了-r选项来递归搜索测试文件。

$ prove -lr

此选项执行了t目录下的所有测试文件,大约有10,000个测试分布在85个不同的文件中。是不是很方便?请注意,我没有提供t目录作为参数,因为Prove默认会搜索t目录。这真是方便!

使用“j”并行运行测试

运行大量测试文件的能力很有用,但是运行所有测试可能会花费很长时间。在我的机器上,执行Mojolicious测试套件需要32秒。为了加快速度,Prove可以在多个进程中并行运行测试文件,以在多个进程之间共享工作。为此,我只需添加-j选项以及我想要使用的进程数。我有一台四核机器,所以我将使用4个不同的进程

$ prove -lr -j 4

这次,prove在12秒内执行了所有测试。这提高了266%的速度,很不错!

使用“v”选项获取更多详细信息

为了最小化行噪声,默认情况下,Prove提供总结级别的统计信息和低级别的测试失败详细情况。有时查看每个测试的输出很有用。我可以通过添加-v选项来查看这些详细信息,表示“详细”

$ prove -lrv

运行Perl 6测试

Prove可以运行其他语言的测试,只要测试遵循Test Anything Protocol。Perl 6单元测试遵循TAP,所以我们可以使用Prove来运行Perl 6测试!我可以在我的Perl 6模块URI::Encode上演示这一点。为了跟随,只需使用Git克隆仓库

$ git clone https://github.com/dnmfarrell/URI-Encode
$ cd URI-Encode

要使用Prove运行非Perl测试,我们需要传递带有程序名称的--exec选项。这告诉Prove使用哪个程序来执行测试。如下所示

$ prove --exec perl6

请注意,我无需传递要运行的测试文件的文件路径。这只是巧合,按照惯例,Perl6模块的测试通常位于t目录中,通常具有.t扩展名。对于其他语言,你需要指定测试文件路径

$ prove --exec some_program /path/to/testfile

文档

您可以通过使用帮助选项-h来获取Prove接受的选项摘要

$ prove -h

要获取更详细的文档,请使用perldoc

$ perldoc prove

Perldoc是另一个有用的Perl工具,如果您想了解更多关于它的信息,请查看我们的入门文章:《Hello perldoc——生产力助推器》。Prove还有一个man页面条目(如果您在基于Unix/BSD的系统上)。

Prove速查表

prove [options] [filepath]

Options
-------
l       Include the "lib" dir
I       Include a dir: -I/path/to/lib
r       Recursively search and run test files
j       Parallel, specify # procs: -j 4
v       Verbose test output
h       Help, summary of options
exec    Exec tests in another program: --exec perl6


这篇文章最初发布在PerlTricks.com

标签

David Farrell

David是一位专业程序员,他经常在推特博客上分享代码和编程艺术。

浏览他们的文章

反馈

这篇文章有问题吗?请帮助我们通过在GitHub上打开一个issue或pull request来解决。