如何在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 ===============================================
資料結構
網路
關係資料庫管理系統 (RDBMS)
作業系統
Java
iOS
HTML
CSS
Android
Python
C語言程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP