我正在尝试针对 Java 类库编写一堆测试代码,并且我在 Scala 上使用 specs2。
我有一组应该为 T 类的所有子类运行的测试用例,但无法找出实现它的最佳方法。
来自 Ruby,我自然而然地在 Rspec 中寻找像 *shared_examples_for* 宏这样的东西,但在 specs2 中似乎没有这样的东西。
然后我想,用测试用例子类化我自己的规范子类可能是一种方法。
有没有更整洁的解决方案?
您可以在用户指南中找到共享示例的示例。基本上,这使用了这样一个事实,即您可以定义一个采用特定实例的方法来测试和声明它的示例(参见nonEmptyStack
方法)。
如果这有助于让我通过一个使用可变的快速示例来启动您Specification
:
import org.specs2._
class SubclassesSpec extends mutable.Specification {
"These examples must pass for all subclasses" >> {
subclasses foreach { subclass => examples(subclass) }
}
/** @return instances of subclasses of type T where T is
* the supertype of the classes you want to test */
def subclasses: Seq[T] = ...
/** @return examples parameterized by a specific instance */
def examples(t: T) = {
"this is the first example" >> {
// use t here
}
"this is the second example" >> {
// use t here
}
}
}
在执行此操作之前,您唯一需要检查的是示例之间可能存在的副作用。在上面的规范中,所有的例子都是并发执行的,它们共享同一个对象。如果这会产生任何问题,您可以:
在规范顶部添加sequential
以避免并发
更改subclasses
和examples
到def subclasses: Seq[() => T]
等,def examples(t: () => T)
以便您将为每个示例创建一个全新的实例
它不是 specs2,但 ScalaTest 有这样的语法: