在specs2中对测试用例或“shared_examples_for”等效进行分组

时间:2012-06-01 09:05:38

标签: scala testing tdd bdd specs2

我正在尝试针对Java类库编写一堆测试代码,我在Scala上使用specs2。

我有一组应该为T类的所有子类运行的测试用例, 但无法找出实现这一目标的最佳方法。

来自Ruby,我自然会像在Rspec中那样寻找类似* shared_examples_for *宏的东西,但在specs2中似乎没有这样的东西。

然后我想,将我自己的 Specification 子类与测试用例子类化可能是一种方法。

对此有什么更整洁的解决方案吗?

2 个答案:

答案 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以避免并发

  • subclassesexamples更改为def subclasses: Seq[() => T]def examples(t: () => T),以便为每个示例创建一个全新的实例

答案 1 :(得分:0)

这不是specs2,但ScalaTest有这样的语法:

http://www.scalatest.org/user_guide/sharing_tests