Scala specs2验收测试模式混乱

时间:2012-06-09 10:30:35

标签: scala acceptance-testing specs2

我刚开始使用Scala和Spec2。但是,我对spec2中的接受风格有点混淆。

有人可以向我解释一下它的功能是什么!和^在这种情况下。我已阅读文档,我仍然不太明白。我理解单元测试模式,但这部分对我来说真的很难理解。


  "this is my specification"                          ^
    "and example 1"                                   ! e1^
    "and example 2"                                   ! e2

  def e1 = success
  def e2 = success

这个例子我是从http://etorreborre.github.com/specs2/guide/org.specs2.guide.Structure.html

得到的

非常感谢。

2 个答案:

答案 0 :(得分:4)

首先,选择!^并考虑两个标准:

  • 减少视觉混乱
  • 具有避免括号所需的相对优先权

他们做的是:!将描述与测试该描述的代码相关联,^将一堆描述,测试,格式化注释和其他支持代码连接到描述的对象中完整的测试套件。

“接受”规范的要点是它们纯粹是功能性的。可变规范利用可变性来“注册”代码。例如,当您这样做时:

"a test" should {
  "succeed" in {
    success
  }
}

这与任何声明无关。它只是类(构造函数)体中的一个语句,那么Specs2如何找到它呢?简单:当代码运行时,它会更改值或变量以自行注册。

这是不可变的规范不能做的事情。通过运行方法is找到测试,该方法必须返回所有测试的列表。让我们想象一个非常OO,非语法的糖,这样做的方式:

def is = List(
  new TestCase("A Test", new TestRule("succeed", success)),
  new TestCase("Another test", new TestRule("not fail", success))
)

那么,^方法的作用是加入“测试用例”(可以这么说 - 不是实际的Specs2术语),!做的是将“测试规则”与“测试用例”。它有点像下面 - 不完全是,因为我正在改变东西,使它看起来更像传统的OO。

"this is my specification"                        ^
"and example 1"                                   ! e1^
"and example 2"                                   ! e2

new ExampleDescription("this is my specification") ^
new ExampleDescription("and example 1")            ! e1^
new ExampleDescription("and example 2")            ! e2

// an "Example" is a subclass of "Fragment"
new ExampleDescription("this is my specification")       ^
new Example(new ExampleDescription("and example 1"), e1) ^
new Example(new ExampleDescription("and example 2"), e2)

new Fragment(
  new ExampleDescription("this is my specification"),
  List(
    new Example(new ExampleDescription("and example 1"), e1),
    new Example(new ExampleDescription("and example 2"), e2)
  )
)

new Fragments(
  new Fragment(
    new ExampleDescription("this is my specification"),
    List(
      new Example(new ExampleDescription("and example 1"), e1),
      new Example(new ExampleDescription("and example 2"), e2)
    )
  )
)

因此,验收规范由片段组成。片段可以通过多种方式组合,例如与某些代码相关的描述,或者其他片段后面的描述。

它的工作方式非常复杂,可以满足各种需求,例如自动示例,当时给定的规范,正则表达式提取器,部分函数,​​规范输出格式等等。

答案 1 :(得分:3)

这很简单。正如页面^上所写,构建了一个片段列表。片段可以是字符串,附加代码块的描述(“description”!block)或控件元素(如p)作为空行。所以你的例子可以理解为:

Description("this is my specification") and
  Description("and example 1").withBlock(e1) and
  Description("and example 2").withBlock(e2)

这将被指定为spec类顶部def is =的正文。在内部,此列表将被处理,并且对于每个描述,将在控制台上打印一行,并且根据块的结果(如果有的话),它将以不同的颜色着色。

总而言之,它构建了一个将由测试运行者处理的项目列表。