2

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

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

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

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

有没有更整洁的解决方案?

4

2 回答 2

3

您可以在用户指南中找到共享示例的示例。基本上,这使用了这样一个事实,即您可以定义一个采用特定实例的方法来测试和声明它的示例(参见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以避免并发

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

于 2012-06-01T23:44:51.343 回答
0

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

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

于 2012-06-01T21:10:12.737 回答