2010-03-18 71 views
12

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

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

  • 实例应该是空的,当且仅当且仅当它具有零大小。
  • 调用清除后,大小应为零。
  • 在列表中间添加一个元素,会将rhs元素的索引加1。

什么是最佳实践?

回答

6

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

it should behave like emptyList

Sharing TestsFlatSpec文档

4

合同测试很容易处理JUnit 4,here的Ben Rady的视频。

+0

太棒了!这项技术是否也适用于Scalatest? – paradigmatic 2010-03-18 10:04:37

+0

对不起,不知道:) – abyx 2010-03-18 10:12:50

+0

我只是试着用scalatest,它似乎工作。谢谢。 – paradigmatic 2010-03-18 10:49:57

8

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

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

我还没有尝试过使用这些Scalatest或Scala特性和实现,但应该可以做类似的事情。

0

对于Scala歌剧院,认真考虑ScalaCheck。所有这些合同都可以在ScalaCheck中作为单行规范表达。运行时,ScalaCheck会随机生成一个可配置数量的采样输入,并检查所有规格是否成立。它是关于创建单元测试可能的语义最密集的方式。

相关问题