我正在尝试针对Java类库编写一堆测试代码,我在Scala上使用specs2。
我有一组应该为T类的所有子类运行的测试用例, 但无法找出实现这一目标的最佳方法。
来自Ruby,我自然会像在Rspec中那样寻找类似* shared_examples_for *宏的东西,但在specs2中似乎没有这样的东西。
然后我想,将我自己的 Specification 子类与测试用例子类化可能是一种方法。
对此有什么更整洁的解决方案吗?
答案 0 :(得分:3)
您可以在User Guide中找到共享示例的示例。基本上,这可以使用以下事实:您可以定义一个方法,该方法采用特定实例来测试并为其声明示例(请参阅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)
,以便为每个示例创建一个全新的实例
答案 1 :(得分:0)
这不是specs2,但ScalaTest有这样的语法: