我们在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
个文件中。现在,我在泛型函数中添加了一些检查,并且所有计划都是错误的。
如何让我的计划了解子测试?我想实现以下目标:
我希望你能理解。对于长篇故事感到抱歉,但我认为如果没有一些背景知识,人们可能会理解。
答案 0 :(得分: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;
...
};
对测试函数的每次调用都是一次测试,函数会使用子测试来做任何想做的事情,而不会给调用者暴露太多。
答案 1 :(得分:0)
如果已知每种格式的子测试数,则可以在使用Test :: More之前在BEGIN
块中进行测试计算。