什么是单元测试? - MATLAB & Simulink

单元测试

什么是单元测试?

单元测试是一种软件测试方法,用于在与其他部分相隔离的环境中验证程序单个组件(即单元)的功能。

“单元”通常指程序中最小的可测试部分,例如函数、方法、类或脚本。通过将复杂脚本或算法分解为这些较小的单元,开发人员可以开发精确且有针对性的测试来验证每个组件的功能。

系统中的组件可以用拼图块来比喻。单元测试的重点是单个拼图块(即组件)及其相邻拼图块,而不是整个系统。

拼图块表示应用的各个组件。单元测试验证每个组件在隔离环境中是否正确运行。

为什么单元测试很重要?

通过在早期对各个单元执行单元测试,您可以发现并修复错误,从而生成更可靠的代码,并减少复杂且耗时的调试工作。它还支持开发模块化和可维护的软件,进而提高代码质量。

单元测试的优点和挑战

单元测试提供几个好处:

  • 单元测试通常比整个系统测试或更全面的测试更容易编写且运行更快。
  • 在早期阶段更容易识别和隔离 Bug。
  • 它可能有助于您发现软件其他部分的问题,将子系统交互的数量保持在最低限度。
  • 您可以在开发早期阶段开始测试,而无需等到整个应用程序完成再进行。

然而,其面临的一个挑战是,在隔离环境中测试单个单元可能无法检测到所有问题。

何时执行单元测试

为了确保代码质量并捕获编码更改带来的影响,单元测试应贯彻在整个开发过程中:

  • 在开发过程中:在开发新功能时编写单元测试。这种方法确保每个组件从一开始就按预期工作。
  • 在重构时:使用单元测试确保重构不会改变代码的预期行为。
  • 在修复 Bug 后:针对已解决的 Bug 实现单元测试,以防止它们在将来再次出现,并确保修复不会对其他软件功能产生负面影响。
  • 在集成之前和集成期间:在将更改合并到主代码之前进行单元测试,并将其纳入您的持续集成 (CI) 管道中。这可以防止新代码引入错误,有助于维护稳定的代码库。

软件测试金字塔

在软件开发过程的早期和整个过程中执行单元测试有助于提高代码质量。然而,单元测试只是全面策略的一部分。软件测试金字塔展示了不同级别的测试 - 单元测试、集成测试和系统测试 - 突出其粒度和频率。此金字塔提供了一种结构化方法来管理和统筹安排测试工作,强调实现最佳软件质量所需的平衡。

这些测试类型的特性如下:

  • 单元测试,位于金字塔底部,粒度最细,并且执行频率最高。单元测试通常较小,因此编写和运行更快、更具成本效益。单元测试可以在开发过程的早期实现,提供对单个组件功能的即时反馈。
  • 集成测试,位于金字塔的中间,重点是验证不同组件或系统之间的交互。集成测试比单元测试稍微复杂且更耗时,但对于确保集成组件按预期协同工作至关重要。
  • 系统测试,位于金字塔的顶部,用于评估整个应用程序。系统测试更全面且需要大量资源。系统测试通常在开发周期的后期执行,以验证整个系统满足指定的需求。

该金字塔结构强调拥有更多低级测试(如单元测试)和较少高级测试的重要性。一种平衡的方法的目标为在工程完成时执行约 70% 的单元测试、20% 的集成测试和 10% 的系统测试。这种策略可确保可靠代码有坚实的基础,减少在更高级别的测试阶段出现问题的可能性。

单元测试位于金字塔的底部,集成测试位于中间,系统测试位于顶部。从底部到顶部,测试速度逐渐减慢,隔离程度逐渐降低,集成度逐渐升高。

软件测试金字塔由三种类型的测试组成,从而提供了一种结构化方法来管理和统筹安排测试工作。

其他类型的软件测试

除了软件测试金字塔所表示的测试粒度和频率外,还有几种测试方法,每种方法都有基于其预期结果的特定目标。其中一个关键的区别是功能测试和非功能测试之间的区别:

  • 功能测试的重点是验证软件的功能和行为是否正确。示例包括检查基本功能的冒烟测试,以及用来确保新代码更改不会对现有功能产生不利影响的回归测试。
  • 非功能测试评估软件的其他关键方面,如可用性、安全性和稳定性。性能测试是最常见的非功能测试类型,用于评估软件在特定条件(如负载和压力)下的运行情况。

综合利用功能测试和非功能测试可确保软件正确运行并满足质量标准。

使用 MATLAB 进行单元测试

测试代码是开发高质量软件的重要组成部分。MATLAB® 提供稳健的内置单元测试框架,使您能够编写单元测试并监视代码功能的回归。该框架支持使用类编写测试,使您能够在逻辑上构建测试。此外,您还可以运行和分析测试结果。

基于类的单元测试

这种方式让您将测试定义为类中的方法。MATLAB 可以为您生成通用模板,MATLAB Test™ 可以为您的代码生成特定测试。这种方式使您能够在测试方法中测试脚本和函数,从而兼具面向对象的编程的优势和测试各种代码类型的灵活性。此示例演示如何编写基于类的单元测试

运行测试

在保存测试文件后,您可以从 MATLAB 工具条运行测试。您还可以使用 runtests 函数或 MATLAB 测试浏览器来执行测试、查看结果并以交互方式调试故障。

MATLAB 编辑器工具条的“运行节”的截图:显示“运行测试”、“运行当前测试”、“步进”和“停止”的图标。

MATLAB 编辑器工具条中的“运行测试”选项。(请参阅文档。)

分析测试结果

MATLAB 提供摘要、详细报告和代码覆盖率以便您分析源代码。

对于更高级的功能,MATLAB Test 提供增强测试过程的其他功能,例如自动化测试生成、增强的测试管理、与 CI/CD 系统的集成、高级代码覆盖率和质量控制板。了解有关分析测试结果的更多信息。

MATLAB 中的单元测试示例

此示例说明如何对简单的 fibonacci 函数执行单元测试。此函数计算到指定数字 (n) 的斐波那契数列。为了验证其正确性,我们提供了样本输入。单元测试检查计算的输出是否与给定输入的预期输出匹配。如果输出匹配,则测试通过;否则,测试失败。

function x = fibonacci (n) 
% 生成前 n 个斐波那契数
n=6;
x = ones (1,n);
for ii = 3:n;
      x(ii) = x(ii - 1) + x(ii - 2);
end

end
% 这是为文件 fibonacci.m 自动生成的样本测试
classdef test fibonacci < matlab.unittest.TestCase

    methods (Test)

        function test_fibonacci (testCase)
            % 指定以下函数的输入:
            % fibonacci
            n = 6;

            % 指定以下函数的预期输出:
            % fibonacci
            expected_x = [1, 1, 2, 3, 5, 8];

            % 执行 fibonacci 函数
            actual_x = fibonacci(n);

            testCase.verifyEqual(actual_x,expected_x);

        end
    end
end
MATLAB 测试浏览器的截图:显示 fibonacci 函数的成功单元测试,绿色对勾表示测试通过。

在 MATLAB 中执行单元测试。MATLAB 测试浏览器通过将计算的输出与所选输入的预期输出进行比较,对 fibonacci 函数运行单元测试。MATLAB 测试浏览器(右侧)指示单元测试成功通过。


另请参阅: MATLAB Test, 软件测试