最近在编写sonar测试用例,为了增加代码测试覆盖率。(SpringBoot项目)
大致记录下流程:
1.首先可以登录sonarqube,找到自己所在项目的代码,点击Coverage->Treemap,之后就可以具体查看代码中的那几行还没有被测试用例覆盖。(这是服务器上统计全局代码用的,提交代码后,每晚会更新一次代码覆盖率)
2.然后在本地打开项目,在src->test->java->com.xxx.xxx文件夹下,新建java文件,编写测试用例。(java代码)
3.例如,创建XXXControllerTest.java,在其中写:
@WebAppConfiguartion
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest
@ActiveProfiles("dev")//表示使用application-dev.yml
public class XXXControllerTest{
@Autowired
private XXXController xxxController;
@Test
@Transactional
@Rollback(value = true) //测试用例要记得回滚,不能真把数据改了
public void myTest(){
MockHttpServletRequest request = new MockHttpServletRequest();
request.setParameter("id","123");
request.setParameter("name","修改");
int i = xxxController.updateName(request);
//修改了1行,才算成功
assertTrue(i == 1);
}
}
4.编写完测试用例后,也可以用工具在本地生成代码覆盖率统计文件(而不用等公司sonar跑完后才知道结果),方法如下:
(1)pom.xml中配置插件plugin:
<plugins>
<plugn>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excutable>true</excutable>
<fork>true</fork>
</configuration>
</plugn>
<plugn>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.9</version>
<configuration>
<forkMode>once</forkMode>
<argLine>-Dfile.encoding=UTF-8 ${surefireArgLine}</argLine><!-- 解决读取测试数据时的中文乱码问题 -->
<skip>${skipTests}</skip><!-- 是否跳过测试用例执行。true-跳过,false-不跳过 -->
</configuration>
</plugn>
<plugn>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.7.8</version>
<configuration>
<destFile>${project.build.directory}/jacoco.exec</destFile>
<dataFile>${project.build.directory}/jacoco.exec</dataFile>
<output>file</output>
<append>true</append>
</configuration>
</plugn>
<executions>
<!-- 生成覆盖率统计文件 -->
<execution>
<id>pre-unit-test</id>
<goals>
<goal>prepare-agent</goal>
</goals>
<configuration>
<propertyName>surefireArgLine</propertyName>
</configuration>
</execution>
</executions>
</plugins>
●<argLine>标签中配置了${surefireArgLine},<execution>中的<propertyName>中配置了surefireArgLine。
●${skipTests}在pom.xml中的<properties>标签中配置了(代码片段中未体现)。<skipTests>true</skipTests>
●${project.build.directory}对应pom-4.0.0.xml,是默认配置。
(2)使用mvn执行命令,会在本地跑一次test中的所有测试用例,并生成相应文件供下一步使用。(这个步骤耗费的时间较长,本人的项目要1个小时)
mvn clean install -Dmaven.test.failure.ignore=true -DskipTests=false
●也可以进行下配置,只生成单个测试用例的代码覆盖率统计文件,修改pom.xml中的plugin即可,这样就不用耗费太多时间了,写了哪个测试用例生成哪个即可。如下:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<includes>
<include>**/*Tests.java</include>
<include>**/*Test.java</include>
</includes>
<excludes>
<exclude>**/Abstract*.java</exclude>
</excludes>
</configuration>
</plugin>
详情信息:https://www.cnblogs.com/jmcui/p/12843171.html
(3)使用mvn执行命令,生成覆盖率统计文件。(这个步骤耗时很短)
mvn org.jacoco:jacoco-maven-plugin:report
(4)找到生成的html文件,就能看代码覆盖率了。一般在这里:
项目路径/target/site/jacoco/index.html