Perl 如何计划由外部子系统运行的附加测试?

Perl 如何计划由外部子系统运行的附加测试?,perl,testing,test-plan,Perl,Testing,Test Plan,我们已经用Perl为不同的科学数据格式编写了解析器。最近,我为每个格式和子格式添加了一个带有解析器*.t文件的测试套件 当然,解析器的API完全相同,只是从用于测试解析的示例文件中读取的数据不同。为了简化测试文件,我编写了一个子文件,该子文件传递解析器对象和表示预期数据的哈希结构。看起来像 my $parser = new MyApp::Parser($file); test_nested_objects = ($parser, { property1 => "value",

我们已经用Perl为不同的科学数据格式编写了解析器。最近,我为每个格式和子格式添加了一个带有
解析器*.t
文件的测试套件

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

my $parser = new MyApp::Parser($file);
test_nested_objects = ($parser, {
     property1 => "value",
     property2 => 123,
     subobject_accessor => {
         property3 => "foobar",
     }
}
test\u nested\u objects
遍历散列并对散列中定义的所有属性运行测试,例如,如果可以调用
子对象访问器,则返回一个对象,并且该对象可以调用
属性3

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

如何让我的计划意识到子测试?我希望实现以下目标:

  • 为查看进度而运行测试之前给出的测试数
  • 总数自动增加→ 编辑子项时,不得手动更改数字
  • 运行prove时,sub中的单个测试可见(在sub中隐藏测试并仅返回0或1是不可接受的,因为我真的需要知道解析数据的错误)

我希望你能理解。抱歉,说来话长,但我认为如果没有一些背景知识,人们可能无法理解。

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

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

 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;
      ...
      };
您对测试函数的每个调用都是一个测试,并且该函数将使用子测试执行它想执行的任何操作,而不会向其调用方公开太多内容