知名百科 >> 软件测试 >> 历史版本
编辑时间历史版本内容长度图片数目录数修改原因
2024-05-08 10:50 最新历史版本 13618 1 8
  返回词条

软件测试

软件测试是根据软件开发各阶段的规范和程序的内部结构设计一批测试用例,并利用这些测试用例执行程序的过程。软件测试采用人工或自动的手段运行软件系统,发现软件中的缺陷,从而保证软件的质量。

软件测试是随着软件的出现而产生的。20世纪50年代,软件测试主要以调试为主,直到1957年,随着查尔斯·贝克《软件测试的发展》一书的出版,才开始与调试区分开来。随着软件技术的发展,软件的复杂度越来越高,软件测试的意义也开始受到重视。许多学者开始出版专著来描述软件测试的定义和目标。到了20世纪80年代,开发团队不再只是寻找和修复软件缺陷,而是在真实环境中测试应用程序。在20世纪90年代,软件行业开始快速发展,从测试转向更全面的质量保证过程。整个测试的生命周期扩展为由规划、分析、设计、开发、执行和维护组成,即测试开始贯穿整个软件生命周期。21世纪以来,软件质量的重要性得到了全球的认可,智能测试时代正式开启。

软件测试的方法包括黑盒测试、白盒测试和灰盒测试,根据测试过程又可分为单元测试、集成测试和系统测试。软件测试的目的不仅仅是简单地纠正软件错误和遗漏,更重要的是督促项目经理及时准确地了解软件中潜在的漏洞和风险,以便在明确错误的基础上采取有效的补救措施,并研究其原因和相应的分布特征。

目录

发展历史

软件测试伴随着软件的出现。20世纪50年代,计算机诞生后不久,英国计算机科学家图灵给出了软件测试的最初定义。他认为测试是证明程序正确性的一种极端实验形式。但在那个时候,软件测试相对于软件开发还处于次要地位。软件测试的含义相对狭窄,开发者将测试等同于“调试”,主要针对机器语言和汇编语言。直到1957年,随着查尔斯·贝克《软件测试的发展》一书的出版,它才开始与调试区分开来,这也是软件测试史上的一个重要里程碑。

直到20世纪70年代,随着软件技术的发展,软件的复杂程度越来越高,软件测试的意义开始受到重视。1972年,第一次正式的软件测试会议在北卡罗来纳大学召开。1975年,约翰·古德·奥弗和苏珊·格哈特发表了一篇题为《测试数据选择原则》的文章,引起了许多研究者的注意。1979年,Glendford J.Myers出版了一本在软件测试领域非常重要的书《软件测试的艺术》,书中描述了软件测试的定义和目标。

到了80年代,人们的质量意识越来越高,开发团队不再只是发现和修复软件错误,而是在真实环境中测试应用程序。1983年,美国国家标准局提出了测试领域两个著名的术语:验证和确认,即V&V理论。同年,IEEE提出的软件工程术语也对软件测试进行了定义,指出软件测试是通过人工或自动手段运行或测试一个软件系统的过程。

在20世纪90年代,软件行业开始快速发展,从测试转向更全面的质量保证过程。整个测试的生命周期扩展为由规划、分析、设计、开发、执行和维护组成,即测试开始贯穿整个软件生命周期。同时,软件规模的快速增长反映了人工测试的低效率,一些测试工具开始发展,提高了软件测试的自动化程度。

21世纪以来,软件质量的重要性已经得到全球的认可。世界各地的标准化组织开始为软件质量制定标准和最佳实践。随着人工智能和机器学习技术的发展,软件测试的方法也在不断改进,敏捷测试开始流行。它以小增量开发和测试系统,通常在编写代码、故事或功能之前。在软件测试工具方面,商业软件测试工具如捕获/回放工具、Web测试工具、性能测试工具、代码测试工具等大量涌现。2023年,在2023世界人工智能大会上,出现了大规模模型测试技术,可以更深入、更全面地了解软件的功能和性能,从而更准确地发现软件开发中可能出现的问题和错误。

测试原则

测试目的

软件测试的目的是检查被测系统是否满足规定的要求,或者找出预期结果与实际结果之间的差异。通过测试和分析错误的原因和趋势,促使项目经理及时准确地了解软件中潜在的漏洞和风险,以便在明确错误的基础上,采取有效的补救措施,研究其原因和相应的分布特征。最后,对软件的功能、性能和要求进行了验证。

测试原理

软件测试一般是从用户和开发者的角度进行的。通过测试,可以为开发者提供修改建议,从而为用户提供软件质量和合格的软件产品。测试原理可总结如下:

持续测试

尽早地、持续地进行测试可以充分地发现缺陷。IBM360操作系统的历史教训表明,缺陷修复的成本随着每个阶段的延迟而增加,软件缺陷的积累和放大效应是软件危机的最主要原因。此外,软件测试不应仅被视为软件开发的一个独立阶段,而应贯穿整个软件生命周期。

不完全覆盖:一个程序的完整测试意味着测试后不会发现其他软件错误,但这是不可能的。即使是小规模的软件或软件产品,逻辑路径和输入数据的组合也几乎是无限的,测试人员基本上不可能完全检查和覆盖测试对象。

避免开发人员自测:测试应该由独立的软件评估机构或测试团队来完成,而不是由开发人员来完成。这是因为开发人员有一定的思维定势,他们设计的测试用例偏向于使用正常数据,而测试需要异常数据和边界数据。

设计测试案例:测试用例是指执行条件和预期结果的集合,是为被测试内容确定的一组信息,是为获得最佳测试效果或高效暴露隐藏错误而设计的测试数据。测试用例应该涵盖合法和非法输入、边界条件和特殊条件,例如网络中断或电源故障。测试用例遵循“5C原则”:准确、清晰、简洁、完整、一致,从而揭示隐藏的错误。

安排测试计划:在软件测试前制定的测试计划中,要结合多种有针对性的测试方法,列出所有可利用的资源,建立明确的测试目标,本着严谨、准确的原则做好测试前的准备工作,避免测试的随意性。合理的测试计划有助于测试的顺利有序进行。

试验模型

v型

v模型体现了开发任务和测试任务是同等活动、同等重要的思想。V模型的左右两边构成了英文字母V的两边,左边代表软件开发过程,右边描述了相应的集成和测试过程。通过不断组合软件组件,形成一个更大的子系统。v模型将测试分为不同的层次,每个层次都有自己的主要测试关注点和不同的测试目的。主要开发活动包括用户需求、需求分析和系统设计、概要设计、详细设计和编码,相应的测试层次包括单元测试、集成测试、确认测试和系统测试及验收测试。

w模型

W模型在V模型的基础上,在软件开发的每个阶段增加了验证和确认活动,由两个V组成,分别代表开发和测试过程,避免了最初的设计错误带入代码后再进行验证,导致程序错误难以追溯的问题。它强调测试过程伴随着整个软件开发过程,测试对象不仅是可运行的程序,还包括软件需求规格说明、设计和源代码,有利于尽早发现软件设计过程中的问题。在W模式中,开发和测试活动都保持一种关系,只有前一阶段结束,才能正式开始下一阶段。

h模型

h模型将测试准备和测试执行分开,形成一个完全独立的过程。测试准备包括测试需求分析、测试计划、测试设计、测试用例以及测试验证,测试执行包括测试操作、测试报告、缺陷分析以及回归测试。当某个测试时间点准备好了,软件测试就会从测试准备阶段进入测试执行阶段,进行测试执行活动,不同的测试活动类会按照一定的顺序或者重复进行。

x模型

x模型强调单元测试和集成测试,是对V模型和W模型的改进。在X模型的左侧,针对单个的程序片段描述了单独的编码和测试,然后通过频繁的交接最终整合成可执行的程序。x模型还定位了探索性测试,探索性测试是一种特殊类型的没有事先计划的测试,可以帮助测试人员发现更多测试计划之外的软件错误。

检测方法

按测试状态分类

静态试验:静态测试是指在不运行程序本身的情况下,仅通过分析或检查源程序的语法、结构、过程和接口来检查程序的正确性。对需求说明书、软件设计说明书和源程序进行结构分析、流程图分析和符号执行,发现故障。静态测试包括代码检查、静态结构分析、代码质量度量等。静态测试从软件开发过程的早期开始,在开发的早期识别缺陷,从而帮助提高软件质量。

动态测试:动态测试是指运行被测程序,检查运行结果与预期结果的差异,分析运行效率、健壮性等性能。动态测试包括三个部分:构建测试用例,执行程序,分析程序的输出结果。动态测试是在编码和开发之后进行的,目的是验证软件在不同场景下的功能和行为。结果包括功能、基础、系统、性能和可用性测试。

按执行阶段分类

