簡體   English   中英

如何從 Groovy 中的斷言方法或閉包打印語句

[英]How to print statement from asserted method or closure in Groovy

是否有可能將閉包或方法中的語句內聯到斷言中,以便在斷言失敗時打印出來?

如果我們有像assert 10 == (20 - 11)這樣的簡單語句,那么 Groovy 的 power assert 會很好地打印它,如下所示:

assert 10 == (20 - 11)
          |      |
          false  9

但是,如果我們將語句提取到一個閉包中,例如:

def c = { arg -> arg == (20 - 11) }
assert c(10)

那么輸出的信息量就會少得多:

assert c(10)
       |
       false

我正在開發自定義特定的測試框架,用例是將自定義斷言表示為布爾閉包或方法,並從一個地方運行斷言。

你得到這樣的輸出是因為, closure返回 boolean 並且assert確實尋找true

方法#1 :如果你想改變輸出,那么你可以將兩個參數傳遞給closure而不是一個參數,如下所示。 當然,您可能不想在您的框架中將相等性與靜態數字進行比較,因此第二個參數是有意義的。

def c = { arg1, arg2 -> arg1 == arg2 }  
assert c(10, 20-11), 'comparison failed'

輸出:

java.lang.AssertionError:比較失敗。 表達式:c.call(10, (20 - 11)) 在 Script1.run(Script1.groovy:2)

方法#2 :這里適當地更改了閉包名稱,並在其內部進行斷言。 由於它的名字是assertEqual ,它不太可能被誤用於其他斷言,例如><

def assertEqual = { arg1, arg2 -> assert arg1 == arg2, "Comparison failed: ${arg1} vs ${arg2}" }  
assertEqual(10, 20-11)

輸出:

java.lang.AssertionError:比較失敗:10 對 9。表達式:(arg1 == arg2)。 值:arg1 = 10,arg2 = 9
在 Script1$_run_closure1.doCall(Script1.groovy:1)
在 Script1.run(Script1.groovy:2)

您以這種方式編寫更多的閉包,例如assertGreaterThan assertLessThan用於特定操作。

方法#3 :在這里,您甚至可以將應該是錯誤消息的內容傳遞給閉包。

def assertEqual = { arg1, arg2, message -> assert arg1 == arg2, message(arg1, arg2) }
assertEqual(10, 20-11) {op1, op2 -> "$op1 is not equal to $op2"}

輸出:

java.lang.AssertionError: 10 is not equal to 9. Expression: (arg1 == arg2)。 值:arg1 = 10,arg2 = 9
在 Script1$_run_closure1.doCall(Script1.groovy:1)
在 Script1.run(Script1.groovy:2)

方法#4用戶可以傳遞operation和消息的另一種變體。 您不僅可以執行equal ,還可以執行其他操作。 因此,將closure名稱更改為myAssert

def myAssert = { arg1, arg2, expression -> expression(arg1, arg2) }
//Greater than
myAssert(10, 20-11) {op1, op2 -> assert op1 > op2, "$op1 is not greater than $op2" }
//Less than
myAssert(10, 20-11) {op1, op2 -> assert op1 < op2, "$op1 is not less than $op2" }
//Equal
myAssert(10, 20-11) {op1, op2 -> assert op1 == op2, "$op1 is not equal to $op2" }

輸出:

java.lang.AssertionError: 10 不小於 9. 表達式: (op1 < op2)。 值:op1 = 10,op2 = 9
在 Script1$_run_closure2.doCall(Script1.groovy:2)
在 Script1$_run_closure1.doCall(Script1.groovy:1)
在 Script1.run(Script1.groovy:2)

如果您想采用簡單的方法並只使用equal斷言,那么方法#2是正確的方法 當然,您可以更好地選擇哪一種更適合您的需要。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM