【问题标题】:Grouping test cases or "shared_examples_for" equivalent in specs2在 specs2 中分组测试用例或“shared_examples_for”等价物
【发布时间】:2012-06-04 11:19:37
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: scala testing tdd bdd specs2


    【解决方案1】:

    您可以在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),以便为每个示例创建一个全新的实例

    【讨论】:

    • 我在这里看不到 examples 上的名字传递的意义。您在哪里尝试了您稍后提到的副作用防护,但后来退出并忘记删除它?
    • 这对我不起作用。 examples 的返回类型应该是Fragment 吗?我得到:错误:(40, 13) 找不到 org.specs2.main.CommandLineAsResult[Unit] "#status" >> { 类型的证据参数的隐式值
    • 这在 specs2 3.x 中有所改变。您现在需要使用Fragments.foreach 方法。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-10
      • 2021-11-13
      • 1970-01-01
      • 2011-10-11
      • 1970-01-01
      • 2015-05-22
      • 2011-07-04
      • 1970-01-01
      相关资源
      最近更新 更多