8

我们在 Perl 中为不同的科学数据格式编写了解析器。最近我添加了一个测试套件,其中parser_*.t包含每种格式和子格式的文件。

当然,解析器的 API 完全相同,只是从用于测试解析的示例文件中读取的数据不同。为了简化测试文件,我编写了一个 sub 来传递解析器对象和一个表示预期数据的哈希结构。看起来像

my $parser = new MyApp::Parser($file);
test_nested_objects = ($parser, {
     property1 => "value",
     property2 => 123,
     subobject_accessor => {
         property3 => "foobar",
     }
}

test_nested_objects遍历散列并为散列中定义的所有属性运行测试,例如,如果subobject_accessor可以调用,则返回一个对象并且该对象可以被调用property3

我检查了整个文件运行了多少测试*.t并添加tests => 123到所有*.t文件中。现在,我对通用函数添加了一些检查,所有计划都是错误的。

如何让我的计划了解子测试?我想实现以下目标:

  • 在运行它们之前给出的测试数量以查看进度
  • 总数自动增加→编辑子时无需手动更改数字
  • 运行证明时 sub 中的单个测试可见(在 sub 中隐藏测试并仅返回 0 或 1 是不可接受的,因为我真的需要知道解析的数据有什么问题)

我希望你能够明白。很抱歉这个长篇大论,但我认为如果没有一些背景知识,人们可能不会理解。

4

2 回答 2

11

测试计划的最新趋势就是不去做。在测试文件的末尾,您声明您已到达末尾:

 done_testing();

测试计划的许多用途只是为了确保测试脚本完成。如果它看到了正确数量的测试,那么脚本一定已经完成了。这不是真的,但它是一个方便且可行的小说。

如果您必须进行一些计算以确定测试的数量,例如测量数据结构的大小,请plan稍后再调用:

 use Test::More;  # don't declare the plan yet

 my $test_count = ...;

 plan tests => $test_count; 

但是,您可以将测试划分为子测试,而不是制定大计划。每个子测试只需要知道它运行了多少测试,脚本只需要知道子测试的数量:

 subtest some_label => sub {
      plan tests => $n;
      ...
      };

您对测试函数的每次调用都是一个测试,并且该函数将使用子测试来做它想做的任何事情,而不会向调用者暴露太多。

于 2011-11-02T12:53:12.653 回答
0

如果每种格式的子测试数量已知,您可以在BEGIN使用 Test::More 之前在一个块中进行测试计算。

于 2011-11-02T12:34:50.520 回答