如何使用Test::More和friends自动测试继承的行为



上下文:

假设我有几个模块是相互继承的(对baseparent使用老式继承,而不是Moose或类似的模块)。Foo::Bar继承FooFoo::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::ClassTest::Harnessprove的混合物应该能满足您的需求,而且几乎没有理由自己编写。

相关内容

  • 没有找到相关文章

最新更新