单元测试的内容

单元测试的定义

单元测试是软件测试类型的一种,主要测试的是软件的单个单元或组件。单元测试的目的是验证软件代码的每个单元是否按预期执行。单元测试是在编码阶段完成的,方法是隔离一段代码并验证其正确性。一个单元可以是一个单独的功能、方法、进程、模块或对象。

在SDLC、STLC、V模型中,单元测试是在集成测试之前进行的第一级测试。单元测试是一种白盒测试方法,通常由开发人员执行。然而在实际工作中,由于时间关系或开发人员的推诿,很多时候单元测试都是由QA工程师执行的。

单元测试的目的和意义

单元测试的意义:

单元测试之所以很重要是因为软件开发人员有时会为了节省时间做最小的单元测试,而这有一定的风险,因为不健全的单元测试会增加在系统测试、集成测试以及应用程序构建后的Beta测试(一种验收测试)阶段的缺陷修复成本。如果单元测试在早期开发阶段执行得当,那么就会在很大程度上节省时间和金钱。

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

  • 单元测试有助于在软件开发周期的早期修复错误以达到节省成本的效果。
  • 单元测试有助于开发人员理解测试代码库,并帮助他们快速做出更改
  • 良好的单元测试可作为项目文档模板
  • 单元测试有助于代码重用。将代码和测试迁移到新项目中,经过调整后的代码就可以再次运行测试。

如何执行单元测试

为了执行单元测试,开发人员会编写一段代码来测试软件应用程序中的特定功能。开发人员还可以隔离此函数来进行更严格的测试,从而揭示被测试的函数和其他单元之间不必要的依赖关系并加以消除。开发人员通常使用UnitTest框架原理来开发可用于单元测试的自动化测试用例。单元测试类型有两种:

  • 手动单元测试
  • 自动单元测试

单元测试通常是自动化执行的,也可以通过手动执行来完成。软件工程并不偏爱其中一种,但自动化是首选。单元测试的手动操作可以采用循序渐进的指导文档。

以下是单元测试自动化测试方法:

  • 开发人员会在应用程序中编写一段代码来测试功能。他们稍后会注释掉该段代码(使其暂时不运行),并最终在部署应用程序时删除测试代码。
  • 开发人员还可以隔离该函数,对其进行更严格的测试。这是一种更彻底的单元测试实验,涉及到将代码复制并粘贴到本地测试环境中而不是真实自然环境中。隔离代码有助于揭示正在测试的代码与产品中的其他单元或数据空间之间的不必要的依赖关系,从而消除这些依赖关系。(本地测试环境-是在自己电脑上配置一个运行网站的虚拟空间, 主要用于测试程序,测试数据,开发程序或者开发模板等)
  • 程序员通常使用UnitTest框架来开发自动化测试用例。开发人员使用自动化框架将标准编码编到测试中,目的是验证代码的正确性。在测试用例的执行过程中,单元测试框架会记录失败的测试用例。而且,许多自动化测试框架还会自动标记这些失败的测试用例并将其生成报告。最后会根据故障的严重程度,框架可能会停止后续测试。
  • 单元测试的测试流程是: a、创建测试用例、b、审查/返工、c、设计测试用例基线(/基础测试用例)、d、执行测试用例。

单元测试技术分类

单元测试技术主要分为三个部分:黑盒测试-测试用户界面的输入输出功能;白盒测试-测试软件应用程序的功能行为;灰盒测试-用于执行测试套件、测试方法、测试用例和执行风险分析。单元测试中使用的代码覆盖技术如下所示:

  • Statement Coverage- 语句覆盖率
  • Decision Coverage- 判定覆盖测试
  • Branch Coverage- 分支覆盖率测试
  • Condition Coverage-条件覆盖测试
  • Finite State Machine Coverage- 有限状态机覆盖率

单元测试用例:模拟对象

单元测试依赖于创建模拟对象来测试一段尚未成为完整应用程序一部分的代码。模拟对象填补了程序中缺失的那部分。例如,你有一个函数需要使用尚未创建的变量或对象。在单元测试中,这部分缺失将以模拟对象的形式进行说明,而该模拟对象仅为该代码段进行单元测试而创建。

单元测试的测试工具

自动化测试中用于实现单元测试的工具是:

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

测试驱动开发TDD

TDD测试驱动开发中的单元测试涉及了对测试框架的广泛使用。单元测试框架用于创建自动化的单元测试。单元测试框架并不是TDD独有的,但却是对测试驱动开发至关重要的。下面我们来看看TDD帮助单元测试项目实现了些什么:

  • 测试用例是在编写代码之前编写的
  • 极度依赖测试框架
  • 应用程序中的所有类(classes)都经过了测试
  • 实现了快速简便的集成

软件测试知识点:

  • SDLC全称:Software Development Life Cycle/软件生命周期
  • STLC: Software Testing Life Cycle/软件测试生命周期

Author: Maha

我是Wintesting中国站的 Maha,目前职位是市场营销&内容经理,负责CN Wintetsing网站内容的设计、编写与发布,同时还监管国内市场营销工作。与此同时,我也是一名IT培训教员,我的教育背景和所从事的行业都是与IT工程师行业及信息通信技术相关。此外,除了编写中英双语的新兴技术文稿外,我还是一名IT翻译工作者,累积翻译字数逾近10万,涉及的领域有大数据、人工智能、IoT、机器学习、云计算、AR&VR、计算机网络技术、计算机网络安全技术、应用程序测试、软件测试、系统测试、网络测试及IT基础设施等。如果你需要相关领域的内容编写或翻译工作请联系我。