spock测试_使用Spock测试您的代码
spock測試
Spock是針對Java和Groovy應(yīng)用程序的測試和規(guī)范框架。 Spock是:
- 極富表現(xiàn)力
- 簡化測試的“給定/何時/然后” 語法
- 與大多數(shù)IDE和CI服務(wù)器兼容。
聽起來不錯? 通過快速訪問Spock Web控制臺,您可以非??焖俚亻_始使用Spock。 當您有一個喜歡的小測試時,可以像發(fā)布此Hello World測試一樣進行發(fā)布。
Spock中的HelloWorld
首先,Spock測試是用Groovy編寫的。 這意味著,您在Java中擁有的一些樣板代碼將消失。 有一個Hello World測試可以很好地介紹Spock的某些功能。
- 默認情況下, 無需指示該類為公共類。
- 無需將firstWord和lastWord聲明為字符串
- 無需顯式調(diào)用assert,因為Expect塊中的每一行代碼都會自動獲取該斷言。 只要確保該塊中的行是布爾表達式即可。 因此,在這種情況下,它只是一個相等表達式,可以為true或false。
這么少的樣板代碼下一步是什么? 好吧,您知道通過JUnit測試獲得的那些真正長的測試名稱,而不是必須調(diào)用此測試helloWorldIntroductionToSpockTest ()(這很難讀取),您可以使用帶空格的String來命名測試: Hello World對Spock的介紹測試 。 這使事情更具可讀性。
第三,如果我要對測試進行一些小的更改并將firstWord更改為“ Hello1 ”,則測試當然會失敗。 但是,當我在Spock中失敗時,我會得到測試的表達式的完整上下文。 我看到了firstWord的值, secondWord的值以及連接后的值,這使測試失敗時可以更快地診斷問題。
Spock顯示失敗的背景
模擬和存根對于介紹來說不錯。 現(xiàn)在讓我們看看更多功能。
在JUnit中( 以及各種附加功能),模擬和存根功能更為強大。 但是,它不僅在Spock中超級強大,而且非常簡潔,使您的測試代碼非常整潔且易于閱讀。
假設(shè)我們想在測試中添加一個名為PaymentCalculator的類,更具體地說,是一個方法calculate(Product product,Integer count)。 在存根版本中,無論產(chǎn)品值如何,我們都希望返回計數(shù)乘以10。 在Spock中,我們通過以下方式實現(xiàn)這一目標:
PaymentCalculator paymentCalculator = Stub(PaymentCalculator) paymentCalculator.calculate(_, _) >> {p, c -> c * 10}如果您還沒有意識到這是多么短暫和整潔,那么那就給自己喝杯咖啡吧 。 如果您已經(jīng)很好地了解了,您仍然可以找到一個保險箱,但是請考慮以下幾點:
參數(shù)化測試
最好的解釋方式是通過示例。
@Unroll def "Check that the rugby player #player who has Irish status #isIrish plays for Ireland"(String player, Boolean isIrish) {given:"An instance of Rugby player validator"RugbyPlayerValidator rugbyPlayerValidator = new RugbyPlayerValidator()expect:rugbyPlayerValidator.isIrish(player) == isIrishwhere:player || isIrish"Johny Sexton" || true"Stuart Hogg" || false"Conor Murray" || true"George North" || false"Jack Nowell" || true}在此參數(shù)化測試中,我們看到以下內(nèi)容:
同樣,這使得縮小錯誤的范圍變得更快。 測試是錯誤的還是代碼是錯誤的? 這成為一個可以更快回答的問題。 在這種情況下,測試是錯誤的。
Groovy的所有好處
還有什么? 好吧,另一個主要好處是Groovy的所有好處。 例如,假設(shè)您正在測試一個返回JSON或XML的API。 Groovy在解析XML和JSON方面非常出色。 假設(shè)我們有一個API,該API以XML格式返回有關(guān)體育運動員的信息。 格式有所不同,但僅略有不同,具體取決于他們參加的運動:
Joey Carberry<details><rugbysummarycategory><players><player>Joey Carberry</player><player>Teddy Thomas</player></players> </rugbysummarycategory> </details><details><footballsummarycategory><players><player>Lionel Messi</player><player>Cristiano Ronaldo</player></players></footballsummarycategory> </details>我們只想調(diào)用此API,然后解析運動員(與運動無關(guān))即可。 我們可以在Groovy中非常簡單地對此進行多態(tài)分析。
def rootNode = new XmlSlurper().parseText(xml) List players = rootNode.'*'.Players.Player*.text()一些要點:
假設(shè)我們要檢查玩家的名字。 好吧,在這種情況下,我們不在乎順序,因此將列表轉(zhuǎn)換為Set然后進行檢查更有意義。 簡單。
players as Set = ["Joey Carberry", "Teddy Thomas", "Lionel Messi", Cristiano Ranaldo"] as Set 這會將兩個列表都轉(zhuǎn)換為Set,這意味著訂單檢查消失了,這只是Set的比較。 我們可以利用更多的Groovy優(yōu)勢。 但是美麗是,我們實際上沒有必要。
在Groovy類中,所有Java代碼也是有效的 。 Spock也是如此。 這意味著對于任何具有Java背景的人來說,學習者的學習曲線都不陡峭。 他們可以編寫純Java代碼,然后從代碼評論等中獲得一些Groovy技巧。
強大的注釋
Spock還為您的測試提供了一系列功能強大的注釋。 再次,我們在這里看到了Groovy的強大功能,因為我們可以將閉包傳遞給這些注釋。 例如:
@IgnoreIf({System.getProperty("os.name").contains("windows")}) def "I'll run anywhere except windows"() {...}或者如果執(zhí)行時間過長,則使測試失敗
@Timeout(value = 100, unit=TimeUnit.MILLISECONDS) def "I better be quick"() {...}因此,總而言之,Spock與原始JUnit具有以下優(yōu)點:
通常被遺忘的一點之一是您的項目不必用Groovy編寫。 您可以將其全部保留在Java中,并為生產(chǎn)代碼使用Java的靜態(tài)類型,并為測試代碼使用Groovy的功能和速度。
在下一次之前,請您自己保重。
翻譯自: https://www.javacodegeeks.com/2018/03/testing-code-spock.html
spock測試
總結(jié)
以上是生活随笔為你收集整理的spock测试_使用Spock测试您的代码的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java8日期转时间戳_Java 8日期
- 下一篇: 安卓游戏编程从零开始(安卓游戏编程)