2

语境:

假设我有一些相互继承的模块(使用老式继承baseand parent,而不是 Moose 或类似的)。Foo::Bar继承FooFoo::Bar::Baz继承Foo::Bar。所有这些模块都有用Test::More. 子类的测试套件只测试它实现的方法。子类不一定会覆盖其父类中的所有方法,尽管它们可能会添加其父类没有的新方法。

问题:

是否有一些测试框架、技术或Test::More功能可以用来编写测试,这些测试不仅可以测试特定于子类的行为,而且还可以为任何继承的行为/父类运行测试套件?基本上,我正在寻找允许我为子类的独特/特殊行为编写测试的东西,但也将测试并确保子类在测试中的行为与其父类预期的行为相同.

我试过的:

我用生成器方法编写了一个非常简单的测试工具,该方法构建字符串指定模块的实例并根据请求的模块类型对其运行测试(有一个中央哈希跟踪子类/超类层次结构) ,但这似乎很粗糙。我假设(就像我需要在 Perl 中做的大多数事情一样),其他人已经以更优雅和更健壮的方式完成了这项工作。

4

1 回答 1

2

您正在寻找的是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'}

瞧!您现在从Test::Foo::Baron开始运行所有测试Foo::Bar::Baz,您可以随意覆盖或进行新的测试。

Chromatic 在他的博客上有一个完整的例子: Resuing Test Code with Test::Class

你对已经存在的测试工具是正确的。Test::ClassTest::Harness和的混合体prove应该满足您的需求,并且几乎没有理由编写您自己的。

于 2013-08-09T14:46:20.560 回答