4

我有一堆 perl 测试:

  1. 功能测试
  2. 机械化测试
  3. 实际单元测试,断言函数和返回值等
  4. 涉及外部服务的测试,例如 WebServices
  5. 以数据库为中心的测试
  6. REST 测试

我通过证明运行所有这些,理论上将它们重新排列到各种目录中并运行类似的东西find t/ -name '*.t' ! -name '*timeout*' | xargs prove -l,但是很难(而且不是很好的工程)以特定的方式命名测试,所以我们可以通过find.

prove当我们通过命令行运行它时,有没有办法可以将测试的通配符列表传递给它?
如果没有,是否有比我们目前使用的更理智的方法?

4

2 回答 2

4

通常的方法是通过环境变量。测试文件检查它是否应该运行,如果不是,则执行快速skip_all.

例如:

use strict;
use warnings;
use Test::More;

BEGIN {
   plan skip_all => "not running extended tests" unless $ENV{EXTENDED_TESTING};
};

# your slow tests here

done_testing();

现在通常会跳过该测试。但是,如果您将EXTENDED_TESTING环境变量设置为"1",它将运行。

标准环境变量包括EXTENDED_TESTINGRELEASE_TESTINGNONINTERACTIVE_TESTING. NO_NETWORK_TESTING也在流行。

有各种模块可以自动执行此操作,例如Test::Is它允许更简单的语法:

use strict;
use warnings;
use Test::More;
use Test::Is "extended";

# your slow tests here

done_testing();

如果您有其他一些特定于应用程序的类别,则必须自己发明一些环境变量。如果您认为它们看起来普遍有用,请在博客中介绍它们,也许它们也会流行起来并成为标准环境变量。

于 2014-09-03T00:22:55.747 回答
1

我想我找到了答案Test::Less

Test::Less - 测试分类和子集执行

test-less 通常将标签和测试文件之间映射的索引文件保存在一个名为 t/Test-Less/index.txt 的文件中。您可以使用 --file 选项或 TEST_LESS_INDEX 环境变量覆盖它。

Tags are strings matching /^[\w\-]+$/.

-list 和 -prove 命令采用所谓的标记规范。

规范是标签列表和可能的文件名。

无测试证明 foo bar baz

运行所有 foo 测试、bar 测试和 baz 测试。

    test-less -prove foo,bar,baz

即使在我能够修复 Test::Less 中的编译错误之后,我仍然无法使用自 2009 年以来已被破坏的 Test::Less 运行任何测试。所以查看 Test::Class 可能是答案:

http://search.cpan.org/~ether/Test-Class-0.46/lib/Test/Class.pm

有时您只想运行一个测试。注释掉其他测试或编写代码以跳过它们可能很麻烦,因此您可以指定 TEST_METHOD 环境变量。该值应为有效的正则表达式,如果存在,则仅运行名称与正则表达式匹配的测试方法。启动、设置、拆卸和关机测试仍将运行。

一种简单的方法是在调用 runtests 方法之前指定环境变量。

Running a test named customer_profile:



#! /usr/bin/perl
 use Example::Test;

 $ENV{TEST_METHOD} = 'customer_profile';
 Test::Class->runtests;

    Running all tests with customer in their name:

     #! /usr/bin/perl
     use Example::Test;

     $ENV{TEST_METHOD} = '.*customer.*';
     Test::Class->runtests;
于 2014-09-03T00:54:36.963 回答