SpringBoot配置Jacoco生成测试覆盖率报告(包括Powermock、Mockito用例)

最近项目中由于与前端在联调过程中发现接口不通,导致联调阶段浪费很多时间,造成接口不通的主要原因是代码逻辑不通,所以我向项目组建议引入Jacoco工具来对工程代码生成测试覆盖率报告,这样就不会出现“前端问接口到底测试没测试,后端说我测试了啊”的这种情况了,特此记录便于日后查阅。

1、maven依赖

首先在项目中引入maven依赖,以下的依赖放到项目的根pom.xml就可以了,代码如下:


    org.springframework.boot
    spring-boot-starter-test
    test


    junit
    junit
    test


    org.powermock
    powermock-module-junit4
    2.0.2
    test


    org.powermock
    powermock-api-mockito2
    2.0.2
    test


    org.springframework.boot
    spring-boot-test
    2.0.3.RELEASE
    test

    org.apache.maven.plugins
    maven-compiler-plugin
    
        1.8
        1.8
    


    org.jacoco
    jacoco-maven-plugin
    0.7.9
    
        
            pre-unit-test
            
                prepare-agent
            
            
                surefireArgLine
            
        
        
            post-unit-test
            test
            
                report
            
            
                ${basedir}/target/jacoco.exec
                ${basedir}/target/site/jacoco
            
        
    


    org.apache.maven.plugins
    maven-surefire-plugin
    2.9
    
        
        ${surefireArgLine}
        false
        
            **/*Test.java
        
    

2、测试用例

我们需要编写测试覆盖率用例来生成报告,这里有一个非常重要的地方要注意,我的用例存放的结构必须是在/test/java/目录下,目录结构如下:

  SpringBoot配置Jacoco生成测试覆盖率报告(包括Powermock、Mockito用例)_第1张图片

代码如下:

package com.openailab.oascloud.file.service;

import com.github.pagehelper.PageInfo;
import com.google.common.collect.Lists;
import com.openailab.oascloud.common.model.dfm.ResourceBO;
import com.openailab.oascloud.common.model.dfm.ResourceStatisticBO;
import com.openailab.oascloud.common.model.dfm.vo.ResourceVO;
import com.openailab.oascloud.file.common.config.BootstrapConfig;
import com.openailab.oascloud.file.dao.FileDao;
import com.openailab.oascloud.file.service.impl.FileServiceImpl;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import java.util.List;
import java.util.Optional;

import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.when;

/**
 * @description: 数据文件管理-service
 * @author: zhangzhixiang
 * @createDate: 2019/12/9
 * @version: 1.0
 */
@RunWith(SpringRunner.class)
public class FileServiceImplTest {

    @Mock
    private FileDao fileDao;
    @Mock
    private BootstrapConfig bootstrapConfig;
    @InjectMocks
    private FileServiceImpl fileService;

    @Before
    public void setUp() {
        when(fileDao.queryResourceList(any(ResourceBO.class))).thenReturn(getResourcePageBO());
        when(bootstrapConfig.getFileRoot()).thenReturn("/usr/local/oas");
    }

    @Test
    public void queryResourceByCondition() {
        //case01
        ResourceVO resourceVO = new ResourceVO();
        resourceVO.setResourceId(1);
        List resourceBOList1 = fileService.queryResourceByCondition(resourceVO);
        Assert.assertEquals(Integer.valueOf(1), resourceBOList1.get(0).getId());
        //case02
//        List resourceBOList2 = fileService.queryResourceByCondition(any(ResourceVO.class));
//        Assert.assertEquals(Integer.valueOf(1), resourceBOList2.get(0).getId());
    }

    @Test
    public void resourceStatistic() throws Exception {
        //case01
        String parentDir = "/file";
        List resourceStatisticBOList = fileService.resourceStatistic(parentDir);
        boolean ret = Optional.ofNullable(resourceStatisticBOList).isPresent();
        Assert.assertEquals(true, ret);
    }

    @Test
    public void replaceFileContent() {
        //case01
        Boolean ret2 = fileService.replaceFileContent(getResourceVO());
        Assert.assertEquals(true, ret2);
    }

    /**
     * 伪造resroucePageBO
     *
     * @param
     * @return com.github.pagehelper.PageInfo
     * @author zxzhang
     * @date 2020/4/14
     */
    private PageInfo getResourcePageBO() {
        PageInfo pageInfo = new PageInfo<>();
        List resourceBOList = Lists.newArrayList();
        ResourceBO resourceBO1 = new ResourceBO();
        resourceBO1.setId(1);
        resourceBO1.setFileName("xxx");
        resourceBOList.add(resourceBO1);
        ResourceBO resourceBO2 = new ResourceBO();
        resourceBO2.setId(2);
        resourceBO2.setFileName("mmm");
        resourceBOList.add(resourceBO2);
        pageInfo.setList(resourceBOList);
        return pageInfo;
    }

    /**
     * 伪造resrouceVO
     *
     * @param
     * @return com.openailab.oascloud.common.model.dfm.vo.ResourceVO
     * @author zxzhang
     * @date 2020/4/14
     */
    private ResourceVO getResourceVO() {
        ResourceVO resourceVO = new ResourceVO();
        resourceVO.setResourceId(1);
        resourceVO.setFileName("xxx");
        return resourceVO;
    }
}

3、生成报告

通过以下maven命令生成测试覆盖率报告,代码如下:

    mvn clean test -Dmaven.test.failure.ignore=true

生成的报告目录结构如下:

  SpringBoot配置Jacoco生成测试覆盖率报告(包括Powermock、Mockito用例)_第2张图片

打开 /target/site/jacoco/index.html 查看覆盖率报告,图示如下:

SpringBoot配置Jacoco生成测试覆盖率报告(包括Powermock、Mockito用例)_第3张图片

SpringBoot配置Jacoco生成测试覆盖率报告(包括Powermock、Mockito用例)_第4张图片

SpringBoot配置Jacoco生成测试覆盖率报告(包括Powermock、Mockito用例)_第5张图片

绿色的部分是测试用例覆盖到的代码,红色的部分是测试用例未覆盖到的代码。 

你可能感兴趣的:(SpringBoot,Jacoco)