软件测试的概念

软件的产生过程,如下图所示:

软件测试是指在预定的条件下执行程序,以此发现潜在的缺陷,并确保软件系统按照设计和预期的方式运行。测试的目标不仅仅是找出错误,更是为了验证软件是否符合规格和满足用户需求。

软件测试的目的是确保软件系统符合预期的需求,并能在不同的使用情境下表现良好。因为,我们需要通过不同的软件测试类型,全面验证软件的功能性、性能、安全性和兼容性,为用户提供一个可信赖的软件产品。

评判一个软件是否优秀可从功能性性能兼容性易用性、可靠性、安全、可维护性、可移植性这 8 个维度来衡量

软件测试主流包含功能测试接口测试自动化测试性能测试

在进行软件测试时,我们要遵循一些基本原则,以确保测试的有效性和全面性。这些原则包括:

  • 全面性(Exhaustiveness):测试应该覆盖软件的所有功能和情况,确保每个方面都经过验证。
  • 独立性(Independence):测试过程应该独立于开发过程,以确保独立的视角和避免潜在的偏见。
  • 可重复性(Repeatability):测试过程应该是可重复的,以便在发现问题时能够准确地重现并分析。
  • 尽早测试(Early Testing):测试应该在开发早期开始,以便在问题变得更加显著和昂贵之前就能够发现和解决它们。

测试生命周期是指测试活动从计划阶段到测试执行、分析和报告的整个过程。它包括以下阶段:

  • 计划和准备阶段:在项目开始之前,确定测试的范围、目标和资源需求,并制定测试计划。
  • 设计阶段:开发测试用例和测试数据,确保测试覆盖到所有关键功能和场景。
  • 执行阶段:执行测试用例,记录测试结果,并识别潜在的缺陷。
  • 分析和报告阶段:分析测试结果,生成测试报告,并协助开发团队解决发现的问题。

通过理解这些基本概念,我们能够更好地理解软件测试的整体框架,为后续深入讨论不同软件测试的分类和方法奠定基础。

软件测试模型

软件测试模型是软件测试和开发阶段的对应关系,能够用来指导软件测试的整个过程,而常见的软件测试模型包括:V 模型、W 模型、H 模型、X 模型和前置模型,其中V 模型是最具代表性的软件测试模型,需要掌握,其余了解即可。

V 模型

RAD(Rapid Application Development,快速应用开发)模型是软件开发过程中的一个重要模型,通过开发和测试同时进行的方式来缩短开发周期,以提高开发效率。因其形状像一个字母V,故称为V模型。

V模型是一个著名的、以测试为驱动的开发模型,该模型强调开发过程中测试贯穿始终,是瀑布模型的一个变体。V模型描述了质量保证活动和沟通、建模相关活动以及早期构键相关的活动之间的关系。随着软件团队工作沿着V模型左侧步骤向下推进,基本问题需求逐步细化,形成问题及解决方案的技术描述。一旦编码结束,团队沿着V模型右侧的步骤向上推进工作,其实际上是执行了一系列测试(质量保证活动),这些测试验证了团队沿着V模型左侧步骤向下推进过程中所生成的每个模型。V模型提供了一种将验证确认活动应用于早期软件工程工作中的方法

V 模型包含了底层测试和高层测试,清楚标识了开发和测试的各个阶段:自上而下求精,对每个阶段都分工明确,方便把控整体项目。但也因为它的自上而下,导致缺陷到测试阶段才被发现,甚至很难发现;在开发过程中,也很难把握用户的需求,使得 V 模型步骤反复执行,返工量大,灵活度低。这时可以在每个阶段都加入适量的迭代进行改良。

底层测试:检测源代码质量,如单元测试;高层测试:检验整个系统的测试。
迭代:重复反馈过程的活动,每一次迭代的结果会作为下一次迭代的初始值。

一般来讲:单元测试所对应的是详细设计环节,也就是说,单元测试的测试用例是和详细设计一起出现的,在研发人员做详细设计的时候,相应的测试人员也就把测试用例写了出来;集成测试对应概要设计,在做模块功能分析及模块接口,数据传输方法的时候,就把集成测试用例根据概要设计中模块功能及接口等实现方法编写出来,以备以后作集成测试的时候可以直接引用;而系统测试,就是根据需求分析而来,在系统分析人员作系统分析,编写需求说明书的时候测试人员就根据客户需求说明书,把最后能实现系统功能的各种测试用例写出来,为做最后系统测试作准备。验收测试与用户需求对应,是非设计流程。

