日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

spock测试_使用Spock测试您的代码

發(fā)布時(shí)間:2023/12/3 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 spock测试_使用Spock测试您的代码 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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

  • 計(jì)算所有值的下劃線
  • 在右側(cè),我們看到了Groovy Closure。 現(xiàn)在,將其視為具有兩個(gè)輸入的匿名方法。 p為產(chǎn)品,c為計(jì)數(shù)。 我們不必鍵入它們。 那只是更多樣板代碼而已。
  • 閉包將始終返回計(jì)數(shù)時(shí)間10。我們不需要return語(yǔ)句。 總是返回最后一個(gè)表達(dá)式的值。 同樣,這意味著更少的樣板代碼。 當(dāng)存根變得如此簡(jiǎn)單和整潔時(shí),這意味著您可以真正專注于測(cè)試-很棒。
  • 參數(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)容:

  • 測(cè)試已參數(shù)化,我們?cè)跍y(cè)試簽名和where塊中。
  • 有一個(gè)輸入?yún)?shù)播放器和一個(gè)輸出參數(shù)–對(duì)應(yīng)于期望值。
  • 測(cè)試已進(jìn)行五次參數(shù)設(shè)置。 輸入?yún)?shù)在左側(cè),輸出在右側(cè)。 當(dāng)然,也可以有更多的一個(gè),在這個(gè)測(cè)試中,我們每個(gè)只有一個(gè)。
  • @Unroll注釋表示如果測(cè)試失敗,則將輸出所有參數(shù)的值。 該消息將把玩家的詳細(xì)信息替換為#player,并將愛(ài)爾蘭身份的詳細(xì)信息替換為#isIrish。 例如,“ 檢查具有愛(ài)爾蘭身份的橄欖球球員杰克·諾維爾是否為愛(à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):

  • 動(dòng)態(tài)類型的功能是立竿見(jiàn)影的。 可以在rootNode上動(dòng)態(tài)調(diào)用該表達(dá)式。 無(wú)需冗長(zhǎng),復(fù)雜的XPath表達(dá)式。
  • “ *”就像通配符。 這將涵蓋RugbySummaryCategory和FootballSummaryCategory。
  • Player *,表示所有Player元素。 所以這里不需要愚蠢的冗長(zhǎng)的循環(huán)
  • text()表達(dá)式只是提取各個(gè)Player元素之間的文本值。 那么為什么現(xiàn)在要列出所有玩家并可以簡(jiǎn)單地進(jìn)行操作:players.size()== 4請(qǐng)記住,不需要斷言。
  • 假設(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):

  • 強(qiáng)制執(zhí)行測(cè)試結(jié)構(gòu)。 沒(méi)有更多的隨機(jī)斷言。 斷言只能在代碼的指定部分中。
  • 測(cè)試代碼更具可讀性。
  • 有關(guān)失敗測(cè)試的更多信息
  • 可以用更少的代碼進(jìn)行模擬和存根
  • 可以利用大量的Groovy功能使代碼不再那么冗長(zhǎng)
  • 非常強(qiáng)大的測(cè)試參數(shù)設(shè)置,可以非常整齊地完成
  • 一系列功能強(qiáng)大的注釋。
  • 通常被遺忘的一點(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)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。