单元测试几个相同特征/接口的实现

时间:2010-03-18 09:36:03

标签: java unit-testing scala junit scalatest

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

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

  • 实例应为空,当且仅当且且仅当它的大小为零时。
  • 调用clear后,大小应为零。
  • 在列表中间添加元素,将rhs元素的索引加1。

最佳做法是什么?

4 个答案:

答案 0 :(得分:8)

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

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

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

答案 1 :(得分:6)

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

it should behave like emptyList

请参阅FlatSpec文档

中的Sharing Tests

答案 2 :(得分:4)

使用JUnit 4很容易进行合同测试,here是Ben Rady的视频。

答案 3 :(得分:0)

对于Scala,强烈考虑ScalaCheck。所有这些合同都可以表达为ScalaCheck中的单行规范。运行时,ScalaCheck将随机生成可配置数量的样本输入,并检查所有规范是否成立。它是关于创建单元测试的最语义密集方式。