什么是软件测试?

两位开发人员在笔记本电脑上一起编码

作者

Stephanie Susnjara

Staff Writer

IBM Think

Ian Smalley

Staff Editor

IBM Think

什么是软件测试?

软件测试是评估和验证软件产品或应用程序能否根据其特定要求正确、安全且高效运行的过程。

健壮测试的主要优点包括通过识别错误和提高性能来交付高质量软件。

如今,在敏捷转型、DevOps持续整合/持续交付 (CI/CD) 管道的共同推动下,软件测试已深度嵌入现代开发实践。测试不再是发布前的最后一步,而是早在设计规划阶段就已启动,并在部署后持续进行。

这种测试方法支持更快的发布并降低快速变化的 IT 基础设施环境中的风险。左移测试(即在开发周期的早期开始测试)之类的做法可以帮助团队更快地发现问题。右移测试侧重于生产中的监控和验证,使团队能够更快地适应现实世界的使用。

现代软件测试战略将继续与自动化人工智能 (AI)云原生架构(例如微服务)的进步协同发展。随着软件变得越来越复杂和发布周期的加快,智能测试变得越来越普遍。

Fortune Business Insights 的一份报告显示,2024 年,全球 AI 测试的市场规模高达 8.567 亿美元。预计该市场将从 2025 年的 10.109 亿美元增长到 2032 年的 38.24 亿美元,预测期内的复合年增长率 (CAGR) 为 20.9%。1

辅以专家洞察分析的最新科技新闻

通过 Think 时事通讯,了解有关 AI、自动化、数据等方面最重要且最有趣的行业趋势。请参阅 IBM 隐私声明

谢谢!您已订阅。

您的订阅将以英语提供。每份时事通讯都包含取消订阅链接。您可以在此管理您的订阅或取消订阅。更多相关信息,请参阅我们的 IBM 隐私声明

软件测试历史

软件测试伴随软件工程的发展而诞生,后者兴起于二战结束后。计算机科学家 Tom Kilburn 被认为是编写第一款软件的人,该软件于 1948 年 6 月 21 日在英国曼彻斯特大学首次亮相。它使用基本机器代码指令执行数学计算。

在早期,调试是主要的测试方法,并且在接下来的二十年里一直如此。到了 20 世纪 80 年代,开发团队开始不再仅仅关注如何隔离和修复软件错误。他们开始在现实环境中测试应用程序,以确保更广泛的功能和可靠性。

这种转变标志着更广泛的测试观点的开始,即强调质量保证是关键的关注点。它成为软件开发生命周期 (SDLC) 的一个组成部分;SDLC 是团队用来创建高质量、经济高效和安全的软件的结构化流程。

20 世纪 90 年代和 21 世纪初,自动化测试开始兴起,同时还出现了测试驱动开发 (TDD) 等新实践。在此期间,模块化编程技术,例如将软件组织为模块的面向对象编程 (OOP) 也越来越受欢迎。这种模块化设计使为一小部分代码编写有针对性的测试(称为单元测试)变得更加容易。移动设备和 Web 应用程序的扩展进一步呼唤着新的测试战略,包括性能、可用性和安全测试。

在过去的十年中,敏捷方法和 DevOps 开发运维的进步从根本上改变了团队构建和交付软件的方式。测试已经变得持续、自动化并集成到开发和部署的每个阶段。当今许多组织利用专有和开源自动化工具以及持续测试平台(例如 Katalon Studio、Playwright、Selenium)来实现质量保证。这些工具还帮助他们获得速度、可扩展性和客户信任。

应用程序开发

开启旅程:云端企业应用程序开发

在本视频中,Peter Haumer 博士通过演示不同的组件和实践(包括 IBM Z Open Editor、IBM Wazi 和 Zowe),探讨了混合云环境中现代企业应用程序的开发现状。

为什么软件测试很重要?

在当今高度互联的世界中,软件缺陷所造成的后果比以往任何时候都更为严峻。延迟交付或软件缺陷可能会损害品牌声誉,引发客户满意度下降和负面情绪。在极端情况下,错误或缺陷可能会降低互连系统性能或导致严重故障。

不妨一同回顾 2024 年 7 月达美航空 (Delta Air Lines) 的相关事件。网络安全公司 CrowdStrike 的软件更新存在缺陷,导致 Microsoft Windows 平台上大范围出现系统崩溃。在美国各大航空公司中,达美航空所受的运营影响最为严重:数千次航班被取消,预计损失超过 5 亿美元。2此次事件凸显了全面测试的重要性,尤其是在将第三方软件集成到任务关键型系统时。

