什么是单元测试?

什么是单元测试?

单元测试是一种软件测试类型,其中对软件的单个单元或组件进行测试。目的是验证软件代码的每个单元是否按预期执行。单元测试由开发人员在应用程序的开发(编码阶段)期间完成。单元测试隔离代码的一部分并验证其正确性。一个单元可以是一个单独的函数、方法、过程、模块或对象。

在 SDLC、STLC、V 模型中,单元测试是在集成测试之前进行的第一个测试级别。单元测试是一种白盒测试技术,通常由开发人员执行。然而,在实际工作中,由于时间紧迫或开发人员不愿测试,QA 工程师也会进行单元测试。

What is Unit Testing

单元测试视频解释

为什么要执行单元测试?

单元测试很重要,因为软件开发人员有时会尝试通过进行最少的单元测试来节省时间,这是一个误区,因为不适当的单元测试会导致在系统测试、集成测试甚至应用程序构建后的 Beta 测试期间修复缺陷的成本很高。如果在早期开发阶段进行适当的单元测试,最终可以节省时间和金钱。

以下是在软件工程中执行单元测试的主要原因:

Unit Testing Levels
单元测试级别
  1. 单元测试有助于在开发周期的早期修复错误并节省成本。
  2. 它帮助开发人员理解测试代码库,并使他们能够快速进行更改
  3. 良好的单元测试可作为项目文档
  4. 单元测试有助于代码重用。将您的代码测试都迁移到您的新项目。调整代码直到测试再次运行。

如何执行单元测试

为了执行单元测试,开发人员编写一部分代码来测试软件应用程序中的特定功能。开发人员还可以隔离此功能以进行更严格的测试,这会揭示被测试功能与其他单元之间不必要的依赖关系,从而可以消除这些依赖关系。开发人员通常使用 UnitTest 框架来开发用于单元测试的自动化测试用例。

单元测试分为两种类型

  • 手动
  • 自动化

单元测试通常是自动化的,但也可以手动执行。软件工程不偏向于任何一种,但更倾向于自动化。手动单元测试方法可能会使用一步一步的说明文档。

在自动化方法下-

  • 开发人员在应用程序中编写一部分代码,专门用于测试该功能。他们稍后会注释掉,并在应用程序部署时最终删除测试代码。
  • 开发人员还可以隔离该功能以更严格地测试它。这是一种更彻底的单元测试实践,它涉及将代码复制粘贴到其自己的测试环境中,而不是其自然环境中。隔离代码有助于揭示被测试代码与产品中其他单元或数据空间之间不必要的依赖关系。然后可以消除这些依赖关系。
  • 编码人员通常使用 UnitTest 框架来开发自动化测试用例。使用自动化框架,开发人员将标准编码到测试中以验证代码的正确性。在测试用例执行期间,框架会记录失败的测试用例。许多框架还会自动标记并汇总报告这些失败的测试用例。根据失败的严重程度,框架可能会暂停后续测试。
  • 单元测试的工作流程是:1) 创建测试用例 2) 审查/返工 3) 基线 4) 执行测试用例。

单元测试技术

单元测试技术主要分为三部分:黑盒测试,包括用户界面以及输入和输出的测试;白盒测试,涉及软件应用程序功能行为的测试;灰盒测试,用于执行测试套件、测试方法、测试用例和进行风险分析。

单元测试中使用的代码覆盖技术如下所示

  • 语句覆盖
  • 决策覆盖
  • 分支覆盖
  • 条件覆盖
  • 有限状态机覆盖

更多信息请参考 https://guru99.com.cn/code-coverage.html

单元测试示例:模拟对象

单元测试依赖于创建模拟对象来测试尚未成为完整应用程序一部分的代码片段。模拟对象弥补了程序中缺失的部分。

例如,您可能有一个函数需要尚未创建的变量或对象。在单元测试中,这些将以模拟对象的形式进行处理,这些模拟对象仅为对该代码片段进行的单元测试而创建。

单元测试工具

