java-sdk接口测试覆盖率统计实践
一、背景
接口覆盖率统计在Java SDK开发中具有重要的意义。它衡量了代码中接口被测试用例覆盖的程度,即测试用例对接口的执行情况进行了多少次验证。
接口覆盖率统计的意义包括:
-
质量保证:接口覆盖率统计可以帮助开发团队评估测试的全面性和质量,确保代码的正确性和稳定性。高覆盖率意味着更多的代码路径被测试覆盖,从而减少潜在的错误和缺陷。
-
代码可读性:接口覆盖率统计可以作为代码质量指标之一,鼓励开发人员编写可测试、可读性更高的代码。为了提高覆盖率,开发人员通常需要编写更全面的测试用例,这促使他们编写更模块化、可重用和可测试的代码。
-
重构支持:接口覆盖率统计还可以帮助开发人员确定哪些代码块需要重构。低覆盖率的接口可能意味着某些功能没有得到充分测试,从而增加了重构时引入错误的风险。
在实践中,可以使用各种工具和框架(如JUnit、Jacoco等)来进行接口覆盖率统计,并根据统计结果进行优化和改进测试策略。
二、实践步骤
1、梳理流水线步骤:1)下载待测代码 2)编译待测工程 3)下载测试代码 4)编译执行testng测试代码打jar包 5)执行jar包(执行自动化case)6)等待**分钟(因为执行服务中执行完case后hold住了进程,因此需要手动预估case执行完时间,人为设置等待时间-sleep **)6)jacoco接口测试统计 7)jacoco接口测试覆盖率统计 8)结束
2、执行容器里下载jacoco.jar
3、改动点梳理
(1)测试代码改动:
1)改造成用main函数驱动执行testcasepublic class MainTest {
private static Logger logger = LoggerFactory.getLogger(TestConfigUtil.getClassName());
public static void main(String[] args) {
//// System.out.println("Welcome to autoTest for JimKV JDK!");
logger.info("Welcome to autoTest for JimKV JDK!");
TestNG testNG = new TestNG();
testNG.setTestClasses(new Class[] {HDelTest.class,HGetAllTest.class,HIncrByTest.class});
testNG.setParallel(XmlSuite.ParallelMode.METHODS);
testNG.setThreadCount(1);
testNG.addListener(new TestNGWithMainClassDemoListener());
testNG.run();
// 启动本地服务,然后hold住本地服务
synchronized (MainTest.class) {
while (true) {
try {
MainTest.class.wait();
} catch (InterruptedException e) {
}
}
}
}
2)pom.xml的build部分改动:
<build>
<finalName>jimkv-test</finalName>
<resources>
<resource>
<directory>testNG</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.4</version>
<configuration>
<descriptor>src/main/assembly/assembly.xml</descriptor>
<archive>
<manifest>
<mainClass>MainTest</mainClass>
</manifest>
</archive>
</configuration>
<!--<configuration>
<appendAssemblyId>false</appendAssemblyId>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<manifest>
<mainClass>MainTest1</mainClass>
</manifest>
</archive>
</configuration>-->
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
<encoding>${project.build.sourceEncoding}</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.2</version>
<configuration>
<suiteXmlFiles>
<suiteXmlFile>${suiteXmlFile}</suiteXmlFile>
</suiteXmlFiles>
<systemPropertyVariables>
<masterAddress>${jimkv.test.masterAddress}</masterAddress>
<jimUrl>${jimkv.test.jimUrl}</jimUrl>
<testEnvironment>${jimkv.test.environment}</testEnvironment>
</systemPropertyVariables>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<executions>
<execution>
<id>attach-sources</id>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.7.1</version>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
3)在src/main下添加assembly

4) jvm.properties内容:
-Xms1024M -Xmx1024M -Xmn512K -server -XX:+PrintGCDetails -Xloggc:/export/Logs/jimkv-test/gc.log -Xss256K -XX:SurvivorRatio=8 -XX:+UseConcMarkSweepGC -XX:+UseCMSCompactAtFullCollection -XX:CMSInitiatingOccupancyFraction=70 -XX:+CMSParallelRemarkEnabled -XX:+PrintGCDateStamps -DIGNITE_LOG_DIR=/export/Logs/jimkv-test -DJM.LOG.PATH=/export/Logs/jst_home/jimkv-test -Dhttp.header.validate=false -Dio.netty.leakDetectionLevel=advanced -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/export/dump.hprof
<assembly> <id>assembly</id> <formats> <format>dir</format> <format>zip</format> </formats> <includeBaseDirectory>false</includeBaseDirectory> <fileSets> <!-- --> <fileSet> <directory>src/main/resources</directory> <outputDirectory>conf</outputDirectory> <filtered>true</filtered> <fileMode>0644</fileMode> </fileSet> <fileSet> <directory>src/main/assembly/bin</directory> <outputDirectory>bin</outputDirectory> <includes> <include>start.sh</include> <include>stop.sh</include> </includes> <fileMode>0755</fileMode> </fileSet> <fileSet> <directory>src/main/assembly/bin</directory> <outputDirectory>bin</outputDirectory> <includes> <include>jvm.properties</include> </includes> <filtered>true</filtered> <fileMode>0644</fileMode> </fileSet> </fileSets> <dependencySets> <dependencySet> <outputDirectory>lib</outputDirectory> </dependencySet> </dependencySets> </assembly>
java -javaagent:/export/servers/tools/jacoco-0.8.5/lib/jacocoagent.jar=includes=*,output=tcpserver,append=true,port=2014,address=127.0.0.1 -jar jimkv-test.jar &

三、遇到的问题/注意事项
1、统计出来的覆盖绿总是0%
排查步骤:1)用jacoco命令查看覆盖目录,然后手工与源码路径比对,确定是否能对上
在测试代码所在机器上执行jacoco命令查看覆盖目录:java -jar jacococli.jar dump --address 127.0.0.1 --port 2014 --destfile jacoco.exec

浙公网安备 33010602011771号