尽管测试本身会产生成本,但通过实施有效的测试技术和 QA 流程,公司每年可以节省数百万美元的开发和支持费用。早期软件测试可在产品投放市场前发现问题。开发团队越早收到测试反馈,他们就可以越早解决关键问题,例如:

  • 架构缺陷
  • 设计决策失误
  • 功能无效或不正确
  • 安全漏洞
  • 可扩展性问题

如果开发为测试留出足够的空间,则会提高软件可靠性,并交付错误更少的高质量应用程序。满足或超出客户期望的系统可以增加销售额、扩大市场份额并改善用户体验

手动测试与自动测试

软件测试主要分为两大类:

  • 手动测试
  • 自动化测试

手动测试

手动测试指的是测试人员在不依赖自动化工具辅助的情况下,手动执行测试用例的过程。测试人员会执行点击按钮、输入文本和验证输出等操作,以模拟最终用户与软件的交互方式。

手动测试通常用于探索性测试、可用性测试,以及应用程序规模较小而无需进行自动化测试的场景。

自动化测试

自动化测试使用脚本和工具自动对软件执行测试。这种基本方法有利于重复性测试任务,以及需要多次执行相同测试的大型系统。

自动化测试可确保可以更快、更一致地测试软件。它还可以减少人为错误并提高测试效率。

软件测试级别

通常,软件测试发生在软件开发生命周期中的四个不同级别或阶段,每个级别或阶段都侧重于应用程序的特定部分:

  • 单元测试
  • 集成测试
  • 系统测试
  • 验收测试
单元测试

单元测试验证每个软件单元是否按预期方式运行。单元是应用程序中的最小可测试组件。

集成测试

集成测试确保软件组件或函数有效地协同工作。

系统测试

系统测试需要整个系统的端到端性能。这一阶段包括功能测试、非功能测试、接口测试、压力测试和恢复测试。

验收测试

验收测试验证整个系统是否按预期方式工作。

软件测试类型

有许多不同类型的软件测试属于前面讨论的级别,通常可以分为两大类:

  • 功能测试验证软件应用程序是否按照指定要求运行。
  • 非功能测试评估软件在各种条件下(例如负载、压力或不同环境)下的性能。

以下列表概述了每个类别中的常见测试类型。

功能测试类型

  • 白匣测试:白匣测试涉及基于对所测试软件内部结构、逻辑和功能的了解进行测试。
  • 黑匣测试:在黑匣测试中,测试人员不掌握任何有关软件系统内部运作的信息。
  • 临时测试:在临时测试中,测试人员不按照预定义的测试或文档尝试破解或查找应用程序中的错误。
  • 探索性测试:探索性测试可帮助软件测试人员发现可能导致软件错误的难以预测的场景和情况。
  • 回归测试:回归测试检查新功能是否会破坏或降低现有功能。它可确保最近的更改不会引入新的缺陷。
  • 健全性测试:健全性测试评估特定功能是否按预期方式工作。在没有时间进行完整回归测试时,测试人员可以使用它来验证表面级别的菜单、功能和命令。
  • 冒烟测试:冒烟测试是一种初步软件测试过程,用于检查应用程序的基本功能是否正常。它有助于确保构建版本足够稳定,以支持后续测试。
  • 用户验收测试 (UAT):用户验收测试 (UAT) 是由最终用户执行的特定类型的验收测试,用于确认系统满足他们的需求并能在实际场景中运行。

非功能性测试类型

  • 恢复测试:恢复测试可验证软件如何响应以及从故障中恢复,从而确保正确恢复数据和进程。
  • 性能测试:性能测试是指软件在不同工作量下的运行情况。
  • 负载测试:负载测试(一种性能测试)评估实际负载均衡条件下的性能。
  • 压力测试:压力测试检查系统在发生故障前所能承受的压力。
  • 安全测试:安全测试可验证软件是否容易遭受黑客攻击或存在其他恶意漏洞。
  • 可用性测试:可用性测试验证客户使用系统用户界面高效、直观地完成任务的能力。
  • 兼容性测试:兼容性测试可检查软件应用程序在各种设备、操作系统、浏览器和网络环境中是否按预期运行。

软件测试最佳实践

有效的软件测试始于可靠的测试计划,该计划概述了整个生命周期中验证软件所需的范围、方法和资源。

