测试术语与基础
我在近二十年的职业生涯中从事过各种类型的技术工作。在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 | 黑盒测试,灰盒测试 | 集成测试,系统测试 | 功能测试 | 端到端测试 |
结语
本文是一篇入门级的科普文章,内容如果有错误地方,还请各位专家指正。希望各位开发人员能通过这篇了解测试术语与基础,再写好代码的同时,做好测试,保证质量。