TestNG 如何测试强制性异常
TestNG提供了一种跟踪代码异常处理的方式。用户可以测试代码是否抛出了预期的异常。这里使用expectedExceptions参数结合@Test注解。这个注解在负面/异常测试中非常有用。
根据TestNG文档:
“测试方法预期抛出的异常列表。如果没有抛出异常或抛出的异常与列表中的异常不同,则该测试将被标记为失败。”
在本文中,我们将看到如何在TestNG中实现expectedExceptions。
步骤
- 步骤1:在src中创建MessageUtil.java,该文件需要进行测试,并在printMessage()方法中添加错误条件,如程序代码中所示。
步骤2:在src中创建一个名为ExpectedExceptionTest.java的类,它是一个测试用例类,并将ArithmeticException作为预期异常添加到testPrintMessage()测试用例中。请按照下一节中的程序代码编写。
- 步骤3:现在,在IDE中创建并运行testNG.xml文件,或直接运行testNG类,或使用命令行进行编译和运行。
-
在输出中,用户可以看到测试通过,特别是testPrintMessage()测试。这个测试调用messageUtil.printMessage(); 并且prineMessage()函数会抛出Airthmatic异常,因为它有一个将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;Output将无法通过,并且会失败,如Output 2所示。原因是@Test−testPrintMessage()期望抛出算术异常,但它并没有抛出任何异常。
输出
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
===============================================