九里大集

Eternachen's Blog

测试术语与基础

我在近二十年的职业生涯中从事过各种类型的技术工作。在IBM工作期间,我有幸与不少优秀的测试工程师一起工作,从他们身上获益颇多。

斗转星移,随着这几年敏捷开发/云计算的蓬勃发展,开发团队与测试团队之间的界限渐渐模糊,日趋融合在一起。在具体工作中,不少年轻工程师表示对测试知识知之甚少,甚至有不少资深工程师对测试知识也是意兴阑珊。在此,笔者对日常工作中的测试术语与基础做个科普,希望对大家有所帮助。

测试基础

从哪个角度看待测试,或者说如何对测试进行分类,一般有3种方式

  • 测试方法(Method)—— 怎么做测试(HOW to test)
  • 测试级别(Level)—— 何时做测试(When to test)
  • 测试类型(Type)—— 测试什么(What to test)

测试方法(Method)

有多种方法或技术可用于测试软件,了解这些技术对于进一步讨论测试至关重要。此处涵盖了我们自己的测试中最常提及的方法。

黑盒测试(Blackbox Testing)

定义为:“测试,无论是功能性的还是非功能性的,不涉及组件或系统的内部结构。”

“测试人员在不了解网站内部结构的情况下,使用浏览器测试网页;提供输入(点击、击键)并根据预期结果验证输出。”

换句话说,在不了解系统如何在幕后运作的情况下测试系统行为。给定一些输入,期待一些输出。

白盒测试(Whitebox Testing)

定义为:“基于组件或系统内部结构分析之后进行的测试。”

“白盒测试就像一个机械师的工作,他深入了解发动机来设计相应的汽车测试用例。”

这些测试需要对被测代码及其依赖项有深入的了解。

灰盒测试(Greybox Testing)

定义为:“…一种软件测试方法,它是黑盒测试方法和白盒测试方法的结合。在黑盒测试中,测试项目的内部结构对于测试人员来说未知的。而在白盒测试中,内部结构是已知的。在灰盒测试中,内部结构是部分已知的。”

黑白盒测试的混合方法。测试人员对被测软件有部分了解。

此外还有一下测试方法,意义比较直接,不再详述。

  • Static Testing —— 静态测试
  • Dynamic Testing —— 动态测试
  • Agile Testing —— 敏捷测试
  • Ad Hoc Testing —— 即兴测试
  • Manual Testing —— 手工测试
  • Automated Testing —— 自动化测试

测试级别(Level)

测试贯穿整个 SDLC(软件开发生命周期)。任何级别的测试都不足以说软件产品已经过全面测试。

考虑每一级别的执行时间和测试成本也很重要。单元测试最快且成本最低,可以快速找到错误。验收测试最慢,成本最高。

测试级别

单元测试(Unit Testing)

测试范围限于单个组件或代码“单元”(通常是类中的方法),通常测试组件和代码“单元”的合同(contract)。如果需要,与其他组件的交互被模拟(Mock)或存根(Stub)以确保测试隔离。

这些通常是白盒测试,通常由开发人员编写,作为交付代码的一部分。

我们应该始终致力于通过单元测试实现 100% 的代码覆盖率。

例子:

  • 当一个空列表被传递给一个方法时,期望抛出一个 IllegalArgumentException
  • 域对象验证

某云服务团队的例子:

  • 作为任何模块构建的一部分运行,通常使用 Surefire 插件和 TestNG
    • 在推送之前在本地运行以检查代码
    • 合并前在CI中运行
    • 合并后在CI中运行
  • 测试代码在模块的 src/test/main 目录中

集成测试(Integration Testing)

执行多个组件或代码“单元”之间交互的测试。这通常意味着不应用模拟/存根,但外部依赖项除外

这些通常是灰盒测试

例子:

  • 调用使用存储库对象将数据写入数据库的服务方法。验证数据库包含预期的数据。
  • 启动本地服务(使用本地依赖项)并调用其 REST 端点的功能测试。

系统测试(System Testing)

执行分布式和完全系统集成的端到端工作流的测试。

这些通常是黑盒测试

系统测试被定义​​为:“测试集成系统以验证其满足指定需求规约的测试过程。”

验收测试(Acceptance Testing)

验证软件或完整系统是否满足业务需求规约的测试。

这些测试本质上是黑盒测试。这种测试可能由客户完成,作为 Dogfooding 计划的一部分,或由产品经理完成。

测试类型(Test Types)

有多种类型的测试,以下是常用类型。

功能测试(Functional Testing)

功能测试被定义​​为:“为评估组件或系统是否满足功能需求而执行的测试。”

这是大多数开发人员都熟悉的测试类型,它适用于所有级别的测试。

功能测试可以是白盒测试或黑盒测试

某云服务团队的例子:

  • 单元测试
  • 代码仓库内自动化测试
  • 自动化测试

性能测试(Performance Testing)

性能测试被定义为:“确定组件或系统的性能效率的测试。”

这通常在开发生命周期的后期执行,以检查生产准备情况。

有几个子类型:

  • 峰值测试(Spike Testing/Peak Testing)——系统如何处理突然增加的负载
  • 压力测试(Stress Testing)——系统如何处理超出预期限制的负载
  • 耐力测试(Edurance Testing/Load Testing)——系统如何处理持续的重负载

回归测试(Regression Testing)

回归测试被定义​​为:“一种与变更相关的测试,用于检测相关的变更是否在软件的未更改区域引入或导致了缺陷。”

这些测试在所有级别的测试中执行。每个测试在合并后本质上都成为回归测试。

冒烟测试(Smoke Testing)

冒烟测试被定义​​为:“一个测试套件,它涵盖了一个组件或系统的主要功能,以确定它在测试计划开始之前是否正常工作。”

这个术语是从硬件测试中借来的,如果一个组件在第一次打开时实际上没有着火,它就会通过。

此测试通常在集成测试和系统测试级别执行。冒烟测试通常是黑盒测试

除此之外,还有以下测试类型等等

  • 可用性测试(Usability Testing)
  • 安全测试(Security Testing)
  • 合规测试(Compliance Testing)

建议

在实际工作中,建议各个团队结合项目与团队状况,从以上三个角度对已有的测试用例进行分析,并规划新的测试计划,已满足质量保证的要求。

示例如下

测试用例 测试方法 测试级别 测试类型 备注
测试用例一:xxxxx 白盒测试 单元测试 功能测试 模块功能测试
测试用例二:xxxxx API测试 白盒测试 单元测试,集成测试 回归测试 API回归测试
测试用例三:xxxxx 黑盒测试,灰盒测试 集成测试,系统测试 功能测试 端到端测试

结语

本文是一篇入门级的科普文章,内容如果有错误地方,还请各位专家指正。希望各位开发人员能通过这篇了解测试术语与基础,再写好代码的同时,做好测试,保证质量。

参考但不限于

Top