如何在 TestNG 中獲取測試方法的當前狀態?
TestNG 支援原生依賴注入。它允許在方法中宣告額外的引數。在執行時,TestNG 會自動使用正確的值填充這些引數。以下是 TestNG 中的一些原生依賴項
ITestContext
XmlTest
Method
ITestResult
這些依賴項有助於檢索測試執行狀態。
通常,@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 依賴項來演示如何檢索測試狀態。
當用戶希望在執行後檢索測試方法的狀態時。在這種情況下,程式碼將寫入 @AfterMethod 中以檢索測試方法的狀態。
由於 @AfterMethod 在每次 @Test 方法之後執行,因此將列印已執行的測試方法名稱的狀態。在這裡,我們將使用 getStatus() 方法,它返回整數,如上表所示。使用者應該使用這些狀態程式碼作為整數來實現字串。
解決此問題的方法/演算法
步驟 1:建立一個 TestNG 類 - NewTestngClass 並編寫 @AfterMethod 方法。
步驟 2:在 @AfterMethod 中編寫以下程式碼。
步驟 3:在類 - NewTestngClass 中編寫 3 個不同的 @Test 方法。一個用於成功,一個用於失敗,一個用於跳過,如程式程式碼所示。
步驟 4:現在建立如下所示的 testNG.xml 來執行 TestNG 類。
步驟 5:現在,執行 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 ===============================================