Spock與現有測試框架的對比

1、Spock是什麼?java

  • Spock是一個能夠應用於java或groovy的測試框架
  • 在編寫單元測試過程當中去掉依賴的類/對象/資源,專一測試類自己,實現解耦
  • Spock測試框架基於Groovy並吸取了Junit、TestNG、Mockito等測試框架的優勢
  • Spock編寫的單元測試層次清晰,優雅,代碼量少,可讀性好

2、Spock+Groovy讓咱們的測試代碼更輕框架

  • groovy是一種很是相似java的語言,可是語法更加輕,每句代碼結尾不用分號結束,也不須要用public修飾,由於pubilc是默認的。
  • 在spock中mock對象很是容易,只須要使用Mock(class)
  • Groovy可使用字符串文原本命名方法,這個特性使測試方法更加容易被閱讀和理解。
  • expect能夠看作精簡版的when+then
  • 「>>」 表示模擬對象的返回值
  • 「>>>」 表示同一方法屢次按順序調用返回不一樣值
  • 下劃線「_」表示匹配全部的輸入值
  • Spock不使用Assert來校驗結果,then聲明後面的表達式result=="1"就至關於Junit中的Assert.assertTrue(result.equals("1"))
  • n * . 表示指望對對象的方法n次調用

3、spock的與其餘框架的對比函數

一、Spock強制使用一套清晰的測試結構單元測試

使用Spock緣由是會讓你感受層級分明,相對於其餘框架來講代碼具備更高的可讀性,而JUnit測試缺少正式的語義,在JUnit測試中,arrange-act-assert模式是隱含的很容易被忽略,例如一名java開發人員可將JUnit測試寫成以下:測試

當arrange-act-assert模式結構被破壞了,代碼可閱讀性變差,當內容較長,邏輯複雜,這時單測的維護成本就變的很大,而Spock除了使用基本的given-when-then,還可使用其餘的代碼塊來保證測試的結構完整性。rest

開發維護人員僅僅經過閱讀對應的代碼塊的名字便可知道這個測試是作什麼的,清晰明瞭。對象

二、參數化測試blog

JUnit和Mockito對於參數化的支持很是有限並且很受限制,JUnit測試很顯然不符合DRY原則(Don't repeat yourself,不要重複本身),有太多的相同代碼, 而Spock提供數據表格正好能解決這個問題, spock能以直觀的方式編寫參數化,並且代碼不須要重複,將數據和描述以表格的形式放在一塊兒。經過以上代碼能夠看到,這裏講三個JUnit的測試合併在一個單獨的spock測試裏,不須要寫重複代碼, 測試邏輯只要寫一次,全部的輸入和輸出都集中在一個地方,可閱讀性高,參數名稱在表格頭部清晰可見。資源

三、開箱即用開發

Groovy自動提供一個構造函數,構造函數接受一個名稱-值對與類的屬性相對應,是Groovy開箱即用的功能— 用於類中定義的任何屬性,Groovy 容許將存儲了大量值的映射傳給構造函數,不用初始化對象的每一個屬性,減輕代碼。

新建一個類song:

可添加下面這個代碼:

在JUnit只能一個個的set值,比較繁瑣。

四、關於重載

在實際開發項目中,少不了用重載,在JUnit中測試重載須要寫大量的重複代碼,很是繁瑣複雜,而在Spock中使用*匹配器,如上用restTemplate.exchange(*),便可測試全部的重載方法,簡潔優雅。

五、斷言異常

Spock還爲咱們提供了一種表達方式來檢查異常狀況。在JUnit中,咱們的一些選項可能會使用try-catch塊,在咱們測試的頂部聲明,或者使用第三方庫。 Spock的原生斷言提供了一種處理exception狀況的方法:

在這裏,咱們不須要引入額外的庫。另外一個優勢是thrown()方法將斷言異常的類型,但不會暫停執行測試。

六、mock和stubbing

經過使用mock和stub,可讓mock對象進行交互,得到指望的返回值,這在JUnit和mockito中是很難實現的,而在Spock僅用幾行代碼就能夠優雅實現了。

相關文章
相關標籤/搜索