鍍金池/ 教程/ Scala/ Specs2 的設(shè)計(jì)思想
Spec2 可選的 Matcher(匹配運(yùn)算)
測試結(jié)果 Results
Specs2 的設(shè)計(jì)思想
Fragments API 簡介
簡介
期望結(jié)果
Spec2 內(nèi)置的 Matcher(匹配運(yùn)算)

Specs2 的設(shè)計(jì)思想

在詳細(xì)介紹 Specs2 用法之前,我們先了解一下 Specs2 的設(shè)計(jì)思想:

結(jié)構(gòu)

Specs2 的測試規(guī)范 Specification 的結(jié)構(gòu)非常簡單,它有多個(gè) Fragment 構(gòu)成,這個(gè) Fragment 的列表由 SpecificationStructure Trait 的 is 方法來指明:

http://wiki.jikexueyuan.com/project/scala-spece2-test/images/4.jpg" alt="PIC" />

其中:

  • Text: 描述系統(tǒng)的任意文字。
  • Example: 有文字和可返回此時(shí)結(jié)果的測試代碼構(gòu)成。
  • Step/Action: 單系統(tǒng)拋出異常時(shí)才執(zhí)行的動作。
  • SpecStart/SpecEnd: 測試規(guī)范的分界符。 它也可用來分開包含的子規(guī)范。
  • TaggingFragment: 可以包含其它 Framgent 的 Fragment 對象,這些 Fragment 集合可以包含或排除在需要運(yùn)行的測試用例中。

創(chuàng)建 Fragment

Specs2 定義了一下隱含的轉(zhuǎn)換用來創(chuàng)建 Fragment 對象(定義在 org.specs2.specification.FragmentsBuilder Trait 中).比如:

String => Text 由字符串創(chuàng)建 Text 對象      String ! Result => Example 創(chuàng)建一個(gè) Example 對象      等等    

一旦構(gòu)造好這些對象,可以通過“^” 操作符來鏈接這些測試對象。 從而創(chuàng)建一個(gè) Fragments 對象,它包含了一個(gè) Seq[Fragment] 對象。

val fragments: Fragments =
    "this text" ^
    "is related to this Example" ! success

這個(gè) Fragments 對象用來臨時(shí)存放一個(gè) Fragment 對象列表,用來保證這些 Fragment 對象執(zhí)行時(shí)開始和結(jié)束于正確的 SpecStart 和 SpecEnd 位置。

可變的 Specification

在一個(gè)可變的 Specification 中,多個(gè) Fragments 之間沒有”可見“的鏈接,它們是通過所謂的“副作用(side effect)”關(guān)聯(lián)(借助于 org.specs2.mutable 的增強(qiáng)版 FragmentsBuilder)。

// build an Example and add it to the specFragments variable
  "this example must succeed" in { success }
  "same thing here" in { success }

執(zhí)行

測試的執(zhí)行是由不同的 reports 對象來觸發(fā)。分為下面五步:

  1. Selection:使用參數(shù)來過濾需要執(zhí)行的 Fragment 對象。在這一步,幾乎所有的 Example(少數(shù)除外)可以使用 only(“this example”) 來過濾掉,另外一種選擇 Fragment 對象的方法是通過插入在 Specification 中插入 TaggingFragments 來實(shí)現(xiàn)。 如果 isolated 參數(shù)為 true 時(shí),每個(gè) Example 對象的執(zhí)行體通過復(fù)制同一個(gè) Specification 來避免局部變量可能帶來的副作用。
  2. Sequencing:通過將 Fragments 分組排序來支持同一組中的 Fragment 可以同步運(yùn)行。這也說明了 step 的由來。 假定一個(gè) fragments 對象是:fragments1 ^ step ^ fragments2 ,那么所有的 fragments1 都會執(zhí)行,然后執(zhí)行 step,最后執(zhí)行 fragments2。
  3. Execution:對于每個(gè)分組,缺省其中的 Fragment 對象的執(zhí)行是同時(shí)的,執(zhí)行的結(jié)果存放在一組 ExecutingFragments 中。 并且無需等所有 Fragments 都運(yùn)行完成就可以給出報(bào)告。
  4. Storing:測試完成后,我們需要計(jì)算測試的統(tǒng)計(jì)結(jié)果,并把結(jié)果存放在一個(gè)文件中 specs2-reports/specs2.stats。
  5. Exporting:取決于 Exporter,ExecutedFragments 可以把報(bào)告輸出到屏幕或是一個(gè) HTML 文件中。

測試報(bào)告

所有的測試報(bào)告由一組 ExecutingFragment 對象構(gòu)成,一個(gè) Reducer 對象列表用來采集相關(guān)信息。

  • 顯示文字和結(jié)果
  • 顯示文字的等級(也就是縮進(jìn))
  • 統(tǒng)計(jì)和執(zhí)行時(shí)間
  • 適用的參數(shù)等