如何在TestNG中測試強制異常?


TestNG 提供了一個跟蹤程式碼異常處理的選項。使用者可以測試程式碼是否丟擲了所需的異常。這裡,`expectedExceptions` 引數與 `@Test` 註解一起使用。此註解在負面/異常測試中非常有用。

根據 TestNG 文件

“測試方法預期丟擲的異常列表。如果未丟擲異常或丟擲的異常與列表中的異常不同,則此測試將被標記為失敗。”

在本文中,我們將瞭解如何在 TestNG 中實現 `expectedExceptions`。

解決此問題的方法/演算法

  • 步驟 1:在 `src` 中建立 **MessageUtil.java**,這是需要測試的,並在 `printMessage()` 方法中新增一個錯誤條件,如程式程式碼所示。

    步驟 2:在 `src` 中建立一個類 **ExpectedExceptionTest.java**,這是一個測試用例類,並將預期的異常 `ArithmeticException` 新增到 `testPrintMessage()` 測試用例中。請按照下一節中編寫的程式程式碼操作。

  • 步驟 3:現在,建立並執行 testng.xml 或直接在 IDE 中執行 TestNG 類,或者使用命令列編譯並執行它。

  • 在輸出中,使用者可以看到測試已透過,特別是 `testPrintMessage()`。此測試呼叫 `messageUtil.printMessage()`;`prineMessage()` 函式丟擲算術異常,因為它有一步是計算 1/0;

  • 如果使用者刪除/註釋掉程式碼 `int b=1/a;`,輸出將不會透過,並且會失敗,如輸出 2 所示。

示例

以下程式碼用於通用的 TestNG 類 - **MessageUtil**

src/ MessageUtil.java

public class MessageUtil {

    private String message;

    //Constructor
    //@param message to be printed
    public MessageUtil(String message) {
        this.message = message;
    }

    // prints the message
    public void printMessage() {
        System.out.println(message);
        int a =0;
        int b = 1/a;
    }

    // add "Hi!" to the message
    public String salutationMessage() {
        message = "Hello " + message;
        System.out.println(message);
        return message;
    }
} 

以下程式碼用於通用的 TestNG 類 - **ExpectedExceptionTest**

src/ ExpectedExceptionTest.java

import org.testng.Assert;
import org.testng.annotations.Test;

public class ExpectedExceptionTest {
   String message = "ExpectedException";
    MessageUtil messageUtil = new MessageUtil(message);

    @Test(expectedExceptions = ArithmeticException.class)
    public void testPrintMessage() {
        System.out.println("Inside testPrintMessage()");
        messageUtil.printMessage();
    }

    @Test
    public void testSalutationMessage() {
        System.out.println("Inside testSalutationMessage()");
        message = "Hello " + "ExpectedException";
        Assert.assertEquals(message,messageUtil.salutationMessage());
    }
} 

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 = "ExpectedExceptionTest"/>
        </classes>
    </test>
</suite>

輸出

Inside testPrintMessage()
ExpectedException
Inside testSalutationMessage()
Hello ExpectedException

===============================================
Suite1
Total tests run: 2, Passes: 2, Failures: 0, Skips: 0
=============================================== 

如果使用者從 `messageUtil.printMessage()` 函式中刪除/註釋掉程式碼 `int b=1/a`;輸出將不會透過,並且會失敗,如輸出 2 所示。原因是 `@Test` - `testPrintMessage()` 期望丟擲 `ArithmeticException`,但它沒有丟擲任何異常。

輸出

Inside testPrintMessage()
ExpectedException

org.testng.TestException: 
Method ExpectedException.testPrintMessage()[pri:0, instance: ExpectedException@327471b5] should have thrown an exception of type class java.lang.ArithmeticException

	at org.testng.internal.ExpectedExceptionsHolder.noException(ExpectedExceptionsHolder.java:82)
	at org.testng.internal.TestInvoker.considerExceptions(TestInvoker.java:749)
	at org.testng.internal.TestInvoker.invokeMethod(TestInvoker.java:634)
	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)

Inside testSalutationMessage()
Hello ExpectedException

===============================================
Suite1
Total tests run: 2, Passes: 1, Failures: 1, Skips: 0
===============================================

更新於:2023年8月17日

158 次瀏覽

啟動您的 職業生涯

透過完成課程獲得認證

開始
廣告
© . All rights reserved.