软件测试

什么是软件测试?

软件测试是评估程序以确保其满足需求的过程,但人们经常对它产生误解。它只是一个在开发新功能时分散注意力的事项吗?亦或是对生产力的拖累?甚至可能是不必要的步骤,因为一切在本地计算机上似乎都运行良好?想象一下这个场景:您是一名工程师,兢兢业业工作数年设计和构建了下一代火箭的控制软件。在发射当天,似乎一切按计划进行,直到飞行几秒后,火箭因简单的整数溢出而偏离轨道并发生爆炸。这就是阿丽亚娜 5 号火箭首次飞行时发生的事情,这只是软件 Bug 可能造成灾难性后果的示例之一。

天空中火箭的示意图,显示一条蓝色直虚线和一条红色弯曲虚线。火箭沿红色弯曲线飞行并爆炸。

即使是软件中的小错误也可能导致意外的后果,例如火箭偏离轨道。

软件测试的重要性

软件错误会导致后果。在实际情况中,Bug 曾导致放射疗法机器生成错误的剂量,交易算法损失数百万美元,甚至由于单位转换错误而损失一颗火星卫星。这些真实事件突显了软件测试的关键作用,必须及早识别潜在 Bug 以免造成危害。在日常工作中,工程师希望编写能够正常工作,并且随着时间的推移持续可靠地工作,的代码。软件测试能够确保基于您的软件的重要决策是可靠的。

示意图:人坐在办公桌前,计算机屏幕上显示代码和不同颜色。

软件测试能够确保您的代码随着时间的推移可靠地工作。

在开发过程的早期进行测试可以显著降低成本:修复 Bug 的成本随着其在开发生命周期中的推进而增加。早期发现问题不仅节省时间和金钱,还能最大限度地降低项目延迟的风险,并确保更顺畅的开发过程。通过将软件测试集成到开发的早期阶段,团队可以在潜在问题升级之前检测和解决它们,从而开发出更稳健和可靠的软件。

手动和自动化软件测试

如果您曾经编写过代码,则您已执行过测试,即使您并未意识到。软件测试是评估软件应用程序以识别 Bug、错误和未满足的需求的过程。运行脚本以查看它是否产生正确的结果是一种手动测试形式。然而,手动测试要求测试人员记住程序并评估结果是否正确,这取决于具体的个人对应用程序的了解。如果测试人员离开公司,他们掌握的知识及测试代码的能力也随之而去。

不同类型的软件测试的示意图:标有“手动测试”的工具箱和标有“自动化测试”的齿轮。

对于可重复的过程,手动测试很快令人不堪重负。随着代码复杂性的增加,自动化软件测试体现了更多好处。

现代软件测试已从手动发展到自动化,提供一种系统化的软件评估方法。将预期行为和测试步骤文档化,能将关键知识从个人转移到测试代码中,从而减轻对具体某测试人员的依赖,使代码更一致、可靠。自动化软件测试使您能够将实际系统行为与预期结果进行比较,突出显示可能需要关注的差异(或需要更新的测试)。

软件测试的目标

  • 尽早检测 Bug:在开发过程的早期识别 Bug 至关重要,因为随着项目的推进,修复 Bug 的成本呈指数级增长。在部署阶段仍存在的 Bug 可能导致经济损失和声誉受损。
  • 发现可靠性和性能问题:在所有条件(包括边缘情形)下测试代码是必要的。性能问题,如响应时间慢,其严重性可能不亚于不正确的结果。

软件测试的类型

软件测试有许多类型,可能难以确定从哪种类型入手。以下是每个工程师都需要了解的几种基本的软件测试类型:

  • 单元测试:专注于验证隔离的单个组件或代码单元是否正常工作。单元测试有助于在早期阶段隔离和识别 Bug,并且可以相对快速和轻松地编写和运行代码。
  • 集成测试:验证代码单元之间的接口,确保它们按预期交互。集成测试检测诸如数据格式不一致和代码接口不兼容等问题。
  • 系统测试:涉及测试整个集成系统以确保它满足指定的需求。系统测试模拟真实场景,以验证软件在预期条件下的行为是否正确。
  • 冒烟测试:验证最关键的功能是否正常工作,以及软件是否准备就绪,可以开始进行其他测试。冒烟测试是一种快速检查软件基本功能的方法。
  • 回归测试:检查代码的更改是否会导致行为的任何意外变化。回归测试确保软件在修改后继续按预期运行。
  • 性能测试:评估软件在各种条件下的性能。性能测试测量诸如响应时间和资源使用量等标准,以识别瓶颈并优化性能。

模拟虽然不是一种独立的测试类型,但它是一种通过模拟依赖关系以隔离方式测试组件的机制。它有助于隔离和测试系统的特定部分,而不依赖实际组件。

上述类型的测试可以组合使用,以满足项目的具体需要。例如,您可以采用使用模拟的单元测试,或作为回归测试的集成测试。

软件测试的类型

探索每个工程师需要了解的七种基本软件测试类型,包括单元测试、烟雾测试、回归测试等。

示例:使用 MATLAB 进行单元测试

我们可以执行的最基本的测试是手动测试,例如在命令行中运行并测试输出是否按预期工作。然而,手动软件测试有局限性,并且容易出错。

您可以使用 MATLAB 单元测试框架来编写可重复的测试,而不是进行手动测试。

下面我们以 fibonacci 函数为例,了解如何进行简单的单元测试。

MATLAB 中软件测试的截图:突出显示创建单元测试的上下文菜单。

在 MATLAB 中右键点击一个函数以创建测试。

软件测试的 MATLAB 代码的截图:橙色框指示为单元测试类提供的值。

使用 MATLAB 进行软件测试:当您填入正确的值时,将为您创建一个测试类,并且可以运行测试以验证函数。

使用 MATLAB 测试浏览器创建单元测试很简单,它会计算创建的函数并将实际输出与预期输出进行比较以检查错误。

MATLAB 测试浏览器概述

了解如何使用测试浏览器进行迭代代码测试。此界面可简化您的测试和调试过程,帮助您更高效地完成从脚本编写到发布的整个过程。

这种简单的软件测试示例可确保您的函数返回预期的结果并自动验证输出。

软件测试最佳实践

尽可能自动化

自动化可以通过自动运行测试使您的测试过程更快并覆盖更大的范围。通过自动化重复和耗时的测试,您可以释放资源以重点关注更复杂的场景。自动化测试可以频繁且一致地运行,确保代码更改不会引入新 Bug。考虑使用与您的开发环境无缝集成的框架和工具,以简化软件测试过程。

在代码开发的同时编写测试

在代码开发过程中(而不是等到项目结束后)编写测试,有助于您尽早发现问题,并确保每段代码在开发时都被测试覆盖。这种做法会鼓励开发人员在实现功能之前考虑需求和设计,从而生成更稳健和可维护的代码。

三行图标,左侧列表示代码,右侧列表示对应的测试。

软件测试的最佳实践是同时编写测试和代码。

优先考虑测试覆盖率

并非所有代码都同等重要,也并非所有测试都同等重要。优先测试其他组件依赖的代码部分、具有复杂逻辑或以往容易出现 Bug 的代码部分。目标是采用平衡的方法,在避免测试过程负担过重的情况下实现足够的覆盖率。使用代码覆盖率工具来识别代码库中未经测试的部分,并重点关注这部分代码。

通过采用软件测试的上述最佳实践,团队可以提高软件的质量和可靠性,最终使项目更成功、用户更满意。


示例和操作方法


另请参阅: 持续集成