14

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

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

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

最佳做法是什么?

4

4 回答 4

8

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

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

我没有尝试将这些与 Scalatest 或 Scala 特征和实现一起使用,但应该可以做类似的事情。

于 2010-03-18T11:09:44.120 回答
7

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

it should behave like emptyList

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

于 2010-08-05T01:30:54.730 回答
4

使用 JUnit 4 可以轻松进行合同测试,是 Ben Rady 的视频。

于 2010-03-18T09:53:03.573 回答
0

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

于 2010-08-05T01:47:10.627 回答