第六讲---单元测试问题及处理

2018-02-05 10:51:23来源:oschina作者:linxx_201330340213人点击

分享

前言:


已经好久木有写博客了,前段时间比较忙,只是保留了博客内容。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类型的参数


public SegmentQuotationVersion createSegmentQuotation(Long segmentDefinitionId, Map 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

微信扫一扫

第七城市微信公众平台