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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2023/12/3 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 spock测试_使用Spock测试您的代码 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

spock測試

Spock是針對Java和Groovy應用程序的測試和規范框架。 Spock是:

  • 極富表現力
  • 簡化測試的“給定/何時/然后” 語法
  • 與大多數IDE和CI服務器兼容。

聽起來不錯? 通過快速訪問Spock Web控制臺,您可以非??焖俚亻_始使用Spock。 當您有一個喜歡的小測試時,可以像發布此Hello World測試一樣進行發布。

Spock中的HelloWorld

首先,Spock測試是用Groovy編寫的。 這意味著,您在Java中擁有的一些樣板代碼將消失。 有一個Hello World測試可以很好地介紹Spock的某些功能。

  • 默認情況下, 無需指示該類為公共類。
  • 無需將firstWord和lastWord聲明為字符串
  • 無需顯式調用assert,因為Expect塊中的每一行代碼都會自動獲取該斷言。 只要確保該塊中的行是布爾表達式即可。 因此,在這種情況下,它只是一個相等表達式,可以為true或false。

這么少的樣板代碼下一步是什么? 好吧,您知道通過JUnit測試獲得的那些真正長的測試名稱,而不是必須調用此測試helloWorldIntroductionToSpockTest ()(這很難讀取),您可以使用帶空格的String來命名測試: Hello World對Spock的介紹測試 。 這使事情更具可讀性。

第三,如果我要對測試進行一些小的更改并將firstWord更改為“ Hello1 ”,則測試當然會失敗。 但是,當我在Spock中失敗時,我會得到測試的表達式的完整上下文。 我看到了firstWord的值, secondWord的值以及連接后的值,這使測試失敗時可以更快地診斷問題。

Spock顯示失敗的背景

模擬和存根對于介紹來說不錯。 現在讓我們看看更多功能。

在JUnit中( 以及各種附加功能),模擬和存根功能更為強大。 但是,它不僅在Spock中超級強大,而且非常簡潔,使您的測試代碼非常整潔且易于閱讀。

假設我們想在測試中添加一個名為PaymentCalculator的類,更具體地說,是一個方法calculate(Product product,Integer count)。 在存根版本中,無論產品值如何,我們都希望返回計數乘以10。 在Spock中,我們通過以下方式實現這一目標:

PaymentCalculator paymentCalculator = Stub(PaymentCalculator) paymentCalculator.calculate(_, _) >> {p, c -> c * 10}

如果您還沒有意識到這是多么短暫和整潔,那么那就給自己喝杯咖啡吧 。 如果您已經很好地了解了,您仍然可以找到一個保險箱,但是請考慮以下幾點:

  • 計算所有值的下劃線
  • 在右側,我們看到了Groovy Closure。 現在,將其視為具有兩個輸入的匿名方法。 p為產品,c為計數。 我們不必鍵入它們。 那只是更多樣板代碼而已。
  • 閉包將始終返回計數時間10。我們不需要return語句。 總是返回最后一個表達式的值。 同樣,這意味著更少的樣板代碼。 當存根變得如此簡單和整潔時,這意味著您可以真正專注于測試-很棒。
  • 參數化測試

    最好的解釋方式是通過示例。

    @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}

    在此參數化測試中,我們看到以下內容:

  • 測試已參數化,我們在測試簽名和where塊中。
  • 有一個輸入參數播放器和一個輸出參數–對應于期望值。
  • 測試已進行五次參數設置。 輸入參數在左側,輸出在右側。 當然,也可以有更多的一個,在這個測試中,我們每個只有一個。
  • @Unroll注釋表示如果測試失敗,則將輸出所有參數的值。 該消息將把玩家的詳細信息替換為#player,并將愛爾蘭身份的詳細信息替換為#isIrish。 例如,“ 檢查具有愛爾蘭身份的橄欖球球員杰克·諾維爾是否為愛爾蘭效力 ”
  • 同樣,這使得縮小錯誤的范圍變得更快。 測試是錯誤的還是代碼是錯誤的? 這成為一個可以更快回答的問題。 在這種情況下,測試是錯誤的。

    Groovy的所有好處

    還有什么? 好吧,另一個主要好處是Groovy的所有好處。 例如,假設您正在測試一個返回JSON或XML的API。 Groovy在解析XML和JSON方面非常出色。 假設我們有一個API,該API以XML格式返回有關體育運動員的信息。 格式有所不同,但僅略有不同,具體取決于他們參加的運動:

    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>

    我們只想調用此API,然后解析運動員(與運動無關)即可。 我們可以在Groovy中非常簡單地對此進行多態分析。

    def rootNode = new XmlSlurper().parseText(xml) List players = rootNode.'*'.Players.Player*.text()

    一些要點:

  • 動態類型的功能是立竿見影的。 可以在rootNode上動態調用該表達式。 無需冗長,復雜的XPath表達式。
  • “ *”就像通配符。 這將涵蓋RugbySummaryCategory和FootballSummaryCategory。
  • Player *,表示所有Player元素。 所以這里不需要愚蠢的冗長的循環
  • text()表達式只是提取各個Player元素之間的文本值。 那么為什么現在要列出所有玩家并可以簡單地進行操作:players.size()== 4請記住,不需要斷言。
  • 假設我們要檢查玩家的名字。 好吧,在這種情況下,我們不在乎順序,因此將列表轉換為Set然后進行檢查更有意義。 簡單。

    players as Set = ["Joey Carberry", "Teddy Thomas", "Lionel Messi", Cristiano Ranaldo"] as Set

    這會將兩個列表都轉換為Set,這意味著訂單檢查消失了,這只是Set的比較。 我們可以利用更多的Groovy優勢。 但是美麗是,我們實際上沒有必要。
    在Groovy類中,所有Java代碼也是有效的 。 Spock也是如此。 這意味著對于任何具有Java背景的人來說,學習者的學習曲線都不陡峭。 他們可以編寫純Java代碼,然后從代碼評論等中獲得一些Groovy技巧。

    強大的注釋

    Spock還為您的測試提供了一系列功能強大的注釋。 再次,我們在這里看到了Groovy的強大功能,因為我們可以將閉包傳遞給這些注釋。 例如:

    @IgnoreIf({System.getProperty("os.name").contains("windows")}) def "I'll run anywhere except windows"() {...}

    或者如果執行時間過長,則使測試失敗

    @Timeout(value = 100, unit=TimeUnit.MILLISECONDS) def "I better be quick"() {...}

    因此,總而言之,Spock與原始JUnit具有以下優點:

  • 強制執行測試結構。 沒有更多的隨機斷言。 斷言只能在代碼的指定部分中。
  • 測試代碼更具可讀性。
  • 有關失敗測試的更多信息
  • 可以用更少的代碼進行模擬和存根
  • 可以利用大量的Groovy功能使代碼不再那么冗長
  • 非常強大的測試參數設置,可以非常整齊地完成
  • 一系列功能強大的注釋。
  • 通常被遺忘的一點之一是您的項目不必用Groovy編寫。 您可以將其全部保留在Java中,并為生產代碼使用Java的靜態類型,并為測試代碼使用Groovy的功能和速度。

    在下一次之前,請您自己保重。

    翻譯自: https://www.javacodegeeks.com/2018/03/testing-code-spock.html

    spock測試

    總結

    以上是生活随笔為你收集整理的spock测试_使用Spock测试您的代码的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。