V模式是一种传统软件开发模型,一般适用于一些传统信息系统应用的开发,而一些高性能高风险的系统、互联网软件,或一个系统难以被具体模块化的时候,就比较难做成V模式所需的各种构件,需要更强调迭代的开发模型或者敏捷开发模型。

参考:软件测试模型——V模型 & W模型深究递归和迭代的区别、优缺点及实例对比测试模型—V模型软件生存周期模型之V模型

W 模型

W 模型也称之为双 V 模型,一个 V 是开发的生命同期,另一个 V 是测试的生命周期,W 模型与 V 模型有一个很大的不同,就是 ** W 模型是一个并行的模型,V 模型是一个串行的模型**,W 模型开始是从用户需求分析开始,而不是等到编码完成后。并且测试阶段的划分更清楚,而不仅仅是单元测试、集成测试、系统测试,还包括前期的测试计划、测试方案等内容,这更符合现在企业测试的流程。

W 模型有利于尽早全面地发现问题。从用户需求分析开始测试工程师就参与到项目的测试中,当用户需求分析完成后,测试工程师就需要参与到需求的验证和确认活动中,并需要提供可测试性用户需求分析说明书,这样可以尽早地发现需求阶段的缺陷。同时,对需求的测试也有利于及时了解项目难度和测试风险,及早制定应对措施,这将显著减少总体测试时间,加快项目进度。但 W 模型也存在局限性,需求、设计、编码等活动被视为是串行的,同时,测试和开发活动也保持着一种线性的前后关系,上一阶段完全结束,才可正式开始下一阶段工作,这样就无法支持迭代的开发模型。对于当前软件开发复杂多变的情况,W 模型并不能解除测试管理面临的困惑。

  • 需求分析阶段,测试人员需要与开发人员共同参与需求讨论,确保对需求的理解准确无误。同时,测试人员应从测试角度提出疑虑和建议,以便在后续测试过程中顺利地发现问题和缺陷。在需求确定后,测试人员需要根据需求分析结果制定测试计划和测试用例。
  • 设计阶段,测试人员需要关注设计合理性和可测试性,对设计中可能存在的问题提出反馈。此时,测试人员应参与到设计评审中,以确保设计符合需求和测试要求。
  • 编码阶段,测试人员应关注代码质量,通过单元测试、集成测试和系统测试等手段,发现并修复代码中的缺陷。同时,测试人员还应与开发人员保持密切沟通,确保缺0陷修复的及时性和准确性。

在 W 模型中,开发人员和测试人员不再是独立的个体,而是紧密结合成一个团队。开发人员需要根据测试人员的需求,提供合适的接口和工具支持,以便测试人员能够更高效地进行测试。同时,开发人员还需要积极参与缺陷修复工作,确保问题能够及时解决。测试人员则需要根据开发进度,合理安排测试资源和时间,确保测试工作的有效性和及时性。在发现缺陷时,测试人员应快速反馈给开发人员进行修复,并跟进修复进度,确保问题得到及时解决。

通过这种方式,开发与测试在W模型中相互支持、相互影响。不仅提高了软件质量和可靠性,还提高了开发效率。

H 模型

H模型将测试活动完全独立出来,形成一个完整的流程,同时将测试准备和测试执行清晰表现出来:

  • 测试准备:所有测试活动的准备判断是否到测试就绪点。
  • 测试就绪点:测试准入准则,即是否可以开始执行测试的条件。
  • 测试执行:具体的执行测试的程序。
  • 其它流程:回归测试、冒烟测试、探索性测试。

H 模型让软件测试完全独立贯穿整个生命周期与其它流程并发进行,使得其可以尽早准备尽早执行,灵活性很强。同时也揭示了除测试执行外,还应有其他工作要处理,并且能根据被测对象的不同而分层次、分阶段、分次序的执行,同时也是可以被迭代。

H 模型要定义清晰的规则和管理制度,否则测试过程将很难管理和控制(管理型要求高),也要求能够很好的定义每个迭代的规模,不能太大也不能太小(技能要求高)。并且测试很多时候,你并不知道测试准备到什么时候是合适的,就绪点在哪,就绪点标准是什么,对后续的测试执行启动带来很大的困难(测试就绪点分析困难)。当被分了一个很小的迭代时,因人员技能不足而无法完成,会使整个项目会受到很大的干扰(对整个项目组的人员要求非常高)。

