TestNG 如何测试强制性异常

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
===============================================

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程

TestNG 精选笔记