代码质量提升
- 单元测试
- 代码质量保证插件:CheckStyle/Jacoco/Spotbugs
- GitHub CI Workflow
单元测试
为啥要单元测试
- 节省测试时间
- 防止回归
- 提高代码质量
- 保证行为正确性
好的单元测试
- 快速:对成熟项目进行数千次单元测试,这很常见。应花非常少的时间来运行单元测试
- 独立:单元测试是独立的,可以单独运行,并且不依赖文件系统或数据库等任何外部因素
- 可重复:运行单元测试的结果应该保持一致,也就是说,如果在运行期间不更改任何内容,总是返回相同的结果
- 自检查:测试应该能够在没有任何人工交互的情况下,自动检测是否测试通过
关于测试用例命名
理想情况下,测试的名称应包括三个部分:
- 要测试的方法的名称
- 测试的方案
- 调用方案时的预期行为
我们至少要确保前两条
testGetUserInfoByUserIdWithInvalidUserIdThrowXXException() testGetUserInfoByUserIdWithInvalidUserId()
AAA(Arrange, Act, Assert) pattern
- Arrange-Act-Assert 是单元测试时的常见模式
- 包含三个主要操作:
- Arrange:安排好所有先要条件和输入,根据需要进行创建和设置
- Act:对要测试的对象或方法进行调用
- Assert:断言结果是否按预期进行
编写单元测试
引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
Mockito
- 地址: site.mockito.org/
- 文档地址:javadoc.io/doc/org.moc…
四大步骤
- 目的:在测试中模拟对象,用来代替真实依赖项,使测试专注于目标代码而不受外部环境影响
- 手段:为模拟对象预设特定行为(Stubbing),控制模拟对象在特定情况下的响应
- 创建模拟对象: 使用Mockito创建模拟对象来代替真实的依赖
- 设定预期行为: 设置模拟对象在某些调用下的预期反应(如返回特定值)
- 在测试中使用模拟对象: 测试中使用这些模拟对象并观察反应
- 验证结果: 检查测试是否得到了预期的结果
代码质量保证插件
代码质量保证
- 确保软件产品的质量满足预定的标准和要求。它不仅关注代码本身的质量,还包括整个开发过程的质量管理
代码质量保证的重要性
- 提高软件可靠性: 高质量的代码可以减少软件中的错误和故障,提高软件的可靠性
- 增强可维护性: 良好的代码质量使得软件更容易维护和升级
- 提高开发效率: 通过减少错误和重复工作,可以提高开发效率
- 客户满意度: 高质量的软件能够更好地满足客户需求,提高客户满意度
代码质量的衡量标准
- 可读性: 代码应该易于阅读和理解
- 一致性: 代码遵循一定的编码标准和风格
- 复用性: 代码应设计得易于服用
- 可测试性: 代码易于进行单元测试和集成测试
- 效率: 代码应高效执行,无不必要的资源消耗
代码质量保证的实践
- 代码审查 (Code Reviews):同行评审是提高代码质量的重要手段。通过审查,可以发现并修正代码中的错误,同时分享知识和经验
- 编码标准 :制定并遵循一套编码标准和约定,如命名规范、代码结构、注释规范等
- 自动化测试 :编写和执行单元测试、集成测试等,确保代码的功能和性能符合要求
- 持续集成 (Continuous Integration,CI):通过自动化构建和测试,持续集成可以及时发现和修复问题
- 静态代码分析 :使用工具进行静态代码分析,以识别潜在的代码缺陷和不良实践
- 性能分析 :监控代码在运行时的性能,确保其效率和响应速度
- 重构 :定期对代码进行重构,提高代码的质量和可维护性
- 文档和注释 :维护良好的最新的文档,帮助团队理解和维护文档
Checkstyle 插件 - 代码风格插件
作为 Maven 插件引用
- 可以嵌入到项目声明周期,执行Maven阶段会自动执行代码风格和规范的检查
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-checkstyle-plugin</artifactId>
<version>3.3.1</version>
<configuration>
<configLocation>checkstyle.xml</configLocation>
<encoding>UTF-8</encoding>
<consoleOutput>true</consoleOutput>
<failsOnError>true</failsOnError>
<linkXRef>false</linkXRef>
</configuration>
<executions>
<execution>
<id>validate</id>
<phase>validate</phase>
<goals>
<goal>check</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
编写 checkstyle.xml
- 抄写 Sun 或 Google 的文件进行修改github.com/checkstyle/…
- 设置 Checkstyle 的错误为 warnings
可以将 Scan Scope 设置为不包括测试
- 设置 Code Style 的 Java ➡️ Scheme
JaCoCo (Java Code Coverage Library)
代码覆盖率分析工具(网址)
Maven 插件引入
<project>
<reporting>
<plugins>
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<reportSets>
<reportSet>
<reports>
<!-- select non-aggregate reports -->
<report>report</report>
</reports>
</reportSet>
</reportSets>
</plugin>
</plugins>
</reporting>
</project>
Maven 依赖引入
<dependency>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.8.11</version>
</dependency>