如何生成单元测试报告及覆盖率

408 阅读2分钟

maven 插件

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.21.0</version>
    <configuration>
        <includes>
           <!-- 配置测试报告的生成方式 -->
            <include>com/leelen/cloud/iss/healthCare/*/*Test.java</include>
        </includes>
        <argLine>-Dfile.encoding=UTF-8 ${jacocoArgLine}</argLine>
        <!-- 配置测试报告的生成方式 -->
        <reportsDirectory>${project.build.directory}/surefire-reports</reportsDirectory>
        <testFailureIgnore>true</testFailureIgnore>
        <testSourceDirectory>src/test/java</testSourceDirectory>
    </configuration>
</plugin>
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-report-plugin</artifactId>
    <version>2.21.0</version>
    <configuration>
        <outputDirectory>${project.build.directory}/surefire-reports</outputDirectory>
    </configuration>
</plugin>
<plugin>
    <groupId>org.jacoco</groupId>
    <artifactId>jacoco-maven-plugin</artifactId>
    <version>0.8.7</version>
    <configuration>
        <!-- 指定覆盖类 -->
        <includes>
            <include>**/service/**</include>
            <include>**/dao/**</include>

            <!--<include>**/dao/**</include>-->
        </includes>
    </configuration>
    <executions>
        <execution>
            <goals>
                <goal>prepare-agent</goal>
            </goals>
            <configuration>
                <propertyName>jacocoArgLine</propertyName>
            </configuration>
        </execution>
        <execution>
            <id>report</id>
            <phase>test</phase>
            <goals>
                <goal>report</goal>
            </goals>
        </execution>
    </executions>
</plugin>

报告生成

1688526169795.png

1.jpg

目录介绍

位于:target下surefire-reports

1688527953180.png

覆盖率

单元测试覆盖率是一个度量,用于描述我们的单元测试覆盖了多少代码。它通常用百分比来表示。覆盖率越高,意味着我们的测试覆盖了更多的代码,从而更有可能发现代码中的错误。

  • 点击maven栏的的test,前提是要有单元测试

image.png

  • 打开目录下的index文件,即可查看覆盖率

image.png

  • 点击进入某个文件即可看到覆盖的内容

image.png

案例

service类(想要覆盖的类)


import java.util.List;

import javax.annotation.Resource;

import org.springframework.stereotype.Service;

import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.leelen.cloud.dto.page.PagenationDataDTO;
import com.leelen.cloud.exception.BusinessException;
import com.leelen.cloud.iss.common.ResultCodeConstant;
import com.leelen.cloud.iss.module.subscribe.dao.RuleDao;
import com.leelen.cloud.iss.module.subscribe.dao.RuleTemplateDao;
import com.leelen.cloud.iss.module.subscribe.model.entity.SubscribeTemplate;
import com.leelen.cloud.iss.module.subscribe.model.req.RuleTemplateAddReq;
import com.leelen.cloud.iss.module.subscribe.model.req.RuleTemplateGetReq;
import com.leelen.cloud.iss.module.subscribe.service.RuleTemplateService;

import lombok.extern.slf4j.Slf4j;

/**
 *
 */
@Slf4j
@Service
public class RuleTemplateServiceImpl implements RuleTemplateService {

   @Resource
   private RuleTemplateDao ruleTemplateDao;

   @Resource
   private RuleDao ruleDao;

   @Override
   public SubscribeTemplate getByType(Integer ruleType) {
      return ruleTemplateDao.getByType(ruleType);
   }

   @Override
   public Boolean addRuleTemplate(RuleTemplateAddReq params) {
      SubscribeTemplate ruleTemplate = new SubscribeTemplate();
      ruleTemplate.setType(params.getType());
      ruleTemplate.setFormat(JSONObject.toJSONString(params.getFormat()));
      ruleTemplate.setDescription(params.getDescription());
      ruleTemplate.setTypeEventField(params.getTypeEventField());
      return ruleTemplateDao.save(ruleTemplate);
   }

   @Override
   public Boolean removeRuleTemplate(Long id) {
      SubscribeTemplate subscribeTemplate = ruleTemplateDao.getById(id);
      Long isExist = ruleDao.countByType(subscribeTemplate.getType());
      if (isExist > 0) {
         log.error("模板下有对应规则,模板不可删除,模板Id{}", id);
         throw new BusinessException(ResultCodeConstant.BUSINESS_9997);
      }
      return ruleTemplateDao.removeById(id);
   }