X 模型

X 模型也是对 V 模型的改进,X 模型的左边描述的是针对单独程序片段所进行的相互分离的编码和测试,此后将进行频繁的交接,通过集成,最终成为可执行的程序,然后再对这些可执行程序进行测试。己通过集成测试的成品可以进行封装并提交给用户,也可以作为更大规模和范围内集成的一部分。多根并行的曲线表示变更可以在各个部分发生。

X 模型定位了探索性测试,这是不进行事先计划的特殊类型的测试,这一方式往往能帮助有经验的测试人员在测试计划之外发现更多的软件错误。但这样可能对测试造成人力、物力和财力的浪费,对测试员的熟练程度要求比较高。

前置模型

开发和测试相结合:前置测试模型将开发和测试的生命周期整合在起,标识了项目生命周期从开始到结束之间的关键行为。并且标识了这些行为在项目用期中的价值所在。如果其中有些行为没有得到很好的执行,那么项目成功的问能性就会因此而有所降低。如果有业务需求,则系统开发过程将更有效率。我们认为在没有业务需求的情况下进行开发和测试是不可能的。而且,业务需求最好在设计和开发之前就被正确定义。

对每一个交付内容进行测试:每一个交付的开发结果都必须通过一定的方式进行测试。源程序代码并不是惟一需要测试的内容。图中的椭圆框表示了其他一些要测试的对象,包括可行性报告、业务需求说明,以及系统设计文档等。这同V模型中开发和测试的对应关系是一致的,并且在其基础上有所扩展,变得更为明确。

在设计阶段进行测试计划和测试设计:设计阶段是作测试计划和测试设计的最好时机。很多组织要么根本不作测试计划和测试设计,要么在即将开始执行测试之前才飞快地完成测试计划和测试设计。在这种情况下,测试只是验证了程序的正确性,而不是验证整个系统本该实现的东西。

测试和开发结合在一起:前置测试将测试执行和开发结合在起,并在开发阶段以编码一测试一编码一测试的方式来体现。也就是说,程序片段一旦编写完成,就会立即进行测试。一般情况下,先进行的测试是单元测试,因为开发人员认为通过测试来发现错误是最经济的方式。但也可参考X模型,即一一个程序片段也需要相关的集成测试,甚至有时还需要一些特殊测试。 对于一个特定的程序片段,其测试的顺序可以按照v模型的规定,但其中还会交织一些程序片段的开发,而不是按阶段完全地隔离。

让验收测试和技术测试保持相互独立:验收测试应该独立于技术测试,这样可以提供双重的保险,以保证设计及程序编码能够符合最终用户的需求。验收测试既可以在实施阶段的第一步来执行,也可以在开发阶段的最后一步执行。前置测试模型提倡验收测试和技术测试沿循两条不同的路线来进行,每条路线分别地验证系统是否能够如预期设想的那样进行正常工作。这样,当单独设计好的验收测试完成了系统的验证时,我们即可确信这是一个正确的系统。

软件测试的分类

为了更有效地组织测试活动,我们可以根据不同的标准和目的将软件测试分为多个类别,比如按测试阶段划分、按测试类型划分和按测试方法划分等。下面将详细介绍这几种主要的软件测试的分类。

按测试阶段划分

① 单元测试(Unit Testing):单元测试是测试软件中最小可测试单元的过程,通常是一个函数或方法。其目的是验证单元在隔离的环境中是否按照设计的预期工作,常用的工具包括 JUnit、PyTest 等。

② 集成测试(Integration Testing):集成测试是将已通过单元测试的模块组合在一起进行测试,验证它们在集成时是否能够协同工作。这样可以及时发现模块之间的接口问题、数据传递问题以及其他由集成引起的错误。常用的集成测试方法包括自顶向下、自底向上、增量式集成等。

③ 系统测试(System Testing):系统测试是指对整个软件系统进行全面测试,确保系统在各种情况下都能按照需求工作,包括功能测试、性能测试、安全测试等。验收测试,这在最终用户或客户的环境中进行,以确认系统是否符合用户需求,为软件发布做准备。

④ 验收测试(Acceptance Testing):验收测试是在最终用户或客户的环境中对整个软件系统进行的测试,以确认系统是否符合用户需求,为软件发布做准备。

按测试类型划分