有几种可用的自动化单元测试软件可以协助软件测试中的单元测试。我们将在下面提供一些示例

  1. Junit:Junit 是一种免费的测试工具,用于 Java 编程语言。它提供断言来识别测试方法。该工具首先测试数据,然后将其插入代码片段中。
  2. NUnit:NUnit 是广泛使用的单元测试框架,适用于所有 .NET 语言。它是一个开源工具,允许手动编写脚本。它支持可并行运行的数据驱动测试。
  3. JMockit:JMockit 是开源的单元测试工具。它是一个具有行和路径度量的代码覆盖工具。它允许使用记录和验证语法模拟 API。该工具提供行覆盖、路径覆盖和数据覆盖。
  4. EMMA:EMMA 是一个开源工具包,用于分析和报告用 Java 语言编写的代码。Emma 支持方法、行、基本块等覆盖类型。它基于 Java,因此没有外部库依赖,并且可以访问源代码。
  5. PHPUnit:PHPUnit 是一个适用于 PHP 程序员的单元测试工具。它将代码分成小部分(称为单元),并分别测试每个单元。该工具还允许开发人员使用预定义的断言方法来断言系统以某种方式运行。

这些只是一些可用的单元测试工具。还有更多,特别是针对 C 语言和 Java 的,但无论您使用哪种语言,您都一定会找到满足您编程需求的单元测试工具。

测试驱动开发(TDD)和单元测试

TDD 中的单元测试涉及广泛使用测试框架。单元测试框架用于创建自动化单元测试。单元测试框架并非 TDD 所独有,但它们对 TDD 至关重要。下面我们来看看 TDD 为单元测试领域带来的一些东西:

  • 在编写代码之前编写测试
  • 严重依赖测试框架
  • 测试应用程序中的所有类
  • 实现快速简便的集成

单元测试的误区

误区:这需要时间,而我总是日程安排得太满。
我的代码很可靠!我不需要单元测试。

误区本身就是错误的假设。这些假设导致了以下恶性循环 –

UNIT Testing Myth

事实是,单元测试提高了开发速度。

程序员认为集成测试会捕获所有错误,因此不执行单元测试。一旦单元集成,在单元测试中本可以很容易发现和修复的简单错误,却需要很长时间才能追踪和修复。

单元测试的优点

  • 希望了解单元提供哪些功能以及如何使用它的开发人员可以查看单元测试,以对单元 API 获得基本理解。
  • 单元测试允许程序员在以后重构代码,并确保模块仍然正常工作(即回归测试)。该过程是为所有函数和方法编写测试用例,以便每当更改导致故障时,都可以快速识别并修复。
  • 由于单元测试的模块化特性,我们可以测试项目的各个部分,而无需等待其他部分完成。

单元测试的缺点

  • 不能期望单元测试捕获程序中的所有错误。即使在最简单的程序中也无法评估所有执行路径
  • 单元测试本质上侧重于代码单元。因此,它无法捕获集成错误或广泛的系统级错误。

建议单元测试与其他测试活动结合使用。

单元测试最佳实践

  • 单元测试用例应该是独立的。如果需求有任何增强或更改,单元测试用例不应受到影响。
  • 一次只测试一个代码块。
  • 遵循清晰一致的单元测试命名约定。
  • 如果任何模块中的代码发生更改,请确保该模块有相应的单元测试用例,并且在更改实现之前,该模块通过了测试。
  • 在 SDLC 中进入下一阶段之前,必须修复在单元测试期间发现的错误。
  • 采用“边写代码边测试”的方法。你写的代码越多,而不进行测试,你检查错误的路径就越多。

Unit Testing Best Practices

摘要

  • 单元测试被定义为一种软件测试类型,其中对软件的单个单元或组件进行测试。
  • 正如您所看到的,单元测试可能涉及很多内容。它可以复杂,也可以相当简单,这取决于被测试的应用程序以及所使用的测试策略、工具和理念。在某种程度上,单元测试总是必要的。这是肯定的。