软件测试
软件测试(英文:软件 Testing)是根据软件开发各阶段的规格说明和程序的内部结构而设计一批测试用例,并利用这些测试用例来执行程序的过程。软件测试通过使用人工或自动的手段来运行软件系统,发现软件中存在的缺陷,从而保证软件质量。
软件测试伴随着软件的产生而产生,20世纪50年代,软件测试主要以调试为主,直到1957年,随着查尔斯·贝克(Charles Baker)所著图书《软件测试发展》的出版,才开始与调试区分开来。随着软件技术的发展,软件的复杂程度越来越高,软件测试的意义开始被重视,多名学者开始出版专著对软件测试的定义和目标进行描述。到了20世纪80年代,开发团队不再只是找出并修复软件错误,而是在现实环境中测试应用程序。20世纪90年代,软件行业开始迅猛发展,出现了从测试到更全面的质量保证流程的转变。整个测试的生命周期扩展为由计划、分析、设计、开发、执行和维护组成,即测试开始贯穿整个软件的生命周期。21世纪以来,软件质量的重要性得到了全球的认可,智能测试时代正式开启。
软件测试的方法有黑箱测试、白盒测试和灰盒测试等,按测试过程又可分为单元测试、集成测试、系统测试等。软件测试的目的不仅是简单地纠正软件的错漏,也是促使项目管理人员及时、准确地了解软件中潜在的漏洞与风险,从而在明确错误的基础上,采取有效的弥补措施,研究其产生的原因和相应的分布特征。
发展历程
软件测试是伴随着软件的产生而产生的,20世纪50年代,计算机刚诞生不久,英国计算机科学家艾伦·麦席森·图灵给出了软件测试的原始定义。他认为,测试是程序正确性证明的一种极端实验形式。但当时相对于软件开发而言,软件测试还处于次要位置。软件测试的含义比较狭隘,开发人员将测试等同于“调试”,主要针对机器语言和汇编语言。直到1957年,随着查尔斯·贝克(Charles Baker)所著图书《软件测试发展》的出版,才开始将其与调试区分开来,这也是软件测试史上一个重要的里程碑。
直到20世纪70年代,随着软件技术的发展,软件的复杂程度越来越高,软件测试的意义开始被重视。1972年,在北卡罗来纳大学举行了首届软件测试正式会议。1975 年,约翰·顾德那夫(John Good Enough)和苏珊·格哈特(Susan Gerhart)发表了名为《测试数据选择的原理》的文章,使软件测试得到了许多研究者的重视。1979 年,哥伦福德·迈尔斯(Glendford J.Myers)出版了软件测试领域非常重要的一本专著《软件测试的艺术》,该书中对软件测试的定义、目标等进行了描述。
到了20世纪80年代,人们的质量意识越来越高,开发团队不再只是找出并修复软件错误,而是在现实环境中测试应用程序。1983年,美国国家标准局提出了测试界很有名的两个名词:验证(Verification)和确认(Validation),即V\u0026V理论。同年,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安全测试、漏洞管理、配置扫描等
压力测试
压力测试是用于检查软件的可访问性和健壮性超出常规功能限制的测试,主要考虑关键软件,执行压力测试的主要目的是确认软件不会因缺少计算资源而崩溃、有助于确定软件应用程序在整个极端负载中的数据完整性,可以使用压力测试来发现硬件和数据损坏问题。
质量评估
软件质量特性
ISO/IEC 9126质量特性国际标准将质量属性归纳为6个质量特性,即功能性、可靠性、易用性、效率、可移植性和可维护性。
软件质量度量
软件产品的度量项包括四个方面,分别是规模、工作量、进度和质量缺陷。
软件缺陷
缺陷分类
软件缺陷是指在程序中存在的错误,如语法错误、拼写错误或一个不正确的程序语句等,按照定义,可以将软件缺陷分为文档缺陷、代码缺陷、测试缺陷和过程缺陷。
缺陷状态
缺陷状态是指缺陷通过一个跟踪修复过程的进展情况,从缺陷的初始状态开始,软件缺陷的状态共有十种,分别是:New、Open、Fixed、Close、Reopen等。
测试流程
软件测试的流程大致分为测试计划与控制、测试分析与设计、测试实现与执行、测试评估与报告和测试结束活动。
测试计划与控制
测试计划是描述了要进行的软件测试活动的范围、方法、资源和进度的文档;是对整个信息系统应用软件组装测试和确认测试安排。这个阶段确定测试项、被测特性、测试任务、谁执行任务、各种可能的风险等。实施测试计划可以有效预防计划的风险,保障计划的顺利实行。
测试分析与设计
测试设计阶段就是将测试计划阶段制定的测试需求进行细化分解为若干个可执行的测试过程,为测试工作的开展确立了目标、方向、策略、进度、风险控制等事项,主要体现在测试策略、测试方法的选取以及测试规程的设计上,即编写测试方案。测试方案主要是对测试需求进行细化,分析测试用例设计方法,规划测试环境以及对测试工具的选取等。
测试实现与执行
测试实现阶段主要根据测试方案设计来完成,包括测试脚本的开发和测试用例的写作,测试脚本通常用在自动化测试和性能测试中,根据自动化测试的目标、性能测试场景来开发相应的测试脚本,测试用例主要用来指导测试执行。在这个阶段,测试人员需要搭建和维护测试环境,保证测试执行环境和测试管理(配置管理、缺陷管理)的可用。
测试评估与报告
测试工程师根据缺陷的记录,进行分析与评估,主要分析缺陷的分布、密度以及发展趋势,还要分析软件在整个研发过程中引发缺陷的根本原因,最后编写缺陷报告,为软件产品的质量提供真实的数据依据。
测试结束活动
测试结束是在测试执行全部完成后,完成相关部门的检查归档工作,除了测试报告的写作之外,还要对测试中涉及到的所有文档、数据以及相关资料进行整理归档。
软件测试相关工具
常见的测试工具
缺陷管理工具
相关应用
应用于软件工程
软件工程项目需要精细化项目管理和集中项目管理两者协调统一。在进行软件工项目的整个实施过程中,无论是整体设计还是精细化管理,都需要软件测试参与其中,以测试角度对软件工程项目的设计和实施进行指导和辅助,从而纠正一些设计上的错误和细节上的缺陷。设立软件测试机构,能够对项目细分的各阶段、各模块进行软件测试,从而确保软件质量。
应用于Web开发
软件测试在Web开发中可以用来评估代码质量、检测软件功能、用户端测试反馈和内存检测等。由于软件开发过程中是使用多种语言共同编成的,可能在程序中存在很多细节方面的问题,软件测试能够将问题建立为一个资源库,通过分析资源库,避免类似错误的重复产生,为其他软件项目的研发提供借鉴,并且有效地解决代码冗多难以检查的难题,大大减少时间成本。
应用于信息工程建设
信息工程建设中软件测试工作是基于企业及单位网络平台构建需求提供的数据检测措施。凭借软件测试工作的全面性,巩固信息工程平台构建的稳定性,并确保系统运行具备可持续化的优势,同时能够提升整体维修人员的工作效率。应用在信息工程安全方面,软件测试可以保证信息工程建设的安全性,避免恶意系统的攻击,避免病毒的侵袭。
发展趋势
软件测试行业正在向智能测试、测试服务化等方向发展,以往的传统的手工测试满足不了对软件的要求,于是自动化测试开始出现。而大数据时代下,传统的软件测试平台达不到处理大规模数据的要求,云计算平台应运而生,它为软件测试提供强大支撑,提供了大量资源,测试者可以在短时间内使用云服务器进行大量测试。同时,云计算也能够在多种不同的环境下对软件进行测试,以保证软件的兼容性和可靠性,提供一个全面的软件测试环境。
此外,在2023世界人工智能大会上,用大模型测试大模型的技术趋势已经开始涌现。大规模测试技术可以通过机器自动化进行大部分的测试工作,提高了效率的同时,还能够更深入、更全面地理解软件的功能和性能,从而更准确地找出可能的问题和错误。
参考资料
什么是软件测试?.IBM.2024-01-31
软件质量发展历程, 大模型开启智能测试新时代.中国日报中文网.2024-01-31
Agile Testing Has Evolved! Trends To Watch In 2023.accelq.2024-02-04
Agile Testing.Safe Studio.2024-02-04
Static Testing VS Dynamic Testing – Key Differences.testsigma.2024-02-04
测试用例设计方法和系统. Google Patents.2024-02-01
什么是单元测试?.AWS.2024-02-01
User Acceptance Testing.Stanford University.2024-01-31
Functional Testing.JavaTpoint.2024-02-01
Difference Between Functional and Non-Functional Testing.JavaTpoint.2024-02-01
Why Non-Functional Testing.JavaTpoint.2024-02-01
Destructive Testing Techniques in Software Testing.testsigma.2024-02-01
蜕变测试研究进展及其在并行程序测试中的研究展望.软件学报.2024-02-01
Recovery testing.JavaTpoint.2024-02-01
SecurityTesting.Geekforgeeks .2024-02-01
Security Testing: Types, Tools, and Best Practices.Brightsec.2024-02-01
Stress Testing.JavaTponit.2024-02-01
软件缺陷管理.清华大学出版社.2024-02-18
JUnit Tutorial.tutorialspoint.2024-02-01
Apache JMeter™.Apache.2024-02-01
Introduction to Silk Test Workbench.microfocus.2024-02-01
FindBugs.The University of Texas at Austin.2024-02-01