对同一特征/接口的多个实现进行单元测试

2022-09-04 02:18:43

我主要用 scala 和 java 编程,在 scala 和 junit 中使用 scalatest 进行单元测试。我想将完全相同的测试应用于同一接口/特征的多个实现。这个想法是验证接口契约是否被强制执行,并检查Liskov替换原理。

例如,在测试列表的实现时,测试可能包括:

  • 实例应为空,当且仅当且仅当其大小为零。
  • 调用清除后,大小应为零。
  • 在列表的中间添加一个元素,将 rhs 元素的索引递增一个。
  • 等。

最佳实践是什么?


答案 1

在Java/JUnit中,我通常通过一个抽象的测试用例来处理这个问题,特定测试类的测试从中继承所有测试,并有一个实例化实现的设置方法。我现在无法观看abyx发布的视频,但我怀疑这是一般的想法。

如果您不介意引入另一个测试框架,另一个有趣的可能性是使用JDave Specification类。

我还没有尝试过在Scalatest或Scala特征和实现中使用其中任何一个,但是应该可以做类似的事情。


答案 2

这听起来像是共享测试的工作。共享测试是由不同夹具对象共享的测试。即,相同的测试代码在不同的数据上运行。ScalaTest确实对此表示支持。在您喜欢的样式特征的文档中搜索“共享测试”,该特征将测试表示为函数(Spec,WordSpec,FunSuite,FlatSpec等)。一个例子是FlatSpec的语法:

it should behave like emptyList

请参阅文档中的共享测试FlatSpec


推荐