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