我试图针对一个Java类库编写一堆测试代码,并在Scala上使用specs2。
我有一组测试用例,它们应该为类T的所有子类运行,但无法找到实现这一点的最佳方法。
来自Rspec,我自然地寻找类似于*shared_examples_for*宏的东西,就像在Rspec中一样,但是在specs2中似乎没有这样的东西。
然后我想,用测试用例对我自己的Specification子类进行子类划分可能是一种方法。
有什么更好的解决办法吗?
发布于 2012-06-01 23:44:51
您可以在用户指南中找到共享示例的示例。基本上,这使用了这样一个事实:您可以定义一个方法,接受一个特定的实例来测试和声明它的示例(请参阅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),以便为每个示例创建一个全新的实例发布于 2012-06-01 21:10:12
它不是specs2,但是ScalaTest有这样的语法:
测试
https://stackoverflow.com/questions/10847420
复制相似问题