假设您正在显微镜下观察一个软件系统:最初以最高倍率聚焦于单元。这是软件系统的基本构建模块。随后视野逐渐扩大至下一放大级别——由独立单元组成的模块。最终完全缩小视野后,便抵达系统层级。在此放大级别下,您能观察系统内所有内容,以及模块构建的各组件如何协同工作。
从某些方面看,系统测试类似于这种微观观察——但存在关键差异。系统测试属于黑盒测试形式,这意味着测试人员关注的重点并非系统组件的内部结构,而是系统的整体功能。从这种“通过/未通过”的视角出发,系统行为仅在与系统性能相关时才值得关注。(白盒测试则能更清晰地展现系统内部组件的特性。)
系统测试通常涉及对多个独立软件系统的分析,这些系统在特定软件系统中可能协同运行,也可能独立运作。
不妨回想航天发射前的倒计时场景。虽然大家都记得点火升空前的戏剧性十步倒计时,却鲜有人注意到飞行主管对各部门的逐项检查,以及各部门负责人依次回应“就绪”的肯定答复。在典型航天发射中,任务指挥部会逐一征询各部门主管关于计划操作、任务安全、运载系统、预期天气状况等众多事项的意见。每个部门都会接受问询,各部门主管依次作出响应。
类似地,系统测试可视为新软件系统发布前的最终检查清单。此时所有已知软件缺陷的最后一轮清理工作已完成。正如早期航天先驱开创的历史性检查清单,最终取决于系统测试中每个“部门”的确认就绪信号。
每个检查项都围绕系统功能展开:
在讨论系统测试时,我们自然会触及依赖关系这一主题——即测试用例中存在的关联性。此类情况下,某个测试用例的结果可能部分或完全依赖于其他测试用例的结果。依赖关系还可能涉及功能、测试环境或安全策略,甚至可能影响组织实施的整个测试流程。
系统测试方法并不深入探究其内部运作机制(需谨记此为黑盒测试形式),而是用于验证特定应用程序是否正常运行。系统测试的核心目的在于:通过评估软件应用程序的整体功能,帮助定位漏洞、错误或缺失的需求。
系统测试通常在集成测试之后、验收测试之前执行,以此确保所有组件能正确协同工作。正如我们将要看到的,它往往同时涵盖系统的功能性与非功能性维度。基于严格的功能范畴与广泛的非功能领域,系统测试会涉及可用性、安全性和性能等多元层面。
系统测试的主要目的之一是验证软件的编程语言能否被转化为可用的程序。然而系统测试的根本目标在于确保被测试软件能够有效支撑目标用户群体的业务需求。
测试过程需要模拟实际将使用的生产环境,以保证软件在真实多变条件下仍能按需运行。同样,测试数据也需模拟真实场景的数据与情境。测试用例执行后,即可定位并修复软件中的缺陷。
系统测试可分为三大主要类别。第一种是功能测试,它关注系统性能,但仅旨在验证软件是否按承诺运行,不进行更深层次的探究。以下是功能测试的主要类型:
虽然功能测试能提供关键信息,但这些数据本质上仅能判断系统是否按预期运行。这忽略了大量相关变量——例如系统安全性、用户体验与性能表现等维度。
非功能系统测试则提供了评估系统运行状况的途径。功能测试与非功能测试的本质区别可简化为以下对比:
基于此,以下是非功能系统测试的关键形式:
尽管其他类型的系统测试不属于功能测试或非功能测试类别,但仍然很有用。以下是这些方法论中最值得关注的几种:
尽管系统测试过程提供了最全面的黑盒性能测试方案,但执行系统测试并非没有潜在问题:
系统测试需满足的需求种类繁多——无论是组织特有的业务需求、软件独有的功能需求,还是可能适用于其运行的特定需求。事实上,操作系统需要吸纳的系统需求似乎永无止境。频繁变更的需求可能导致系统测试受阻,使其仅能完成不完整的测试用例集。
最后期限在商业环境中可能造成严重干扰,这已是共识。当工作进度与时间表预期产生冲突时,期限压力产生的严峻影响众所周知。在软件开发中,期限压力具体表现为:充分适当的系统测试常被压缩,要么以不完整的方式执行,要么被完全忽略。这往往导致在软件开发生命周期后期需要进行返工测试。
系统测试既非在真空中进行,也非无需成本。这需要测试团队的专业技能、辅助劳动的测试工具,以及首要的充足预算支撑。若缺乏这些要素,就容易出现偷工减料的情况,导致测试不完整。若上述任一环节被更改或取消,都可能对该软件应用程序或软件产品的系统测试最终达成的测试覆盖率产生负面影响。
测试过程中能够评估许多潜在漏洞,但软件工程人员必须在其所处测试环境受控且获得支持的前提下才能完成这些评估。当测试人员处于不稳定的工作环境时,更容易遗漏潜在的软件缺陷。即便在不稳定环境中发现需要修复的程序错误,测试人员后续复现这些问题的难度也会显著增加。
当任务涉及软件质量保证时,审查计算机代码行是项艰巨的工作,可能变得冗长耗时。若测试人员、开发人员及其他利益相关者之间出现沟通断层,会使这项工作更加棘手。正如任何商业活动一样,沟通问题会引发误解,形成缺陷难以被发现并在操作系统中扎根的生产环境。
测试技术多种多样,测试结果也形态各异——从易于理解的测试数据,到在测试阶段及后续需要严格管理的庞大复杂数据集。当测试环境无法完全复刻生产环境时,项目复杂程度会进一步加剧。软件开发过程中实施的测试策略需充分考虑如何最优应对这些问题。
完全托管的单租户服务,用于开发和交付 Java 应用程序。
使用开发运维软件和工具,在多种设备和环境中构建、部署和管理云原生应用程序。
云应用程序开发意味着一次构建、快速迭代和随处部署。