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

前言:

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

猜你喜欢

转载自my.oschina.net/linxxbaobao/blog/1618054