上下文:
假设我有几个模块是相互继承的(对base
和parent
使用老式继承,而不是Moose或类似的模块)。Foo::Bar
继承Foo
,Foo::Bar::Baz
继承Foo::Bar
。所有这些模块都有用Test::More
编写的测试套件。子类的测试套件只测试它实现的方法。子类不一定覆盖其父类中的所有方法,尽管它们可以添加其父类没有的新方法。
问题:
是否有一些测试框架、技术或Test::More
特性可以用来编写测试,这些测试不仅可以测试特定于子类的行为,还可以为任何继承的行为/父类运行测试套件?基本上,我正在寻找一些东西,允许我为子类的独特/特殊行为编写测试,但也会测试并确保子类在测试中的行为与其父类的行为相同。
我尝试过的:
我已经用生成器方法编写了一个非常简单的测试工具,它构建了一个字符串指定模块的实例,并根据请求的模块类型对其运行测试(有一个跟踪子类/超类层次结构的中心哈希),但这似乎很粗糙。我假设(就像我在Perl中需要做的大多数事情一样),其他人已经以一种更优雅、更健壮的方式完成了这项工作。
您要查找的是Test::Class
。
您可以为Foo::Bar
创建一个测试类,我可能会将其称为Test::Foo::Bar
。这个Perl模块将使用Test::Class
作为它的基类。但与其直接测试Foo::Bar
,不如通过一种方法访问它:
sub class {'Foo::Bar'}
这使我们以后可以覆盖它。
然后创建一个新的测试类Test::Foo::Bar::Baz
,它继承自Test::Foo::Bar
。通过这样做,您已经自动继承了为父类编写的所有测试。当然,您需要重写class():
sub class {'Foo::Bar::Baz'}
哇!您现在正在Foo::Bar::Baz
上从Test::Foo::Bar
运行所有测试,您可以随意覆盖或进行新的测试。
Chromatic在他的博客上有一个完整的例子:用Test::Class 重新测试代码
你对已经存在的测试线束是正确的。Test::Class
、Test::Harness
和prove
的混合物应该能满足您的需求,而且几乎没有理由自己编写。