白盒测试:白盒测试侧重于程序的内部逻辑和结构,从开发者的角度直接测试源代码。其核心在于通过分析代码而不进行功能测试来发现潜在的缺陷或错误。这种测试方法可以彻底检查代码的每一个分支和路径,保证高代码覆盖率,但其缺点也很明显,比如不验证软件规格说明的正确性,对测试人员要求高。白盒测试的类型包括分支测试、路径测试和语句测试。在设计白盒测试的测试用例时,根据程序的内部逻辑结构,一般采用逻辑覆盖的方法来设计测试用例。常见的逻辑覆盖包括语句覆盖、判断覆盖、表达式覆盖、条件覆盖、判断条件覆盖、条件值组合覆盖和路径覆盖。

黑盒测试:黑盒测试侧重于被测软件的功能实现,被测对象的内部结构和操作对测试人员来说是不可见的。测试人员将被测软件系统视为一个黑盒,不需要关心盒子的内部结构和内部特征,只需要关注软件产品的输入数据和输出结果,从而检查软件产品是否符合其功能描述。与白盒测试相比,黑盒测试的测试数据更容易生成,但会造成程序路径的漏洞,难以发现复杂程序中隐藏的问题。黑盒测试用例的设计方法主要有等价类划分、边界值分析、决策表法、因果图分析等。

灰箱测试:灰盒测试是一种综合性的测试方法,介于白盒测试和黑盒测试之间。它不仅关注输出和输入的正确性,还关注程序的内部情况。灰盒测试是基于程序的主要功能和性能,测试方法主要是根据程序流程图、需求说明书和测试人员的实践经验设计的。

测试分类

按测试过程分类

单元测试:单元测试是检查代码的最小可测试部分的过程,它验证应用程序中的单个组件(通常是函数或方法)以确保其正确性。单元测试的目的是验证代码块是否按照开发人员预期的逻辑执行。在单元测试中,您通过提供输入值和检查输出结果的断言(真或假)来与代码块进行交互。

集成测试:集成测试是在单元测试的基础上,按照设计要求对所有模块进行集成的测试,主要验证模块之间的组装功能和接口是否安装正确,主要目的是检测软件与概要设计说明的符合程度。

系统测试:系统测试是将通过集成测试的软件系统与计算机硬件、外围设备、数据库、网络等其他要素相结合的一系列测试工作。在实际运行环境中,其目的是验证系统是否满足需求规约,找出与需求规约不一致或矛盾的地方,通常由独立的测试团队完成。

验收测试:验收测试是软件应用部署前的最后一项测试操作,分为正式验收测试(UAT)和非正式验收测试(α测试和β测试)。

回归测试:回归测试主要是指对软件测试或其他活动中发现的缺陷进行修改后的重新测试,目的是验证修改后缺陷是否得到了正确修复,同时需要关注是否引入了新的缺陷或其他代码是否存在缺陷或错误。

战略技术

功能和非功能测试:功能测试用于验证软件应用程序的功能。在功能可测试性中,通过给出值、确定输出和用期望值验证实际输出来测试每个功能,这涉及测试软件的特性和功能,如输入/输出、错误处理和用户界面。非功能性测试用于测试非功能性参数,侧重于软件的非功能性方面,如软件可靠性、负载测试、性能和责任。非功能测试的主要目的是根据非功能参数测试软件系统的读取速度。

特性试验:性能测试是指在一定的软件、硬件和网络环境下测试系统的各项性能指标,主要测试其特性是否能满足特性的性能要求。常见的性能指标包括并发、响应时间、每秒处理的事务数、吞吐量、点击率、访问量和硬件资源。

软件测试软件测试

自动化测试:自动化测试是一种允许计算机代替测试人员测试软件的技术。通过自动化测试工具或其他手段,按照测试工程师预定的计划进行自动化测试。软件测试自动化的原理和方法主要包括:直接静态和动态分析、测试过程的捕获和回放、测试脚本技术、虚拟用户技术和测试管理技术。基本的自动化测试框架包括模块化测试框架、测试库框架和关键字驱动或表格驱动的测试框架。

体积测试:容量测试是指检查系统在大数据量下运行时,即使是在最大或更多数据的测试环境下,系统是否会出现问题,即设置极限或极限值。容量测试是面向数据的,其目的是表明系统能够处理目标内确定的数据容量。

