在使用 TestNG 进行测试时,有些场景,我们通过向测试方法传入某些异常的参数,期望代码抛出异常时,我们可以通过 @Test( expectedExceptions, expectedExceptionsMessageRegExp)实现,并且可以实现异常信息的断言。
运行时异常与检查异常
Java中对于异常分为运行时异常与检查异常。
运行时异常,编译时不被检查的异常,不需要用throws 声明抛出 异常对象所属类,也可以不用throw 抛出异常对象或异常引用。对于调用该方法,也不需要放于 try-catch 代码块中。(避免程序代码错误被掩盖在运行中无法察觉)。
检查异常,编译时被检测的异常,一旦用throw 抛出异常,如果当前方法可处理异常,那么需要在该方法内通过 try-catch 处理异常。如果当前方法不具备该异常的处理能力,那么必须在参数列表后方法体 前使用 throws 声明异常所属类,交给方法的调用方处理 。
运行时异常测试(RuntimeException)
首先先创建一个自定义运行时异常类 CustomRuntimeException,如下:
package testng.base.demo;
public class CustomRuntimeException extends RuntimeException {
//无参构造方法
public CustomRuntimeException(){
super();
}
//含参的构造方法,指定异常的详细信息
public CustomRuntimeException(String message){
super(message);
}
// 含参的构造方法,指定异常的详细信息和原因
public CustomRuntimeException(String message, Throwable cause){
super(message,cause);
}
// 含参的构造方法,指定异常的原因
public CustomRuntimeException(Throwable cause) {
super(cause);
}
}
创建一个测试类:runtimeExceptionTest.jav ,其代码如下所示:
public class runtimeExceptionTest {
@Test
public void testExceptionDemo() {
throw new CustomException("TestNG custom RuntimeException.");
}
}
执行该测试用例,将抛出如下异常信息:
testng.base.demo.CustomException: TestNG custom RuntimeException.
at testng.base.demo.runtimeExceptionTest.testExceptionDemo(runtimeExceptionTest.java:7)
at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86)
at com.intellij.rt.testng.IDEARemoteTestNG.run(IDEARemoteTestNG.java:66)
at com.intellij.rt.testng.RemoteTestNGStarter.main(RemoteTestNGStarter.java:110)
我们期望结果就是抛出该异常信息,但此时用例执行失败了。与我们想要的期望在抛出异常时,用例执行成功的结果不一致,此时我们可以在 @Test注解中通过expectedExceptions参数实现,如下:
package testng.base.demo;
import org.testng.annotations.Test;
public class runtimeExceptionTest {
@Test(expectedExceptions = CustomRuntimeException.class)
public void testExceptionDemo() {
throw new CustomRuntimeException("TestNG custom RuntimeException.");
}
}
此时,执行测试用例时,执行结果是成功的,如下:
===============================================
Default Suite
Total tests run: 1, Failures: 0, Skips: 0
===============================================
我们还可以对抛出异常的信息进行判断,同样在@Test注解中通过expectedExceptionsMessageRegExp参数实现,如下:
package testng.base.demo;
import org.testng.annotations.Test;
public class runtimeExceptionTest {
@Test(expectedExceptions = CustomRuntimeException.class, expectedExceptionsMessageRegExp="TestNG custom RuntimeException.")
public void testExceptionDemo() {
throw new CustomRuntimeException("TestNG custom RuntimeException.");
}
}
当抛出的异常信息与expectedExceptionsMessageRegExp参数不一致时,用例将运行失败。 检查异常测试(Exception) 首先先创建一个自定义检查异常类 CustomException ,如下:
package testng.base.demo;
public class CustomException extends Exception {
//无参构造方法
public CustomException(){
super();
}
//有参的构造方法
public CustomException(String message){
super(message);
}
// 用指定的详细信息和原因构造一个新的异常
public CustomException(String message, Throwable cause){
super(message,cause);
}
//用指定原因构造一个新的异常
public CustomException(Throwable cause) {
super(cause);
}
}
当进行检查类异常测试时,只需要在测试方法的参数列表后方法体 前用 throws 声明异常所属类,代码如下:
package testng.base.demo;
import org.testng.annotations.Test;
public class exceptionTest {
@Test(expectedExceptions = CustomException.class, expectedExceptionsMessageRegExp="TestNG custom Exception.")
public void testExceptionDemo() throws CustomException {
throw new CustomException("TestNG custom Exception.");
}
}
技术行业,一定要提升技术功底,丰富自动化项目实战经验,这对于你未来几年职业规划,以及测试技术掌握的深度非常有帮助。
金九银十面试季,跳槽季,整理面试题已经成了我多年的习惯!下面有我近几年的收集和整理,整体是围绕着【软件测试】来进行整理的,主体内容包含:python自动化测试专属视频、Python自动化详细资料、全套面试题等知识内容。
对于软件测试的的朋友来说应该是最全面最完整的面试备战仓库,为了更好地整理每个模块,我也参考了很多网上的优质博文和项目,力求不漏掉每一个知识点,很多朋友靠着这些内容进行复习,拿到了BATJ等大厂的offer,这个仓库也已经帮助了很多的软件测试的学习者,希望也能帮助到你!
愿你我相遇,皆有所获! 欢迎关注微信公众号:【伤心的辣条】 免费领取一份216页软件测试工程师面试宝典文档资料。以及相对应的视频学习教程免费分享!