jacoco+maven+sonar+springboot单元测试代码覆盖率统计如题,你能看到本⽂,说明你应该对本⽂涉及的框架和组件已经初步了解。
总的来说,本⽂所述集成⽅案是对代码的单元测试⽤例执⾏覆盖率进⾏检测统计,主要是⽤来对开发⼈员单元测试⽤例编写程度的⼀种检测。
其整体过程⼤概可以分为:
1、使⽤ jacoco 代理,在 maven 执⾏之前植⼊ jacoco 代理。
2、maven 对项⽬进⾏编译打包,并⾃动执⾏单元测试⽤例(如 junit)。
3、测试⽤例执⾏过程中,jacoco 代理会记录代码执⾏的所有⾏信息,⽣成记录⽂件 ()。
4、使⽤ jacoco 命令将记录的代码执⾏情况⽂件转换⽣成为 jacoco 报表 (target/site/jacoco/index.html)。
5、使⽤ sonar 命令,将代码覆盖率报表推送到 sonarqube 平台中。
6、登录 sonarqube 查看代码覆盖率统计报告(也可以本地访问 jacoco/index.html 直接查看报告)。
本⽂所涉组件和框架版本信息如下:
1、springboot(2.1.8.RELEASE)
2、sonarqube(docker 版 sonarqube:7.9.1-community)
3、maven(3.6.1)
4、jacoco(springboot 框架内已⾃带,⽆需增加配置)
随着各种版本不断升级,未来版本使⽤⽅法可能有异,如上版本实践正常。
因为撰写本⽂时,springboot 已为主流技术栈,所以本⽂不陈述 springmvc 等其他框架的操作⽅法,理论上来说 springmvc 可能需要在 l ⽂件中新增 jacoco 插件配置,其他⽅⾯应该和本⽂没有区别。
下⾯陈述⼀下整体操作步骤
1、 ⼀个标准的 springboot ⼯程,代码和 pom ⽂件都是标准的,没有任何特殊配置和依赖引⽤。
2、 在 springboot ⼯程中,随便写⼏个 Service Controller 测试⽅法。
随便写⼏个 Service Controller 测试⽅法,没有任何特殊要求,随便写,此处省去代码。
3、 在 springboot ⼯程中,编写测试⽤例,本⽂使⽤ springboot ⾃带的 junit ,如下代码⽰例:
import static st.sult.MockMvcResultMatchers.jsonPath;
import java.io.UnsupportedEncodingException;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.st.context.SpringBootTest;
import org.springframework.http.MediaType;
import st.context.junit4.SpringRunner;
import st.context.web.WebAppConfiguration;
import st.web.servlet.MockMvc;
import st.quest.MockMvcRequestBuilders;
import st.sult.MockMvcResultHandlers;
import st.sult.MockMvcResultMatchers;
import st.web.servlet.setup.MockMvcBuilders;
import ansaction.annotation.Transactional;
import org.t.WebApplicationContext;
@RunWith(SpringRunner.class)
@SpringBootTest(classes = StartApplication.class)
//测试环境使⽤,⽤来表⽰测试环境使⽤的ApplicationContext将是WebApplicationContext类型的
@WebAppConfiguration
public class ExampleTests {
private static final Logger LOG = Logger(ExampleTests.class);
@Autowired
private WebApplicationContext context;
private MockMvc mockMvc;
@Autowired
private ExampleValidatorService exampleValidatorService;
@Before
public void setUp() {
mockMvc = MockMvcBuilders.webAppContextSetup(context).build();// 建议使⽤这种
}
/**
* 测试 Controller 接⼝
* @throws UnsupportedEncodingException
* @throws Exception
*/
@Test
public void testController() throws UnsupportedEncodingException, Exception {
String responseString = mockMvc.("/example/test1") // 请求的url,请求的⽅法是get
.contentType(MediaType.APPLICATION_JSON_UTF8) // 数据的格式
.accept(MediaType.APPLICATION_JSON_UTF8)).andExpect(MockMvcResultMatchers.status().isOk()) // 返回的状态是200    .andDo(MockMvcResultHandlers.print()) // 打印出请求和相应的内容
.andExpect(jsonPath("$.code").value("1"))
.andExpect(jsonPath("$.data").value("单红宇 CSDN catoop"))
.andReturn().getResponse().getContentAsString(); // 将相应的数据转换为字符
LOG.info(responseString);
}
@Test
@Transactional // 会⾃动回滚,不污染数据库
public void testService() {
String age = "22";
String result = exampleValidatorService.show("22");
Assert.assertEquals(age, result);
}
}
4、 使⽤命令进⾏ maven 编译构建(注意不是使⽤ IDE ⾃带功能),确保执⾏结果为 BUILD SUCCESS
# 构建命令如下(执⾏该命令会⾃动启动服务执⾏测试⽤例)
mvn clean package
5、 配置本地 maven 配置⽂件 l,新增如下⽚段内容
<pluginGroups>
<!-- SonarQube 插件 -->
<pluginGroup>org.sonarsource.scanner.maven</pluginGroup>
</pluginGroups>
<profiles>
<!-- SonarQube 插件 -->
<profile>
<id>sonar</id>
<activation>
spring mvc和boot区别
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<!-- Optional URL to server. Default value is localhost:9000 -->
<sonar.host.url>
192.168.10.88:9000
</sonar.host.url>
</properties>
</profile>
</profiles>
6、 执⾏如下编译构建⽣成报告推送 sonar 命令
# 该命令所经历阶段顺序:清理、设置jacoco代理、打包、执⾏测试⽤例、⽣成jacoco报告、推送报告到sonarqube
mvn clean org.jacoco:jacoco-maven-plugin:prepare-agent package org.jacoco:jacoco-maven-plugin:report sonar:sonar
待该命令执⾏完毕并且 BUILD SUCCESS 后,可以在项⽬的 target ⽬录下正常看到⽂件 和⽬录 site\jacoco
7、 你可以⽤浏览器打开 jacoco\index.html ⽂件直接查看报告,也可以打开 sonarqube 去查看报告(前提条件是你 sonarqube 中jacoco 的相关插件都已经安装)。
PS:如果你不需要将结果推送到 sonar 查看,去掉 mvn 命令最后的 sonar:sonar 即可,本地报告查看也是很清晰⽅便的,我之所以这么做,是因为 sonar 上⾯还有其他很多检测的东西,给开发者查看⽐较⽅便,毕竟本地报告只是在⾃⼰电脑上。
⾄此完成,如下是⼀些相关截图:
(END)