目录

目的

文章的目的是为了让我们认识到单元测试的价值,单元测试的必要性。

单元测试的单元怎么定义

单元测试是一种软件测试方法,通过编写代码来验证应用程序中最小可测试单元(如单个函数、方法或类)的正确性。通常,单元测试由开发人员在功能实现过程中或完成后编写,其目的是确保每个最小可测试单元都能按照设计预期正常工作。

单元测试的价值

单元测试的价值主要体现在提高软件质量和可靠性,‌确保代码在修改或重构后仍然能够正常运行。‌单元测试的优势包括:

  • 提高代码质量。通过发现代码中的错误和漏洞,‌从而提高代码的质量和可靠性。‌
  • 提高开发效率。在开发过程中及时发现问题,‌减少开发周期和成本。‌
  • 便于重构和维护。确保代码在重构和维护过程中不会出现新的错误和漏洞。‌
  • 有助于团队协作。作为团队成员之间的沟通和协作工具,‌提高团队的协作效率和质量。‌

此外,‌单元测试还可以让软件故障尽早被发现,‌避免故障遗留到后期由于定位修复难度带来的更大损失。

‌它的可回归性为软件提供了一层安全防护网,‌为软件后续的重构和修改提供了安全保障。‌

单元测试还为软件单元如何被使用提供了天然的代码样例使用手册

遵循的原则

好的单元测试宏观上来说,具有自动化、独立性、可重复执行的特点。

  • 自动化:单元测试应能被自动化执行,以便在代码更改时快速确认新加入的代码没有破坏已有功能,通常情况下会将单测接入到持续集成中,每当代码有变更时都会通过持续集成自动触发单元测试。

  • 独立性:每个单元测试应当是独立的,不能依赖于其他测试的执行顺序或结果。这也要求单测的测试颗粒度必须足够小,只有这样才能满足独立性。

  • 可重复执行:好的单元测试在同样的条件下,每次运行应当给出相同的结果。它不应依赖于外部因素(如网络、数据库或文件系统),需要对这些外部的依赖进行正确的 mock。

除此之外,好的单测还必须要满足

  • 有明确的断言。
  • 执行速度快。
  • 边界测试充分。
  • 覆盖率高。

满足这些条件的单测才是好的单测,好的单元测试是对代码质量保障至关重要的一环。

如何编写单元测试?

拆分详细的测试用例

  • 考虑分支条件 在编写单元测试时,需要考虑代码中的所有分支。分支包括 if、else、switch 语句等,每个分支都需要单独测试。例如:

    public String classifyNumber(int number) {
        if (number < 0) {
            return "negative";
        } else if (number == 0) {
            return "zero";
        } else {
            return "positive";
        }
    }
    

    在上述代码中,有三个分支需要测试:

    • number<0。

    • number==0。

    • number>0。

    针对每个分支,都需要编写一个测试用例。

  • 寻找边界条件

    除了分支,还需要考虑边界条件。例如,对于上述分类函数,边界值是 -1、0 和 1。边界条件测试可以找出可能潜在的问题,确保代码在极限条件下也能正常工作。

制定统一的单元测试规范

  • 命名规范

    单元测试类通常采用类名 Test 的形式。例如,如果要测试一个 Calculator 类,则单元测试类可以命名为 CalculatorTest。单元测试方法的命名应当描述具体要测试的内容。例如:

    public class CalculatorTest {
        @Test
        public void testAddition() {
            // 测试内容
        }
        @Test
        public void testSubtraction() {
            // 测试内容
        }
    }
    
    
  • 存放路径

    一般情况下,单元测试类存放的位置在与被测试类相同包名的下面,但在不同的目录中。在标准的 Maven 项目结构中,源代码放在 src/main/java,单元测试代码放在 src/test/java。

    src/main/java/com/example/Calculator.java
    src/test/java/com/example/CalculatorTest.java
    

AI 辅助编写单元测试

在大多数开发者的编程习惯中,通常采用Test Later的方法进行单元测试,即首先编写好代码,然后再为代码编写相应的单元测试。

一般根据代码生成的单元测试,会枚举常用的测试用例,并不会遍历所有的用例。如果您觉得生成的用例不足,建议先采纳当前生成的几个用例,放到测试文件当中。然后,切换到测试文件中,采用代码续写的方式,通义灵码会帮助您续写新的测试用例。

面临单测的困境:

  • 环境与配置复杂。工欲善其事必先利其器,我们相信都能做到目标:开箱即用。
  • 测试用例如何选择。AI 加持,由 AI 来协助帮忙生成测试用例。
  • 单元依赖外部因素。善用 stub 与 mock 解除依赖。
  • 回报不足。是一个长期的过程,才能为我们节约时间出来浪。

9ong@TsingChan 文章内容由 AI 辅助生成。