(一)软件测试的定义

规定的条件下对程序进行操作,以发现程序的错误衡量软件质量,并对其是否能满足设计要求进行评估的过程。

1
2
3
4
规定条件 --> 测试用例
发现程序的错误 --> 找bug
衡量软件质量 --> 根据各项指标(测试覆盖率、缺陷发现率、测试成功率)评估软件的质量
满足设计要求 --> 是否满足用户需求、需求规格说明书、概要设计、软件设计等
(二)软件测试方法的分类

按开发阶段划分:

  1. 单元测试(Unit Testing)

    又称模块测试。对软件的组成单位进行测试,其目的是检验软件基本组成单位的正确性。测试的对象是软件测试的最小单位:模块。【例如:登录模块测试、注册模块测试】

  2. 集成测试(Integration Testing)

    集成测试也称联合测试(联调)组装测试:将程序模块采用适当的集成策略组装起来,对系统的接口及集成后的功能进行正确性检测的测试工作。集成主要目的是检查软件单位之间的接口是否正确。【例如:京东购物支付订单时调用微信的支付接口】

  3. 系统测试(System Testing)

    将软件系统看成是一个系统的测试。包括对功能、性能以及软件所运行的软硬件环境进行测试。时间大部分在系统测试执行阶段,包括回归测试和冒烟测试。

    【例如:房子能不能住人(功能) 房子抗不抗台风(性能);

    ​ QQ能不能注册,能不能登录,能不能聊天发消息(功能) 人数太多会不会卡顿(性能)】

    🐒==Tips:系统测试如何开展?==

    ==需求评审(功能需求、性能需求、接口需求) - 测试计划 - 测试用例 - 用例评审 - 测试环境搭建(平台、架构、web服务器、数据库) - 执行用例 - 提交问题 - 缺陷的跟踪和回归测试 - 测试报告==

  4. 验收测试(Acceptance Testing)

    是部署软件前的最后一个测试操作。它是技术测试的最后一个阶段,也称为交付测试向软件购买者展示该软件系统满足原始需求

    ==实施验收测试的策略有三种:==

    • 正式验收测试
    • 非正式验收测试或α测试
    • β测试

按是否手工执行划分:

  1. 手工测试(Manual Testing)

    手工测试是由人一个一个的输入用例,然后观察结果,和机器测试(指使用机器去测试,例如:手机、电脑)相对应,属于比较原始但是必须的一种。问题和缺陷的发现主要集中在手工测试阶段。

  2. 自动化测试(Automation Testing)

    所谓自动化测试,就是在预设条件下运行系统或应用程序,评估运行结果。(预先条件包括:正常条件和异常条件)。简单来说,自动化测试就是把人为驱动的测试行为,转化为机器执行的一种过程。

按是否查看代码划分:

  1. 黑色测试(Black-Box Testing)

    黑盒测试也是功能测试,测试中把被测的软件当做一个黑盒子,不关心盒子的内部结构是什么,只关心软件的输入数据和输出数据。

  2. 白盒测试(White-Box Testing)

    白盒测试又称结构测试、透明盒测试、逻辑驱动测试或基于代码的测试。白盒测试是指打开盒子,去研究里面的源代码和程序结果。

  3. 灰盒测试(Gray-Box Testing)

    灰盒测试是介于白盒测试和黑盒测试之间的一种,灰盒测试多用于集成测试阶段,不仅关注输入、输出的正确性,同时也关注程序内部的情况

按是否运行程序划分:

  1. 静态测试(Static Testing)

    静态测试方法是指不运行被测程序本身,仅通过分析或检查源程序的语法、结构、过程、接口等来检查程序的正确性,对需求规格说明书、软件设计说明书、源程序做结构分析、流程图分析、符号执行来找错。【静态测试属于白盒测试】

  2. 动态测试(Dynamic Testing)

    动态测试是指通过运行被测程序,检查运行结果与预期结果的差异。【黑盒测试属于动态测试】

按测试对象划分:

