如何讓TestNG列印關於失敗的詳細訊息?
TestNG支援許多斷言。它擁有擴充套件Java物件類`java.lang.object`的`org.testng.Assert`類。
每當發生失敗時,使用者都希望獲得詳細的失敗報告以便進行根本原因分析。但是,有時顯示的失敗資訊不足,有時使用者會重複收到相同型別的失敗資訊。可以使用關鍵字`verbose ="<int>"`在TestNG中處理這些問題。
TestNG支援`verbose`,並允許使用者根據他們想要檢視的失敗資訊的程度傳遞值。它支援-1到10的值。
預設情況下,其值為“0”,這將顯示關於失敗的儘可能少的的資訊。
“-1”是除錯模式。
當`verbose`設定為“10”時,它將顯示關於測試、方法、監聽器等的全部相關統計資訊。
在本文中,我們將比較`verbose`為0和10時TestNG中的兩個列表。
場景1
在這個場景中,我們將`verbose`設定為0並觀察輸出。
解決此問題的方法/演算法:
**步驟1** - 建立一個名為`NewTestngClass`的TestNG類。
**步驟2** - 在類中編寫一個@Test方法,如下所示。
**步驟3** - 現在建立用於`verbose=0`的testng.xml來執行TestNG類。
**步驟4** - 執行testng.xml,或直接在IDE中執行TestNG類,或使用命令列編譯和執行它。
示例
使用以下程式碼作為通用的TestNG類“`NewTestngClass`”:
src/ NewTestngClass.java
import org.testng.Assert; import org.testng.annotations.*; public class NewTestngClass { @Test public void testOne() { int Id = 1; int newId = 2 ; Assert.assertEquals(Id, newId); } }
testng.xml
這是一個用於組織和執行TestNG測試用例的配置檔案。當只需要執行有限的測試而不是完整的套件時,它非常方便。
<?xml version = "1.0" encoding = "UTF-8"?> <!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" > <suite name = "Suite1" verbose="0"> <test name = "test1"> <classes> <class name = "NewTestngClass"/> </classes> </test> </suite>
輸出
java.lang.AssertionError: expected [2] but found [1] Expected :2 Actual :1 at org.testng.Assert.fail(Assert.java:99) at org.testng.Assert.failNotEquals(Assert.java:1037) at org.testng.Assert.assertEqualsImpl(Assert.java:140) at org.testng.Assert.assertEquals(Assert.java:122) at org.testng.Assert.assertEquals(Assert.java:907) at org.testng.Assert.assertEquals(Assert.java:917) at NewTestngClass.testOne(NewTestngClass.java:12) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:133) at org.testng.internal.TestInvoker.invokeMethod(TestInvoker.java:598) at org.testng.internal.TestInvoker.invokeTestMethod(TestInvoker.java:173) at org.testng.internal.MethodRunner.runInSequence(MethodRunner.java:46) at org.testng.internal.TestInvoker$MethodInvocationAgent.invoke(TestInvoker.java:824) at org.testng.internal.TestInvoker.invokeTestMethods(TestInvoker.java:146) at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:146) at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:128) at java.util.ArrayList.forEach(ArrayList.java:1259) at org.testng.TestRunner.privateRun(TestRunner.java:794) at org.testng.TestRunner.run(TestRunner.java:596) at org.testng.SuiteRunner.runTest(SuiteRunner.java:377) at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:371) at org.testng.SuiteRunner.privateRun(SuiteRunner.java:332) at org.testng.SuiteRunner.run(SuiteRunner.java:276) at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:53) at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:96) at org.testng.TestNG.runSuitesSequentially(TestNG.java:1212) at org.testng.TestNG.runSuitesLocally(TestNG.java:1134) at org.testng.TestNG.runSuites(TestNG.java:1063) at org.testng.TestNG.run(TestNG.java:1031) at com.intellij.rt.testng.IDEARemoteTestNG.run(IDEARemoteTestNG.java:66) at com.intellij.rt.testng.RemoteTestNGStarter.main(RemoteTestNGStarter.java:109)
場景2
在這個場景中,我們將`verbose`設定為10並觀察輸出。
解決此問題的方法/演算法:
**步驟1** - 建立一個名為`NewTestngClass`的TestNG類。
**步驟2** - 在類中編寫一個@Test方法。
**步驟3** - 現在建立用於`verbose=10`的testng.xml來執行TestNG類。
**步驟4** - 執行testng.xml,或直接在IDE中執行TestNG類,或使用命令列編譯和執行它。
示例
使用以下程式碼作為通用的TestNG類“`NewTestngClass`”
src/ NewTestngClass.java
import org.testng.Assert; import org.testng.annotations.*; public class NewTestngClass { @Test public void testOne() { int Id = 1; int newId = 2 ; Assert.assertEquals(Id, newId); } }
testng.xml
這是一個用於組織和執行TestNG測試用例的配置檔案。當只需要執行有限的測試而不是完整的套件時,它非常方便。
<?xml version = "1.0" encoding = "UTF-8"?> <!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" > <suite name = "Suite1" verbose="10"> <test name = "test1"> <classes> <class name = "NewTestngClass"/> </classes> </test> </suite>
輸出
... ... TestNG 7.4.0 by Cédric Beust (cedric@beust.com) ... java.lang.AssertionError: expected [2] but found [1] Expected :2 Actual :1 <Click to see difference> at org.testng.Assert.fail(Assert.java:99) at org.testng.Assert.failNotEquals(Assert.java:1037) at org.testng.Assert.assertEqualsImpl(Assert.java:140) at org.testng.Assert.assertEquals(Assert.java:122) at org.testng.Assert.assertEquals(Assert.java:907) at org.testng.Assert.assertEquals(Assert.java:917) at NewTestngClass.testOne(NewTestngClass.java:12) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:133) at org.testng.internal.TestInvoker.invokeMethod(TestInvoker.java:598) at org.testng.internal.TestInvoker.invokeTestMethod(TestInvoker.java:173) at org.testng.internal.MethodRunner.runInSequence(MethodRunner.java:46) at org.testng.internal.TestInvoker$MethodInvocationAgent.invoke(TestInvoker.java:824) at org.testng.internal.TestInvoker.invokeTestMethods(TestInvoker.java:146) at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:146) at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:128) at java.util.ArrayList.forEach(ArrayList.java:1259) at org.testng.TestRunner.privateRun(TestRunner.java:794) at org.testng.TestRunner.run(TestRunner.java:596) at org.testng.SuiteRunner.runTest(SuiteRunner.java:377) at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:371) at org.testng.SuiteRunner.privateRun(SuiteRunner.java:332) at org.testng.SuiteRunner.run(SuiteRunner.java:276) at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:53) at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:96) at org.testng.TestNG.runSuitesSequentially(TestNG.java:1212) at org.testng.TestNG.runSuitesLocally(TestNG.java:1134) at org.testng.TestNG.runSuites(TestNG.java:1063) at org.testng.TestNG.run(TestNG.java:1031) at com.intellij.rt.testng.IDEARemoteTestNG.run(IDEARemoteTestNG.java:66) at com.intellij.rt.testng.RemoteTestNGStarter.main(RemoteTestNGStarter.java:109) ===== Invoked methods NewTestngClass.testOne()[pri:0, instance:NewTestngClass@35fb3008] ===== FAILED: testOne java.lang.AssertionError: expected [2] but found [1] at org.testng.Assert.fail(Assert.java:99) at org.testng.Assert.failNotEquals(Assert.java:1037) at org.testng.Assert.assertEqualsImpl(Assert.java:140) at org.testng.Assert.assertEquals(Assert.java:122) at org.testng.Assert.assertEquals(Assert.java:907) at org.testng.Assert.assertEquals(Assert.java:917) at NewTestngClass.testOne(NewTestngClass.java:12) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:133) at org.testng.internal.TestInvoker.invokeMethod(TestInvoker.java:598) at org.testng.internal.TestInvoker.invokeTestMethod(TestInvoker.java:173) at org.testng.internal.MethodRunner.runInSequence(MethodRunner.java:46) at org.testng.internal.TestInvoker$MethodInvocationAgent.invoke(TestInvoker.java:824) at org.testng.internal.TestInvoker.invokeTestMethods(TestInvoker.java:146) at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:146) at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:128) at java.util.ArrayList.forEach(ArrayList.java:1259) at org.testng.TestRunner.privateRun(TestRunner.java:794) at org.testng.TestRunner.run(TestRunner.java:596) at org.testng.SuiteRunner.runTest(SuiteRunner.java:377) at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:371) at org.testng.SuiteRunner.privateRun(SuiteRunner.java:332) at org.testng.SuiteRunner.run(SuiteRunner.java:276) at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:53) at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:96) at org.testng.TestNG.runSuitesSequentially(TestNG.java:1212) at org.testng.TestNG.runSuitesLocally(TestNG.java:1134) at org.testng.TestNG.runSuites(TestNG.java:1063) at org.testng.TestNG.run(TestNG.java:1031) at com.intellij.rt.testng.IDEARemoteTestNG.run(IDEARemoteTestNG.java:66) at com.intellij.rt.testng.RemoteTestNGStarter.main(RemoteTestNGStarter.java:109) =============================================== test1 Tests run: 1, Failures: 1, Skips: 0 =============================================== =============================================== Suite1 Total tests run: 1, Passes: 0, Failures: 1, Skips: 0 ===============================================
分析
當`verbose`為10時,使用者可以在輸出中看到很多細節,例如:
執行的總測試數,哪些測試已執行以及狀態。
執行的總套件數,套件名稱和測試執行詳情。
除此之外,使用者還可以看到執行的TestNG版本。
呼叫的方法名和相應的測試名稱以及錯誤。
當`verbose`為0時,以上詳細資訊缺失。