2012-06-09 46 views
1

我剛開始使用Scala和Spec2。但是,我對spec2中的接受風格有點困惑。Scala specs2驗收測試模式混淆

有人可以向我解釋什麼是功能!在這種情況下。我已閱讀過文檔,但我仍然不太明白。我理解單元測試模式,但這部分對我來說真的很難理解。

 

    "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

非常感謝你。

回答

3

這很簡單。正如頁^上寫的那樣,構建了一個片段列表。片段可以是字符串,附帶代碼塊的描述(「描述」!塊)或控制元素,如空白行p。所以,你的例子可以理解爲:

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

這會在你的規範類的頂部被指定爲def is =的身體。在內部,這個列表將被處理,並且對於每個描述,都會有一行打印到控制檯,並且根據塊的結果(如果有的話)它的顏色將有所不同。

所以總結一下,它會建立一個由測試運行器處理的項目列表。

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術語),什麼!確實將「測試規則」與「測試用例」關聯起來。它有點像下面 - 不完全是,因爲我正在改變東西,使它看起來更像傳統的面向對象。

"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) 
    ) 
) 
) 

所以,接受規範是由片段組成的。片段可以用許多方式組成,例如與某些代碼相關的描述,或者其他片段的描述。

它的工作方式非常複雜,可以滿足各種不同的需求,例如自動示例,給定時間指定,正則表達式提取器,部分函數,​​規範輸出格式等。