为了在复杂环境中进行扩展和适应,测试团队依赖强大的测试框架。该结构支持自动化,与 CI/CD 管道集成并支持跨平台和环境的持续验证。此类框架支持测试的所有阶段,包括测试设计、测试执行和结果分析,帮助团队更早地检测问题、降低风险并缩短发布时间。代码审核在质量保证方面也发挥着关键作用,使团队能够及早发现缺陷,并在测试开始之前执行编码标准。

测试可能会耗费很多时间。对于小型内部版本,手动测试或临时测试可能就足够了。但是,对于较大的系统,通常使用工具自动执行任务。自动化测试帮助团队实施不同的场景,测试差异化因素(例如,将组件移到环境中),并快速获得哪些因素有效哪些无效的反馈。

可靠的测试方法涵盖应用程序编程接口 (API)、用户界面和系统级别。自动化且尽早运行的测试越多越好。一些团队构建内部测试自动化工具。但是,供应商解决方案提供的功能可以简化关键测试管理任务,例如:

  • 持续测试:持续测试中,项目团队会在每个构建版本就绪后对其进行测试。此类软件测试依赖与部署流程集成的测试自动化,通常可作为持续部署的组成部分。该测试可以在开发过程的初期阶段验证真实测试环境中的软件,从而改进设计并降低风险。
  • 配置管理:组织集中维护测试资产,并跟踪正在测试的软件构建。团队可以访问代码、需求、设计文档、模型、测试脚本和测试结果等资产。强大的系统包括用户身份验证和审计跟踪,以帮助团队以最少的管理工作量满足合规性要求。
  • 服务虚拟化:测试环境可能不可用,尤其是在代码开发早期。服务虚拟化模拟缺失或尚未完成的服务和系统,以使团队能够减少依赖并尽早进行测试。他们可以重复使用、部署和更改配置以测试不同的场景,而无需修改原始环境。
  • 缺陷或错误跟踪:监控缺陷和错误跟踪对于测试和开发团队至关重要,因为他们能够衡量和提高软件质量。通过使用自动化工具,团队可以跟踪缺陷,衡量其范围和影响并发现相关的问题。
  • 指标和报告:报告和分析使团队成员能够分享状态、目标和测试结果。高级测试工具集成项目指标,并在仪表板中显示结果。团队可以快速查看项目的整体运行状况,并且可以监控测试、开发和其他项目元素之间的关系。

软件测试的未来

随着软件开发步伐的加快和系统的日益复杂,软件测试也持续同步发展。以下是塑造测试未来的一些关键趋势。

低代码和无代码测试

随着低代码无代码平台继续普及,新的软件测试工具也在不断涌现,以满足非技术用户的需求。这些工具简化了测试流程,使业务用户能够轻松地在他们构建的应用程序上创建和运行测试。此能力可加快产品上市时间,且无需技术专业知识。

IoT 和边缘测试

物联网 (IoT) 设备的快速扩张,为现实条件下测试连接性、安全性和性能带来了独特的挑战。随着越来越多的设备依赖边缘计算,测试工具必须模拟不同的环境,以确保软件能够在各类网络条件下实现可靠运行。

5G 和超低延迟测试

5G 问世以来,自动驾驶、远程医疗等需要超低延迟的应用场景均需进行专项测试。验证高速、低延迟条件下的性能已成为移动和边缘应用程序的关键测试环节。

AI 驱动的预测和自我修复系统

由 AI 驱动的自我修复系统可以检测并自动修复小问题,从而减少停机。由机器学习 (ML) 驱动的预测性测试则支持团队预测潜在故障并在其造成生产中断之前加以解决,从而提高软件的弹性和可靠性。

测试中的生成式 AI

生成式 AI 已成为软件测试的有力工具。通过使用先进的机器学习技术,生成式 AI 模型可以根据软件行为创建动态测试用例。这些模型会自动生成人类测试人员可能会忽略的新场景,最终提高测试覆盖率和软件可靠性。

相关解决方案
IBM Enterprise Application Service for Java

完全托管的单租户服务,用于开发和交付 Java 应用程序。

深入了解 Java 应用程序
DevOps 解决方案

使用开发运维软件和工具,在多种设备和环境中构建、部署和管理云原生应用程序。

深入了解开发运维解决方案
企业应用程序开发服务

云应用程序开发意味着一次构建、快速迭代和随处部署。

应用程序开发服务
采取后续步骤

借助 IBM 云应用程序开发咨询服务,您可以获得提供专家指导和创新解决方案,使您的云策略更为精简高效。与 IBM 的云专家合作,实现应用程序的现代化改造、扩展和加速,为企业带来变革性的成果。

深入了解应用程序开发服务 开始免费使用 IBM Cloud 进行构建