前言:
已经好久木有写博客了,前段时间比较忙,只是保留了博客内容。2月份接近年假了,部门的任务相对不是那么重了,所以可以腾出时间来将平常的记录汇总上来。
正文:
1、单元测试如何测异常分支
单元测试对于异常分支的测试主要有以下三种方法:
1.1、Try/catch with assert/fail
在JUnit4之前的版本中,使用try/catch语句块检查异常。尽管这种方式很老了,不过还是非常有效的。主要的缺点就是很容易忘记在catch语句块之后需要写fail()方法,如果预期异常没有抛出就会导致信息的误报:
@Test
public void canVote_throws_IllegalArgumentException_for_zero_age() {
Student student = new Student();
try {
student.canVote(0);
} catch (IllegalArgumentException ex) {
assertThat(ex.getMessage(), containsString("age should be +ve"));
}
fail("expected IllegalArgumentException for non +ve age");
}
1.2、@Test(expected…)
@Test注解有一个可选的参数,"expected"允许你设置一个Throwable的子类。如果你想要验证canVote()方法抛出预期的异常,我们可以这样写:
@Test(expected = IllegalArgumentException.class)
public void canVote_throws_IllegalArgumentException_for_zero_age() {
Student student = new Student();
student.canVote(0);
}
1.3、ExpectedException
如果要使用JUnit框架中的ExpectedException类,需要声明ExpectedException异常。然后你可以使用更加简单的方式验证预期的异常。
eg:以下面这个方法为例,传入两个Long和Map<String, String>类型的参数
public SegmentQuotationVersion createSegmentQuotation(Long segmentDefinitionId, Map<String, String> dimensionValueMap);
异常分支是“段配置ID为空”:
private SegmentDefinition checkSegmentDefinition(Long segmentDefinitionId) {
// 段配置ID为空
if(null == segmentDefinitionId){
throw ServiceExceptionHelper.build(EnumError.QUOTE_SEGMENT_DEFINITION_ID_NULL);
}
}
第二种方式的测试方法如下:
@Rule
public ExpectedException thrown = ExpectedException.none();
/**
* 测试创建一个段报价方法 -- 传入空的段配置id
*/
@DatabaseSetup("SegmentQuotationServiceTest_Init.xml")
@Test
public void testCreateSegmentQuotation_nullSegDefId() {
thrown.expect(ServiceExceptionTestHelper.build(EnumError.QUOTE_SEGMENT_DEFINITION_ID_NULL));
segmentQuotationService.createSegmentQuotation(null, buildDimensionValueMap());
}
2、wiki中问题及其处理方式(此博客随时更新)
2.1、由于windows系统不识别大小写,linux系统识别大小写,所以如果xml文件在本地没有大小写区分,那么在本地跑单元测试没有问题,但是在jenkins服务器(linux系统)上跑单元测试会报错。
2.2、单元测试类名一定要符合 *Test.java, 否则maven-surefire-plugin 不会生成测试结果文件,导致jacoco-maven-plugin 单元测试统计报表中提示相关的代码没有单元测试覆盖。
eg:单元测试类名命名为QuotationValidatorTest1和QuotationValidatorTest2,则在jenkins上构建之后maven-surefire-plugin 不会生成这两个类的测试结果文件:
改了文件名之后,会生成这两个类的测试结果文件:
2.3、单元测试在jenkins上如何扫描某个类或者不扫描某个类?
在jenkins的配置中配置如下:
注意:这里的文件是.class文件而不是.java文件,因为eclipse中的.java文件需要编译成.class文件,服务器虚拟机方可识别并运行,否则虚拟机识别不到的话会达不到效果。
参考链接:
1、使用JUnit测试预期异常:
http://blog.csdn.net/tayanxunhua/article/details/20570457
2、JUnit使用ExpectedException进行异常测试:
http://blog.csdn.net/z69183787/article/details/50442431