什么是阴性检测?测试用例与示例
负面测试
负面测试 负面测试是一种软件测试类型,用于检查软件应用程序是否能够应对意外的输入数据和情况。意外数据或情况的范围很广,从简单的表单字段中错误的数据类型到蓄意的黑客攻击都包括在内。负面测试的目的是防止应用程序因无效输入而崩溃,并提高产品的质量和稳定性。
仅靠正向测试只能证明系统在正常情况下运行良好。负向测试则能确认同一系统也能应对异常情况,而这正是容错产品所要求的。
负面测试示例
电梯是最常被用来解释负面测试的例子,因为它的正常行为和故障行为都很容易想象。
电梯的使用要求很熟悉:按下楼层号,电梯就会到达该楼层;电梯到达指定楼层后,门会自动打开。
下面列出了同一电梯的一些负面情况,以及阳性检测所作的假设。
| 负面测试 | 积极检测 |
|---|---|
| 如果人数(重量)超过规定的限制会怎样? | 假设只有指定数量的人员会进入电梯 |
| 如果有人在电梯内吸烟或引发火灾会发生什么? | 假设电梯内不会出现烟雾或火灾。 |
| 如果运行过程中发生电源故障怎么办? | 假设电梯运行期间不会发生停电。 |
所有这些病例的检测结果均为阴性。但任何一种情况都无法保证永远不会发生,因此必须对每一种情况进行控制。
假设从未检查过超载情况,而电梯在超载后出现异常运行。这一个疏忽就会损害系统的可靠性,甚至危及生命。这就是负面测试在实践中的意义,以及它为何如此重要。
软件的行为方式也类似。否定测试是指故意偏离正常操作流程。例如,注册表单就是一个例子。
| 负面测试 | 积极检测 |
|---|---|
| 在电子邮件字段中输入了无效的电子邮件地址。 | 只有在电子邮件地址字段中才能输入有效的电子邮件地址。 |
| 在电话号码栏中输入无效电话号码(例如,输入特殊字符)。 | 数字栏只能输入数字。 |
| 上传尺寸超出指定范围的图片 | 只有符合指定尺寸范围的图片才会被上传。 |
| 上传无效文件,例如 XML or SQL 图片上传字段中的文件 | 仅允许上传.jpg或.png等有效图像格式的文件。 |
即使出现这些负面情况,系统也必须保持正常运行。如果在数字字段中输入字符,应用程序将无法处理它从未预料到的意外数据,并可能崩溃。更糟糕的是, SQL注入 同一字段中的字符串可能会导致数据库内容被覆盖。正是由于存在这类损失,才需要进行负面测试。
为什么要做负面测试?
测试耗时耗力,因此决定测试什么、如何测试以及测试多少至关重要。对于是否应该将部分预算用于负面测试,项目双方的看法截然不同。
组织视角
向客户交付优质产品是企业的责任,而阴性测试是履行这一责任的一部分。它也是企业证明其已尽一切合理努力防止故障发生的证据,尽管没有任何系统能够完全避免错误。
影响程度才是决定性因素。一个电商网站可能通过了所有正面测试,但仍然可能存在漏洞,攻击者可以利用该漏洞进行 SQL 注入并抹除网站背后的数据。这是一种严重的安全漏洞,只有负面测试才能发现它。
面向公众的应用程序,尤其是网站,几乎无法控制访问者的使用方式,因此,负面测试是确认异常使用情况是否被覆盖和控制的唯一方法。恶意用户也是如此:攻击者会积极寻找机会入侵系统,而黑客攻击场景理应包含在负面测试的覆盖范围内。
客户视角
客户期望产品零漏洞,而负面测试正是为了满足这一期望。对于电子商务或在线股票交易等敏感产品而言, 安全性测试 阴性检测结果是强制性的,而不是可选项。
客户唯一真正关心的问题是成本。一旦分析出故障的影响,客户就可以决定负面测试工作应该做到什么程度。
如何进行阴性检测
负面测试首先要考虑应用程序实际能够接收到的所有输入,而不仅仅是它应该接收到的输入。这些输入都属于以下范畴: 测试用例 即使这种使用方式显然是错误的。例如,系统会测试电子邮件字段是否包含所有无效的电子邮件地址,并测试图像上传控件是否包含所有非图像文件类型。
无效输入的列表几乎无穷无尽,因此必须对负面测试用例进行优先级排序。例如,对于一个只接受 .png 文件的图像字段,候选上传文件格式包括 .jpeg、.xml、.xls 等等。XML 或 SQL 文件的影响远大于 .jpeg 文件,因此这些用例会优先执行。在执行前根据影响程度对用例进行排序,正是降低负面测试成本的关键所在。
大多数负面测试用例都来自一套既定的设计技巧,而不是即兴发挥:
- 边界值: 对紧邻有效范围之外的值进行练习,例如,对于一个接受 1 到 100 的字段,练习 0 和 101。
- 无效的等价类: 从每类被拒绝的输入中挑选一个代表,例如数字字段中的字母。
- 猜测错误: 利用以往缺陷的经验,找出最有可能导致此类功能失效的输入。
- 畸形和恶意数据: 脚本标签、SQL 片段和过大的有效负载会探测验证和安全处理。
- 模糊测试: 自动生成大量随机或变异的输入,以查找未处理的崩溃。
- 中断的流程: 交易过程中途取消、刷新、超时或失去连接。
无论采用何种技术,预期结果都必须记录为可控的、可读的失败——验证消息、被拒绝的上传、干净的回滚——而绝不能仅仅记录为“系统没有崩溃”。
阴性检测的利弊
与其他所有测试技术一样,负面测试也有其优点和缺点,这取决于在哪里、何时以及应用多少。
负面测试的优点
- 它直接保护产品质量,因为高质量的产品就是没有可被利用的漏洞的产品。
- 它扩大了覆盖范围。无效输入可能有意或无意地进入运行中的系统,因此,为了使覆盖范围有意义,必须同时考虑无效输入和无效输入。
- 它能在产品正式发布前增强客户的信心。
- 它能发现正面测试在结构上无法发现的缺陷,例如未处理的异常和薄弱的输入验证。
负面测试的缺点
- 在某些情况下,这样做会浪费时间和精力。如果一个应用程序是为单个用户开发的,那么测试 100 个并发用户的情况就毫无意义,因此选择合适的测试条件至关重要,有些系统甚至几乎不需要负面测试。
- 设计这些案例需要技术娴熟、经验丰富的人员。
- 从客户的角度来看,这会增加成本并可能延迟发布。
- 这会造成资源竞争。一个在阴性检测上投入巨资的团队,最终可能会在阳性检测上投入不足。