(1)非功能测试

  1. 性能测试(Performance Testing)

    检查系统是否满足需求规格说明书中规定的性能。

    通常表现在以下方面:

    • 稳定性【例如:一万人的时候和十万人的时候,甚至一百万的时候系统会不会卡顿】
    • 响应时间【例如:等待相应的时间是否过慢】
    • 吞吐量(TPS)
  2. 安全测试(Safety Testing)

    安全测试是一个相对独立的领域,需要更多的专业知识。

    如:WEB的安全测试、需要熟悉各种网络协议、防火墙、CDN、熟悉各种操作系统的漏洞、熟悉路由器等。

  3. 兼容性测试(Compatibility Testing)

    兼容性测试主要指软件之间能否很好的运作,会不会有影响、软件和硬件之间能否发挥很好的效率工作,会不会影响导致系统的崩溃。

    • 平台测试【例如:各种不同品牌型号、不同操作系统(如:android、iOS)的手机是否兼容】
    • 浏览器测试【例如:不同浏览器兼容性测试(火狐、谷歌、360等)】
    • 软件本身是否向前或向后兼容【例如:本版本和上一版本是否兼容】
    • 测试软件是否与其他相关软件兼容【例如:同时下载两款软件是否都能正常使用】
    • 数据兼容性测试【数据之间有一定的隔离性,两个软件里面的数据不会串、相互隔离、兼容】
  4. 文档测试(Document Testing)

    • 开发文件:可行性研究报告、软件需求说明书、数据要求说明书、概要设计说明书、详细设计说明书、数据库设计说明书、模块开发卷宗。

    • 用户文件:用户手册、操作手册,用户文档的作用:改善易安装性;改善软件的易学性与易用性;改善软件可靠性;降低技术支持成本。

    • 管理文件:项目开发计划、测试计划、测试分析报告、开发进度月报、项目开发总结报告。

      在实际的测试中,最常见的就是用户文件的测试,例如:用户操作说明书等。

      文档测试关注的点:文档的术语、文档的正确性、文档的完整性、文档的一致性、文档的易用性。

  5. 易用性(用户体验性测试)(User Ability Testing)

    易用性是交互的适应性、功能性和有效性的集中体现。又叫用户体验测试。

  6. 界面测试(User Interface Testing,UI测试)

    界面测试(简称UI测试),测试用户界面的功能模块的布局是否合理、整体风格是否一致、各个控件的放置位置是否符合客户使用习惯,此外还要测试界面操作便捷性、导航简单易懂性,页面元素的可用性,界面中文字是否正确,命名是否统一,页面是否美观,文字、图片组合是否完美等。

  7. 安装测试(Installation Testing)

    安装测试是指:测试程序的安装、卸载。最经典的就是APP的安装、卸载。

(2)功能测试(Functional Testing)

功能测试就是对产品的各功能进行验证,根据功能测试用例,逐项测试,检查产品是否达到用户要求的功能。也是黑盒测试,测试中把被测的软件当做一个黑盒子,不关心盒子的内部结构是什么,只关心软件的输入数据和输出数据。

按测试实施的组织划分:

  1. α测试(Alpha Testing)

  2. β测试(Beta Testing)

    🐒α测试与β测试区别:

    1. 测试的场所不同:Alpha测试是指把用户请到开发方的场所来测试,Beta测试是指在一个或多个用户的场所进行的测试。【例如:游戏内测版本】

    2. Alpha测试的环境是受开发方控制的,用户的数量相对比较少时间比较集中

      Beta测试的环境是不受开发方控制的,用户数量相对比较多时间不集中

    3. Alpha测试先于Beta测试执行。通用的软件产品需要较大规模的Beta测试测试周期比较长

  3. 第三方测试(Third-party Testing)

    介于开发方和用户之前的测试组织。【例如:众测网】

按测试地域划分:

  1. 国际化测试(International Testing)

    软件的国际化和软件的本地化是开发面向全球不同地区用户使用的软件系统的两个过程。而本地化测试和国际化测试则是针对这类软件产品进行的测试。由于软件的全球化普及,还有软件外包行业的兴起,软件的本地化和国际化测试俨然成为一个独特的测试专门领域。

  2. 本地化测试(Localization Testing)

    本地化测试的对象是软件的本地化版本。

    之前我们一起学习的测试都是本地化测试。

