如何在 @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
===============================================

更新於:2022年3月9日

2K+ 次瀏覽

啟動您的 職業生涯

完成課程獲得認證

開始學習
廣告