① 功能测试(Functional Testing):功能测试主要是验证软件系统的各个功能是否按照需求规格书中描述的要求正常工作。通常采用黑盒测试的方法,关注输入和输出。

② 性能测试(Performance Testing):性能测试主要评估系统在不同负载和压力条件下的性能,包括响应时间、吞吐量等。一般可分为负载测试、压力测试和性能稳定性测试。

③ 安全测试(Security Testing):安全测试主要评估软件系统对潜在威胁和攻击的抵御能力,包括身份验证、授权、数据保护等。

④ 兼容性测试(Compatibility Testing):兼容性测试的目的是确保软件在不同环境、操作系统、浏览器等条件下能够正常运行。测试对象主要为不同操作系统、不同浏览器、不同设备等。

按测试方法划分

① 手动测试(Manual Testing):也是功能测试,测试中把被测的软件当成一个黑盒子,不关心盒子的内部结构是什么,只关心软件的输入数据和输出数据。

② 自动化测试(Automated Testing):自动化测试主要通过使用自动化工具和脚本来执行测试用例,提高测试效率和覆盖范围。虽然初期投入较大,但适用于大规模和重复性测试。

按代码可见度划分

① 黑盒测试(Black-box Testing):功能测试主要是验证软件系统的各个功能是否按照需求规格书中描述的要求正常工作。通常采用黑盒测试的方法,关注输入和输出。

② 白盒测试(White-box Testing):又称结构测试、透明盒测试、逻辑驱动测试或基于代码的测试。白盒测试是指打开盒子,去研究里面的源代码和程序结果。白盒测试也是接口测试的一种。

③ 灰盒测试(Gray-Box Testing):灰盒测试是介于白盒测试和黑盒测试之间的一种,灰盒测试多用于集成测试阶段,不仅关注输入、输出的正确性,同时也关注程序内部的情况。灰盒测试也是接口测试和功能测试的结合。

以上就是集中常见的软件测试的分类,通过深入了解这些分类的细节,团队能够更精确地选择合适的测试方法和阶段,确保全面有效地进行软件测试,提高软件质量。

参考:软件测试的分类有哪些,如何进行软件测试?

测试流程

软件测试的基本流程和步骤是确保软件质量的重要过程。它涉及验证软件的功能、性能、安全性和用户体验是否符合预期。

下面是软件测试的基本流程和步骤:

  1. 需求分析:了解软件的功能和性能需求。分析用户需求和系统需求,明确软件的预期目标和功能。

  2. 测试计划:制定测试计划,确定测试目标、测试范围、测试资源和时间计划。考虑测试环境、测试工具和测试数据的需求。

  3. 测试设计:设计测试用例,包括功能测试、性能测试、安全性测试和用户体验测试。测试用例应该覆盖各种功能和使用场景,以确保软件的全面测试。

  4. 测试环境搭建:配置测试环境,包括硬件设备、操作系统、数据库和网络设置。确保测试环境与实际使用环境相似。

  5. 测试执行:根据测试计划和测试设计执行测试用例。记录测试结果,包括测试通过和测试失败的情况。对测试失败的情况进行缺陷管理和跟踪。

  6. 缺陷管理:将测试中发现的缺陷记录到缺陷管理系统中。包括缺陷的描述、重现步骤和优先级。跟踪缺陷的修复和验证过程。

  7. 缺陷修复和验证:开发人员修复测试中发现的缺陷。测试人员验证修复后的软件是否符合预期。如果修复不完全或引入新的问题,则重新进行测试。

  8. 测试报告:生成测试报告,总结测试结果和缺陷情况。报告应包括测试覆盖率、通过率和失败率。提供给项目组、开发人员和管理层参考。

  9. 回归测试:在软件的修改版本中执行回归测试,确保修复缺陷不会引入新的问题。重复执行测试用例,验证软件的稳定性和功能性。

  10. 最终验证:在软件发布前进行最终验证,确保软件符合预期目标和质量要求。验证软件的功能、性能、安全性和用户体验。

  11. 发布和维护:在软件通过最终验证后,将其发布到生产环境中。跟踪用户反馈和问题报告,进行维护和更新。

软件测试的基本流程和步骤是确保软件质量的关键过程。通过合理的测试计划和测试设计,可以发现和修复软件中的缺陷,提高软件的可靠性和稳定性。

参考:软件测试的基本流程和步骤是什么?