如何分离不同类型的Perl测试,以便我不必全部运行它们?

时间:2009-11-11 07:18:39

标签: perl unit-testing testing

我注意到在Perl中,自定义是将所有测试都粘贴到 t 目录中。你如何将单元测试与功能测试分开?或者,为了使问题更简单,更明显,如何将快速运行的测试与不快速运行的测试分开?当所有测试一起运行时,测试花费的时间太长而无法在开发中常规使用,这很可惜。

我想我可以设置一些环境变量,如QUICK_TEST,并根据其值跳过长测试。你是否将单元和功能测试分开?怎么样? (这不是一个民意调查 - 我只是想也许有一些惯用的解决方案。)


更新:到目前为止,我已经谈到了这个问题:

package Test::Slow;

use strict;
use Test::More;

BEGIN {
    plan(skip_all => 'Slow test.') if $ENV{QUICK_TEST};
}

1;

在附近的.t文件中:

# This is a slow test not meant
# to run frequently.
use Test::Slow;
use Test::More;

它看起来效果很好。

P.S。现在在CPAN上以Test::Slow显示。

4 个答案:

答案 0 :(得分:10)

运行prove --state=all,save一次,将一些信息添加到.prove

如果您有多核计算机,请运行prove --state=slow -j9,并且您的测试可以同时运行。 这将导致您在开始时开始运行时间最长的测试,以便在完成所有其他测试之前更有可能完成测试。这可以减少完成的总时间,而不会阻止任何测试运行。

答案 1 :(得分:8)

您当然可以将测试划分到t下的子目录中,使用您想要的任何分类方案。如果您使用环境变量,我建议使用默认值(如果未设置变量)运行所有测试。我已经看到t /只包含在开发中常规运行的测试而其他测试放在不同目录下的情况(例如t-selenium /)。

我认为这归结为一致性比你做出的选择更重要;如果你保持一致,几乎任何事情都会奏效。

答案 2 :(得分:3)

通常仅作者测试被放入 xt 目录。它们是手动运行的。因此,如果长时间测试仅限作者,请使用 xt 。通常, t 对于CPAN模块是常见的。对于私人使用,您可以将它们放在任何您喜欢的地方。

答案 3 :(得分:3)

Test::Manifest中,我可以为每个测试文件分配一个级别。仅当测试级别高于该阈值时,才运行测试文件。较低级别是我想要一直运行的东西,下一级是稍慢的东西,依此类推。

然而,我几乎没有使用它。如果我专注于系统的一部分,我只是为该部分运行测试:

 % perl -Mblib t/some_test.t

有些人喜欢使用prove来做同样的事情。

当我需要进行集成测试以查看我的更改是否破坏了其他任何内容时,我最终只运行完整的测试套件。