软件测试基础理论

一、软件测试基础概念

一、软件测试

1.含义:

  • 通过手工或者工具对“被测对象”进行测试
  • 验证实际结果与预期结果之间是否存在差异

2.作用

  • 通过测试工作可以发现并修复软件当中存在的缺陷,从而提高用户对产品的使用信心
  • 测试可以降低同类型产品开发遇到问题的风险

二、软件缺陷

含义:

  • 软件缺陷被测试工程师和开发工程师称作bug
  • 软件缺陷会导致软件不能正常运行,它的存在会在一定程度上导致软件不能满足用户的需求,甚至有可能破坏或泄露用户的重要数据

三、软件测试原则

  • 测试显示发现缺陷的存在
  • 穷尽测试是不可能得
  • 测试尽早介入:更早发现bug,更早解决,成本越低
  • 缺陷集群性(2/8原则):遇到的80%的bug可能集中在20%的功能模块中,如果一个模块出现bug,那么此模块可能存在更多的bug,需要集中测试
  • 杀虫剂悖论:同样的测试用例被执行多次,发现问题的可能性越小,会产生“抗药性”
  • 测试活动依赖于测试内容
  • 没有错误是好是谬论:任何一个软件都是会存在问题的,都不可能是完美的

四、软件测试对象

  • 需求分析阶段:需求文档、接口文档
  • 编码实现阶段:源代码
  • 系统功能使用:软件程序

五、测试用例

含义:

  • 为特定的目的而设计的一组测试输入、执行步骤和预期的结果,以便测试产品是否满足某个特定的需求的文档

二、软件开发流程

一、软件开发流程演变

  • 瀑布模型
  • 敏捷模型
    • XP
    • SCRUM
  • DevOps

一、瀑布模型

  • 软件开发的各项活动严格按照线性方式进行
  • 当前活动接受上一活动的工作结果
  • 当前活动的工作结果需要进行验证
  • 需求分析 → 设计 → 编码 → 实现 → 软件测试 → 完成 → 运维

一、瀑布模型优缺点

优点:
  • 开发的各个阶段比较清晰
  • 强调早期计划及需求调查
  • 适合需求稳定的产品开发
缺点:
  • 由于开发模型是线性的,增加了开发的风险
  • 早期的错误可能要等到开发后期的阶段才能发现

二、敏捷开发模型

  • XP
  • SCRUM

XP - 极限编程

SCRUM

DevOps

生命周期
  • 持续开发
  • 持续测试
  • 持续集成
  • 持续部署
  • 持续监控

三、测试流程体系

一、软件测试模型

V模型

  • 需求分析:需求文档
  • 概要设计:系统架构、模块划分、模块与模块之间的接口
  • 详细设计:模块内部实现的逻辑与方法
  • 编码:用代码实现设计的内容
  • 单元测试:测试代码中最小模块是否符合详细设计
  • 集成测试:测试各个模块组合到一起后是否可以正常使用
  • 系统测试:测试已经集成在一起的产品是否符合需求文档中的要求
  • 验收测试:测试产品是否符合用户的需求

V模型的优缺点

  • 优点:
    • 既有底层测试又有高层测试
    • 将开发阶段清楚的表现出来,便于控制开发的流程
  • 缺点:
    • 容易让人误解为测试是在开发完成之后的一个阶段
    • 由于它的顺序性,当编码完成之后,正式进入测试时,这时发现的一些bug可能不容易找到其根源,并且代码修改起来很困难
    • 如果需求变更较大,导致要重复变更需求、设计、编码、测试。返工量很大。

W模型

  • W模型明确表示出测试与开发的并行关系
  • W模型中测试伴随着整个软件开发周期,并且测试的对象不仅仅是程序,需求和设计同样要测试

W模型优缺点

  • 优点:
    • 将测试贯穿到整个软件生命周期中,且除了代码要测试,需求、设计等都要测试。
    • 更早的介入到软件开发中,能尽早的发现缺陷进行修复。
    • 测试与开发独立起来,并于开发并行。
  • 缺点:
    • 无法支持迭代的开发模型
    • 对有些项目,开发过程中根本没有文档产生,故W模型无法使用。
    • 对于需求和设计的测试技术要求很高,实践起来很困难。

H模型

  • 软件开发中需求、设计、编码等活动被分阶段执行、但是实践中,他们并不是完全串行的,它们之间更多时候是交叉进行的,更多的是迭代执行
  • 把测试活动完全独立起来,形成一个完全独立的流程,将测试准备活动和测试执行活动清晰的体现出来
    image

H模型的优缺点

  • 优点:
    • 软件测试完全独立,贯穿整个生命周期,且与其他流程并发进行
    • 软件测试活动可以尽早准备、尽早执行,具有很强的灵活性
  • 缺点:
    • 测试就绪点分析困难
    • 对于整个项目组的人员要求非常高

二、软件测试流程

传统测试流程

单元测试 → 集成测试 → 冒烟测试 → 系统测试 → 回归测试 → 验收测试

系统测试流程

需求分析 → 测试计划 → 测试设计 → 用例评审 → 测试执行 → bug管理 → 发布维护

测试左移

  • 左移是往测试之前的开发阶段移
  • 测试团队在软件开发周期早期就开始介入
  • 对代码进行测试
  • 从发现bug到预防bug

测试左移-质量保障手段

  • 代码评审(code review)
  • 代码审计
  • 单元测试
  • 自动化冒烟测试
  • 研发自测

测试右移

  • 右移是往发布之后移
  • 产品上线后进行线上监控

测试右移-线上监控

  • 闭环的线上问题反馈-检查-解决-更新流程
  • 更便捷的日志查看、回传服务
  • 丰富有效的log,便于问题的快速定位
  • 丰富的监控指标(例如业务异常点指标)
  • 业务监控(例如短信发送等)
  • 关键指标每日监控(服务器指标)
  • 生产数据监控(警报)

三、测试技术体系

一、软件测试分类

1.按开发阶段分类

单元测试,集成测试,系统测试(功能测试,兼容性测试,性能测试,安全测试),验收测试(α测试,β测试)

2.按是否查看代码

白盒测试,黑盒测试,灰盒测试

3.按测试执行方式

静态测试(不需要运行程序,静态查看文档,代码等),动态测试(需要运行被测程序)

4.按是否手工执行

手工测试,自动化测试

5.其他分类

冒烟测试,回归测试,随机测试,探索性测试

黑盒测试

  • 又称数据驱动测试
  • 完全不考虑程序内部机构和内部特性
  • 注重于测试软件的功能需求
  • 只关心软件的输入数据和输出数据

白盒测试

  • 研究产品内部的源代码和程序结构
  • 单元测试就是白盒测试的一种