(三)软件测试的原则
  1. 测试应该尽早进行,最好在需求阶段就开始介入,因为最严重的错误不外乎是系统不能满足用户的需求。

  2. 程序员(开发)应该避免检查自己的程序,软件测试应该由第三方(测试人员)来负责。

  3. 设计测试用例时应考虑到合法的输入和不合法的输入。【比如:金额输入框小数部分超过两位0.0001】

  4. 在测试程序时,不仅要检验程序是否做了该做的事,还要检验程序是否做了不该做的事,多余的工作会带来副作用,影响程序的效率,有时会带来潜在的危害或错误。

  5. 长期保留所有测试用例,保留测试用例有助于以后修改程序后的回归测试,也是万一出现线上BUG后,证明自己没有漏测的证据。

(四)软件测试策略
  1. 选择测试方法:选择最合适当前项目的测试方法(比如:项目紧急的时候?项目频繁发版?)(例如:重复测试的工作可以采用自动化测试)

  2. 角色和职责:需要在测试策略里面明确定义各个角色,以及该角色的职责。比如:项目经理、测试组长、测试工程师。

  3. 环境需求:这一点非常重要,它将描述测试时需要的系统环境(软件;服务器Linux,windows;数据库MySQL),包括软硬件以及网络环境等。在澄清环境需求的时候,测试组织可以识别出资源方面的风险。

  4. 风险分析:影响测试过程的风险都应该尽早被识别出来,而且必须有相应的解决办法以便消除或减轻这些风险。(例如:人员休假、软件是否完成)

  5. 测试进度评估:测试进度将会评估完成测试所需要的时间。在设定进度的时候,首先需要明测试范围(比如:这次增加一个D模块,部分功能会影响原来已经上线的B模块的功能)然后根据测试资源的多少来指定能被各方面认可的测试进度计划。

  6. 回归测试(Regression Testing)策略:回归测试用来保证之前fix bug的代码不会影响软件的其他部分,这样需要我们选择已经执行过的测试用例重新运行。测试人员需要找到一个方法来确定哪些测试用例应该在回归测试中运行,用例不能太多,因为资源有限,用例也不能太少,否则会达不到必须的测试强度。

  7. 优先级:测试范围内的东西不会都是一样重要的,加上测试资源各种有限,所以为测试的模块排定优先级是十分的必要。

(五)软件测试模型
  1. 瀑布模型

    瀑布模型适合于结构化方法。

    软件项目或产品选择瀑布模型必须满足下列条件:

    • 在开发时间内需求没有或很少变化
    • 分析设计人员应对应用领域很熟悉
    • 低风险项目(对目标、环境很熟悉)(例如:银行项目)
    • 用户使用环境很稳定
    • 用户除提出需求以外,很少参答与开发工作
  2. V模型

    • 优点:包含了底层测试(单元测试)和高层测试(系统测试);清楚的标识了开发和测试的各个阶段;自上而下逐步求精,每个阶段分工明确,便于整体项目的把控。

    • 缺点:自上而下的顺序导致测试工作在编码后,不能及时的进行修改;实际工作中,需求经常变化,导致V模型步骤反复执行,返工量很大,灵活度较低。

    V模型和瀑布模型有一些共同的特性,V模型从左到右,描述了基本的开发过程和测试行为。

    • 优点:V模型的价值在于它非常明确地标明了测试过程中存在的不同级别,并且清楚地描述了这些测试阶段和开发过程期间各个阶段的对应关系。
    • 局限性:(测试介入太晚)把测试作为编码之后的最后一个活动,需求分析等前期产生的错误知道后期的验收测试才能发现。
  3. 敏捷模型

  4. W模型

    **定义:**开发一个v,测试一个v,组合起来的模型(w模型也叫双v模型)。

    image-20210910235718005
  5. H模型

    相对于V模型和W模型,H模型将测试活动完全独立出来,形成了一个完全独立的流程,将测试准备活动和测试执行活动清晰地体现出来。

  6. 探索性测试

    探索性测试可以说是一种测试思维模式

    他没有很多实际的测试方法、技术和工具,但是却是所有测试人员都应该掌握的一种测试思维方式。

    探索性测试强调测试人员的主观能动性,抛弃繁杂的测试计划和测试用例设计过程,强调在碰到问题时及时改变测试策略。

(六)软件测试生命周期

……