破坏性试验:破坏性测试(DT)通过将软件应用程序置于极端条件下来识别漏洞和弱点。该方法包括输入模糊测试、故障注入和压力测试等多种技术,系统地应用于评估软件在压力下的响应模式。通过模拟不利的场景,破坏性测试有助于发现和解决漏洞,从而增强软件应用程序的整体健壮性和安全性。

变态试验:变形测试(MT)可以通过验证程序执行结果是否满足某种“关系”来判断程序执行结果是否正确。该技术可以有效解决预期结果难以构建的问题。蜕变测试的过程包括筛选原始测试用例,构造一组蜕变关系,基于蜕变关系将原始测试用例转化为衍生测试用例,用原始和衍生测试用例执行程序两次,判断程序的正确性。

更新试验:恢复测试是测试工程师对应用程序进行测试,以检查软件或应用程序从灾难或崩溃中恢复的程度,从而验证应用程序在经历任何软件、硬件崩溃或网络故障后,可以多快、多好地改进或学习软件的功能。

安全试验:安全测试用于发现系统中的漏洞,并确定系统的数据和资源是否受到保护,以防可能的入侵者。安全测试包括渗透测试、应用安全测试、API安全测试、漏洞管理、配置扫描等。

压力测试:压力测试是用来检查软件超出正常功能限制的可访问性和健壮性的测试,主要考虑关键软件。压力测试的主要目的是确认软件不会因为计算资源不足而崩溃,有助于确定软件应用在整个极端负载下的数据完整性。压力测试可用于发现硬件和数据损坏问题。

测试流程

软件测试的过程大致可以分为测试计划和控制、测试分析和设计、测试实现和执行、测试评估和报告以及测试结束活动。

测试计划和控制:测试计划是描述要进行的软件测试活动的范围、方法、资源和进度的文件;是对整个信息系统应用软件进行组装测试和确认测试的安排。这个阶段确定测试项目、要测试的特性、测试任务、谁执行任务、各种可能的风险等。测试计划的实施可以有效防范计划的风险,保证计划的顺利实施。

测试分析和设计:测试设计阶段是将测试规划阶段制定的测试需求细分为若干个可执行的测试流程,为测试工作的开展确立目标、方向、策略、进度、风险控制等事项,主要体现在测试策略的选择、测试方法和测试程序的设计,即编写测试计划。测试计划主要是细化测试需求,分析测试用例的设计方法,规划测试环境,选择测试工具。

测试实施和执行:测试实施阶段主要根据测试方案的设计完成,包括测试脚本的开发和测试用例的编写。测试脚本通常用于自动化测试和性能测试,根据自动化测试和性能测试场景的目标开发相应的测试脚本,测试用例主要用于指导测试执行。在这个阶段,测试人员需要构建和维护测试环境,以确保测试执行环境和测试管理(配置管理和缺陷管理)的可用性。

测试评估和报告:测试工程师根据缺陷的记录进行分析和评估,主要分析缺陷的分布、密度和发展趋势,同时也分析软件整个研发过程中产生缺陷的根本原因,最终编写缺陷报告,为软件产品的质量提供真实的数据依据。

测试结束活动:测试结束是指测试执行完成后,完成相关部门的检查和备案工作。除了撰写试验报告外,所有与试验有关的文件、数据和相关资料都应整理归档。

相关应用

应用于软件工程:软件工程项目需要精细化项目管理和集中化项目管理的协调统一。在软件工程项目的整个实施过程中,无论是整体设计还是精细化管理,都需要软件测试从测试的角度来指导和辅助软件工程项目的设计和实施,从而修正一些设计错误和细节缺陷。软件测试机构的建立可以在项目细分的各个阶段和模块对软件进行测试,从而保证软件质量。

应用于Web开发:软件测试可以在Web开发中用于评估代码质量、检测软件功能、测试来自客户端的反馈以及内存检测。因为软件开发过程是用多种语言编写的,所以程序中可能会有很多细节上的问题。软件测试可以将问题构建到资源库中。通过对资源池的分析,可以避免类似错误的重复,为其他软件项目的研发提供参考,有效解决代码冗余和不易检查的问题,大大降低时间成本。

应用于信息工程建设:信息工程建设中的软件测试是基于企业和单位网络平台建设需要的数据检测措施。有了软件测试的全面性,可以巩固信息工程平台建设的稳定性,保证系统运行具有可持续性的优势,同时提高整体维护人员的工作效率。将软件测试应用于信息工程安全领域,可以保证信息工程建设的安全性,避免恶意系统和病毒的攻击。

标签