如何在 @AfterMethod 中獲取 TestNG 的結果狀態?
TestNG 支援原生依賴注入。它允許在方法中宣告附加引數。在執行時,TestNG 會自動使用正確的值填充這些引數。以下是 TestNG 中一些原生依賴項的列表
ITestContext
XmlTest
Method
ITestResult
您可以使用這些依賴項來獲取 TestNG 中測試的執行狀態。
通常,@AfterMethod 支援所有這些原生依賴項,測試狀態可以是成功、失敗或跳過。
TestNG 支援以下測試狀態,可以透過在正確的位置呼叫函式來檢索。
org.testng.ITestResult | ||
---|---|---|
public static final int | FAILURE (失敗) | 2 |
public static final int | SKIP (跳過) | 3 |
public static final int | STARTED (已開始) | 16 |
public static final int | SUCCESS (成功) | 1 |
public static final int | SUCCESS_PERCENTAGE_FAILURE (成功率失敗) | 4 |
在這篇文章中,我們將使用ITestResult 依賴項來展示如何在 TestNG 中檢索測試的結果狀態。
假設使用者想要在執行後檢索測試方法的狀態。在這種情況下,程式碼將寫在 @AfterMethod 內以檢索測試方法狀態。
由於 @AfterMethod 在每次 @Test 方法之後執行,我們將顯示每個測試已執行的測試方法名稱的狀態。在這裡,我們將使用getStatus() 方法,它將返回一個整數,如上表所示。使用者應該使用這些狀態程式碼作為整數來實現字串。
解決此問題的方法/演算法:
步驟 1 - 建立一個名為NewTestngClass 的 TestNG 類並編寫@AfterMethod 方法。
步驟 2 - 在類中編寫 3 個不同的 @Test 方法,一個用於成功,一個用於失敗,一個用於跳過,如程式程式碼所示。
步驟 3 - 現在建立如下所示的 testNG.xml 來執行 TestNG 類。
步驟 4 - 執行 testNG.xml 或直接在 IDE 中執行 TestNG 類,或者使用命令列進行編譯和執行。
示例
使用以下程式碼作為通用的 TestNG 類“NewTestngClass”:
src/ NewTestngClass.java
import org.testng.ITestResult; import org.testng.SkipException; import org.testng.annotations.*; public class NewTestngClass { @Test() public void testcase1(){ System.out.println("TestCase 1 - Execution started"); assert true; } @Test() public void testcase2(){ System.out.println("TestCase 2 - Execution started"); assert false; } @Test() public void testcase3(){ System.out.println("TestCase 3 - Execution started"); throw new SkipException("Skipping the testcase 3"); } @AfterMethod() public void status(ITestResult result){ System.out.println("Status of execution is:"+result.getStatus()); try{ if(result.getStatus() == ITestResult.SUCCESS){ System.out.println("Test case execution status is SUCCESS"); } else if(result.getStatus() == ITestResult.FAILURE){ // Do something here System.out.println("Test case execution status is FAILURE"); } else if(result.getStatus() == ITestResult.SKIP ){ System.out.println("Test case execution status is SKIP"); } } catch(Exception e){ e.printStackTrace(); } } }
testNG.xml
這是一個用於組織和執行 TestNG 測試用例的配置檔案。當只需要執行有限的測試而不是完整的套件時,它非常方便。
<?xml version = "1.0" encoding = "UTF-8"?> <!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" > <suite name = "Suite1"> <test name = "test1"> <classes> <class name = "NewTestngClass"/> </classes> </test> </suite>
輸出
TestCase 1 - Execution started Status of execution is:1 Test case execution status is SUCCESS TestCase 2 - Execution started java.lang.AssertionError at NewTestngClass.testcase2(NewTestngClass.java:15) 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) Status of execution is:2 Test case execution status is FAILURE TestCase 3 - Execution started Test ignored. Status of execution is:3 Test case execution status is SKIP =============================================== Suite1 Total tests run: 3, Passes: 1, Failures: 1, Skips: 1 ===============================================