TestNG异常– ExpectedExceptions,ExpectedExceptionsMessageRegExp
时间:2020-02-23 14:41:56 来源:igfitidea点击:
有时我们想测试我们的方法是否有异常。
TestNG允许我们使用@Test批注的expectedExceptions
和expectedExceptionsMessageRegExp
参数执行异常测试。
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); }
该测试将通过,因为我们提供的正则表达式将与抛出的异常消息匹配。