如何在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 次浏览

启动您的 职业生涯

通过完成课程获得认证

开始
广告