   @Override
   public PagenationDataDTO<SubscribeTemplate> getRuleTemplate(RuleTemplateGetReq params) {
      Page<SubscribeTemplate> page = ruleTemplateDao.page(new Page<>(params.getCurrent(), params.getSize()));
      PagenationDataDTO<SubscribeTemplate> pagenationDataDTO = new PagenationDataDTO<>();
      pagenationDataDTO.setList(page.getRecords());
      pagenationDataDTO.setPageNum((int) page.getCurrent());
      pagenationDataDTO.setPageSize((int) page.getSize());
      pagenationDataDTO.setTotalPage((int) page.getPages());
      pagenationDataDTO.setTotalSize((int) page.getTotal());
      return pagenationDataDTO;

   }

   @Override
   public List<SubscribeTemplate> allRuleTemplate() {
      return ruleTemplateDao.list();
   }
}

单元测试类


import com.google.common.collect.Lists;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.leelen.cloud.dto.page.PagenationDataDTO;
import com.leelen.cloud.exception.BusinessException;
import com.leelen.cloud.iss.module.subscribe.dao.RuleDao;
import com.leelen.cloud.iss.module.subscribe.dao.RuleTemplateDao;
import com.leelen.cloud.iss.module.subscribe.model.entity.SubscribeTemplate;
import com.leelen.cloud.iss.module.subscribe.model.req.RuleTemplateAddReq;
import com.leelen.cloud.iss.module.subscribe.model.req.RuleTemplateGetReq;
import com.leelen.cloud.iss.module.subscribe.service.impl.RuleTemplateServiceImpl;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

/**
 * @author linqy
 * @version 1.0.0
 * @ClassName RuleTemplateServiceImplTest.java
 * @Description
 * @createTime 2023年10月30日 09:49:00
 */
@SpringBootTest
@RunWith(SpringRunner.class)
@AutoConfigureMockMvc
public class RuleTemplateServiceImplTest {

    @InjectMocks
    private RuleTemplateServiceImpl ruleTemplateService;
    @Mock
    private RuleTemplateDao ruleTemplateDao;

    @Mock
    private RuleDao ruleDao;
    @Test
    public void  addRuleTemplateTest(){
        RuleTemplateAddReq params=new RuleTemplateAddReq();
        params.setType(0);
        params.setFormat(new Object());
        params.setDescription("1111");
        params.setTypeEventField("112");
        Boolean aBoolean = ruleTemplateService.addRuleTemplate(params);
        Assert.assertTrue("测试不通过",aBoolean==false);
    }
    @Test(expected = BusinessException.class)
    public  void removeRuleTemplateTest(){
        SubscribeTemplate subscribeTemplate=new SubscribeTemplate();
        subscribeTemplate.setType(1);
        Mockito.when(ruleTemplateDao.getById(Mockito.anyLong())).thenReturn(subscribeTemplate);

        Mockito.when(ruleDao.countByType(subscribeTemplate.getType())).thenReturn(1L);
        Boolean aBoolean = ruleTemplateService.removeRuleTemplate(1L);
        Assert.assertTrue("测试不通过",aBoolean==false);
    }

    @Test
    public  void  getRuleTemplateTest(){
        RuleTemplateGetReq params=new RuleTemplateGetReq();
        params.setCurrent(1L);
        params.setSize(10L);
        Page<SubscribeTemplate> page =new Page<>();
        page.setRecords(Lists.newArrayList());
        page.setTotal(1L);
        page.setSize(1L);
        page.setCurrent(1L);
        page.setSearchCount(false);
        page.setOptimizeCountSql(false);
        page.setOrders(Lists.newArrayList());
        page.setOptimizeJoinOfCountSql(false);
        page.setCountId("");
        page.setMaxLimit(0L);
        Mockito.when( ruleTemplateDao.page(Mockito.any())).thenReturn(page);
        PagenationDataDTO<SubscribeTemplate> ruleTemplate = ruleTemplateService.getRuleTemplate(params);
        Assert.assertTrue("测试不通过",ruleTemplate.getTotalPage()==1);

    }
}
  • 结果

image.png

image.png