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