TestNG异常– ExpectedExceptions,ExpectedExceptionsMessageRegExp

时间:2020-02-23 14:41:56  来源:igfitidea点击:

有时我们想测试我们的方法是否有异常。
TestNG允许我们使用@Test批注的expectedExceptionsexpectedExceptionsMessageRegExp参数执行异常测试。

TestNG ExpectedExceptions

假设我们有一个简单的实用方法,可以将两个数相除。

package com.theitroad.exceptions;

public class MathUtils {

	public int divide(int x, int y) {
		return x/y;
	}
}

我们知道,如果我们尝试将数字除以0,则会抛出java.lang.ArithmeticException,且消息为/by zero。

让我们编写一个TestNG Test类来测试这种异常情况。

package com.theitroad.exceptions;

import org.testng.annotations.Test;

import static org.testng.Assert.assertEquals;

import org.testng.annotations.DataProvider;

public class MathUtilsTest {
	@Test(dataProvider = "dp", expectedExceptions = {ArithmeticException.class })
	public void f(Integer x, Integer y) {
		MathUtils mu = new MathUtils();
		assertEquals(mu.divide(x, y), x/y);
	}

	@DataProvider
	public Object[][] dp() {
		return new Object[][] { new Object[] { 4, 0 } };
	}
}

当我们执行上面的测试类时,我们得到以下输出。

[RemoteTestNG] detected TestNG version 6.14.3
PASSED: f(4, 0)

如果我们从@Test批注中删除expectedExceptions属性,那么我们的测试用例将失败,并显示以下消息。

[RemoteTestNG] detected TestNG version 6.14.3
FAILED: f(4, 0)
java.lang.ArithmeticException:/by zero
	at com.theitroad.exceptions.MathUtils.divide(MathUtils.java:6)
	at com.theitroad.exceptions.MathUtilsTest.f(MathUtilsTest.java:13)

expectedExceptions将值作为类数组,因此低于value也可以正常工作。

expectedExceptions = {ArithmeticException.class, NullPointerException.class }

TestNG测试ExpectedExceptionsMessageRegExp

我们也可以扩展测试方法以查找异常消息。
测试注释expectedExceptionsMessageRegExp使用正则表达式。
让我们来看一些如何使用它的示例。

@Test(dataProvider = "dp", expectedExceptions= {ArithmeticException.class},
 expectedExceptionsMessageRegExp="/by zero")
public void f(Integer x, Integer y) {
	  MathUtils mu = new MathUtils();
	  assertEquals(mu.divide(x, y), x/y);
}

仅当抛出ArithmeticException且确切消息为"/by zero"时,上述测试方法才能通过。

[RemoteTestNG] detected TestNG version 6.14.3
PASSED: f(4, 0)

让我们更改消息,以使我们的测试失败。

@Test(dataProvider = "dp", expectedExceptions= {ArithmeticException.class}, 
 expectedExceptionsMessageRegExp="by zero")
public void f(Integer x, Integer y) {
	MathUtils mu = new MathUtils();
	assertEquals(mu.divide(x, y), x/y);
}

我们的测试将失败,并显示以下控制台输出。

[RemoteTestNG] detected TestNG version 6.14.3
FAILED: f(4, 0)
org.testng.TestException: 
The exception was thrown with the wrong message: expected "by zero" but got "/by zero"
	at org.testng.internal.ExpectedExceptionsHolder.wrongException(ExpectedExceptionsHolder.java:71)

让我们看看在不确定确切的异常消息时如何使用常规异常。

@Test(dataProvider = "dp", expectedExceptions= {ArithmeticException.class},
 expectedExceptionsMessageRegExp=".* by zero*.")
public void f(Integer x, Integer y) {
	MathUtils mu = new MathUtils();
	assertEquals(mu.divide(x, y), x/y);
}

该测试将通过,因为我们提供的正则表达式将与抛出的异常消息匹配。