单元测试与代码质量保证

218 阅读4分钟

代码质量提升

  • 单元测试
  • 代码质量保证插件: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

四大步骤

  • 目的:在测试中模拟对象,用来代替真实依赖项,使测试专注于目标代码而不受外部环境影响
  • 手段:为模拟对象预设特定行为(Stubbing),控制模拟对象在特定情况下的响应
  1. 创建模拟对象: 使用Mockito创建模拟对象来代替真实的依赖
  2. 设定预期行为: 设置模拟对象在某些调用下的预期反应(如返回特定值)
  3. 在测试中使用模拟对象: 测试中使用这些模拟对象并观察反应
  4. 验证结果: 检查测试是否得到了预期的结果

代码质量保证插件

代码质量保证

  • 确保软件产品的质量满足预定的标准和要求。它不仅关注代码本身的质量,还包括整个开发过程的质量管理

代码质量保证的重要性

  • 提高软件可靠性: 高质量的代码可以减少软件中的错误和故障,提高软件的可靠性
  • 增强可维护性: 良好的代码质量使得软件更容易维护和升级
  • 提高开发效率: 通过减少错误和重复工作,可以提高开发效率
  • 客户满意度: 高质量的软件能够更好地满足客户需求,提高客户满意度

代码质量的衡量标准

  • 可读性: 代码应该易于阅读和理解
  • 一致性: 代码遵循一定的编码标准和风格
  • 复用性: 代码应设计得易于服用
  • 可测试性: 代码易于进行单元测试和集成测试
  • 效率: 代码应高效执行,无不必要的资源消耗

代码质量保证的实践

  • 代码审查 (Code Reviews):同行评审是提高代码质量的重要手段。通过审查,可以发现并修正代码中的错误,同时分享知识和经验
  • 编码标准 :制定并遵循一套编码标准和约定,如命名规范、代码结构、注释规范等
  • 自动化测试 :编写和执行单元测试、集成测试等,确保代码的功能和性能符合要求
  • 持续集成 (Continuous Integration,CI):通过自动化构建和测试,持续集成可以及时发现和修复问题
  • 静态代码分析 :使用工具进行静态代码分析,以识别潜在的代码缺陷和不良实践
  • 性能分析 :监控代码在运行时的性能,确保其效率和响应速度
  • 重构 :定期对代码进行重构,提高代码的质量和可维护性
  • 文档和注释 :维护良好的最新的文档,帮助团队理解和维护文档

Checkstyle 插件 - 代码风格插件

网址:checkstyle.sourceforge.io/

作为 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>

image.png

编写 checkstyle.xml

image.png

  • 设置 Checkstyle 的错误为 warnings

image.png

可以将 Scan Scope 设置为不包括测试

  • 设置 Code Style 的 Java ➡️ Scheme

image.png

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>