单元测试再出发

在构建软件系统时,测试是软件开发工作流程的必不可少的部分之一。作为软件开发人员,都希望编写的程序按预期工作。程序没有BUG,测试可以协助这个目标的达成。

本文将讨论一种称为单元测试的测试方法。什么是单元测试?应该如何实施?单测优点和局限性是什么?

什么是单元测试

单元测试的目标是隔离程序的每个部分并显示各个部分按预期工作。单元测试是由软件开发人员编写和运行的自动化测试,以确保应用程序的一部分(称为单元)按预期工作。

单元是可以在系统中逻辑隔离的最小代码段。这可以是单个函数、方法、过程、模块、类或对象。通常,一个单元有几个输入和一个输出。单元测试由软件开发人员在应用程序的开发(编码阶段)期间完成。

只有各个部分运行良好,整个系统才能运行良好。通过为最小的可测试单元编写测试,软件开发人员建立了整个系统将按预期工作的信心。一旦软件开发人员编写了单元测试,他们就可以在本地机器上运行它以检查测试是否通过。他们还可以运行所有其他预先存在的测试来检查它们是否仍然通过。

单元测试框架

软件开发人员通常使用单元测试框架来开发用于单元测试的自动化测试用例。单元测试框架是支持编写和运行单元测试的软件工具,包括构建测试的基础以及执行测试和报告结果的功能。有最流行的编程语言的单元测试框架。

在测试用例执行期间,框架记录未通过任何标准的测试并在摘要中报告它们。根据故障的严重程度,框架可能会停止后续测试。

单元测试还可以设置为在代码发布到暂存或生产环境之前在每个新构建上执行。通过这种方式,软件开发人员可以确保只有通过所有单元测试的代码才能进入实时环境。如果在构建过程中任何单元测试失败,软件开发人员可以在尝试再次发布之前先修复问题。

单元测试示例

下面是一个非常简单的例子,说明单元测试如何工作。我们有一个简单的add函数,它接收两个数字作为参数并返回两个数字相加的结果。这里我使用最近新学(其实复习)的Groovy单元测试框架Spock来演示。有兴趣的同学看看旧文章:

    static int add(int i, int j) {
        return i + j
    }

我们对add函数的非常简单的第一个单元测试如下。

    def "测试add方法"() {
        given: "Have Fun ~ Tester !"

        expect:
        sum == add(i, j)

        where:
        sum | i  | j
        2   | 1  | 1
        1   | -1 | 2
        0   | 0  | 0
    }

然后,我们可以为add函数添加更多单元测试,并使用其他示例输入来覆盖不同的情况,例如负数或无效的输入参数,以检查错误是否得到正确处理。这是一个非常简单的例子,但是,它在实践中展示了单元测试是如何工作的。

单元测试的好处

单元测试是一种软件测试方法,其中测试软件的各个单元、组件或模块以确定它们是否适合使用。因此,它有很多好处。随着软件系统的发展,软件开发人员从单元测试中获益更多。如果在早期开发中进行了适当的单元测试,最终将节省软件开发人员的时间和金钱。

单元测试在开发周期的早期发现问题。这包括软件开发人员实施中的错误。在开始编码之前或首次编写代码时发现错误的成本远低于稍后检测、识别和纠正错误的成本。

单元测试帮助软件开发人员创建更好的软件设计。如果编写得不好,代码可能无法或难以进行单元测试,因此单元测试可以迫使软件开发人员以更好的方式构建功能和对象。编写一套完整的测试的过程迫使软件开发人员仔细考虑输入、输出和错误条件,从而更清晰地定义单元所需的行为。

由于单元测试的模块化特性,软件开发人员可以测试软件系统的各个部分,而无需等待其他部分完成。这将帮助软件开发人员以小的敏捷增量创建他们的软件。

单元测试允许软件开发人员在以后轻松重构代码或升级系统库,并确保现有代码仍然正常工作。软件开发人员所做的任何导致现有单元测试失败的更改都可以快速识别并解决。单元测试检测可能破坏现有工作代码的更改。

单元测试创​​建系统文档作为积极的副作用。希望了解单元提供哪些功能以及如何使用它的软件开发人员可以查看单元测试以获得对单元接口 (API) 的基本了解。

单元测试限制

尽管单元测试有很多好处,但它也有一些局限性。

单元测试不会捕获软件系统中的每个错误。除非它是一个非常简单的系统,否则很难评估软件系统中的每个执行路径。单元测试仅限于测试单元本身的功能。它不会捕获其他错误,例如集成错误或性能错误。

如果被测单元的核心功能是与系统外部的事物交互,则设置单元测试可能很困难。在单元测试时,诸如数据库、文件系统或外部 API 之类的外部事物可能会带来挑战。软件开发人员可能不得不模拟与外部方的交互,这可能具有挑战性,而且作为测试还不够详尽。

Last

编写单元测试作为系统开发的一部分通常会让人感觉成本高昂且速度缓慢。需要编写更多代码,编写好的单元测试需要时间和精力。开发团队常犯的错误是跳过单元测试。

随着大多数软件系统的增长,它们将受益于广泛的单元测试覆盖范围。单元测试有助于更轻松地添加新功能、重构现有功能以及了解系统的现有单个组件。尽早添加单元测试最终将节省软件开发人员时间以提升效率。

欢迎关注FunTester,Have Fun ~ Tester !