软件工程之软件测试

大耗子 2020年04月24日 283次浏览

文章链接:https://codemouse.online/archives/2020-04-24193143

测试策略

  • V模型:描述软件开发各阶段与测试策略之间的对应关系。
    V模型

单元测试

  • 单元测试又称模块测试,着重对软件设计的最小单元(软件构件或模块)进行验证,通常采用白盒测试,多个模块可并行测试。

  • 单元测试通常与编码工作结合起来进行。

  • 模块本身不是一个独立的程序,在测试模块时,必须为每个被测模块开发一个驱动(driver)程序和若干个桩(stub)模块。

  • 单元测试内容

    • 模块接口
    • 局部数据结构
    • 边界条件
    • 所有独立路径
    • 所有错误处理路径

集成测试

  • 经单元测试后,每个模块都能独立工作,但把它们放在一起往往不能正常工作。

  • 主要问题在于:

    • 数据可能在通过接口时丢失;
    • 一个模块对另一个模块产生非故意的、有害的影响;
    • 子功能被组合起来时,可能不能达到期望的主功能;
    • 单个模块可以接受的不精确性(如误差),连接起来后可能会扩大到无法接受的程度;
    • 全局数据结构可能会存在问题。
  • 集成的方式有两种

    非增量式集成:使用“一步到位”的方法来构造程序。这种方法在发现错误时,很难为错误定位。

    增量式集成:根据程序结构图,每次增加一个(或一组)模块。在增量集成测试过程中发现的错误,往往与新加入模块有关。

  • 自顶向下集成

    优点:不需要驱动模块;能尽早对程序主要控制和决策机制进行检验,能较早发现整体性的错误。

    缺点:测试时低层模块用桩模块替代,不能反映真实情况;重要数据不能及时回送到上层模块。

自顶向下集成

  • 自底向上集成

    优点:不需要桩模块,容易测试;将整个程序结构分解成若干簇,对同一层簇可并行测试提高效率。

    缺点:整体性的错误发现得较晚。

自底向上集成

策略选择

自顶向下与自底向上相结合三明治测试:

  • 高层使用自顶向下
  • 低层使用自底向上
  • 集成测试时应特别关注关键模块的测试。
  • 关键模块应尽早测试。

回归测试

  • 在集成测试过程中,每当增加一个(或一组)新模块时,原先已集成的软件就发生了改变。这些改变可能使原本正常的功能产生错误。
  • 回归测试就是对已经进行过的测试的子集的重新执行,以确保对程序的改变和修改,没有传播非故意的副作用。

确认测试

  • 确认测试标准

    确认测试以软件需求规约为依据,以发现软件与需求不一致的错误。主要检查软件是否实现了规约规定的全部功能要求,文档资料是否完整、正确、合理,其他的需求,如可移植性、可维护性、兼容性、错误恢复能力等是否满足。

  • α测试是由一个用户在开发者的场所进行的,软件在开发者对用户的“指导下”进行测试。经α测试后的软件称为β版软件。

  • β测试是由软件的最终用户在一个或多个用户场所进行的,开发者通常不在测试现场,用户把问题报告给开发者,开发者对软件进行最后的修改。

系统测试

系统测试是对整个基于计算机的系统进行的一系列测试。

  • 恢复测试:通过各种手段强制软件发生故障,验证系统能否在指定时间间隔内恢复正常
  • 安全测试:验证系统中的保护机制能否实际保护系统不受非法侵入
  • 压力测试:检查系统对非正常情况承受程度
  • 性能测试:测试软件在集成系统中运行性能

测试完成标准

决定什么时候停止程序测试成了最困难的问题,但是测试最后一定要停止的。
几种实用的测试完成标准:

  • 不,我们不能绝对地认定软件永远也不会再出错,但是相对于一个理论上合理的和在试验中有效的统计模型来说,如果一个在按照概率的方法定义的环境中,1000个CPU小时内不出错运行的概率大于0.995的话,那么我们就有95%的信心说,我们已经进行了足够的测试。

  • 观察测试阶段中单位时间内发现错误的数目曲线:

错误数目曲线

调试

调试的目的是确定错误的原因和准确位置,并加以纠正。

调试过程

调试方法

  • 蛮力法:在程序中设置断点,打印有关变量的值等,获取大量现场信息,从中找出错误的原因,效率较低。

  • 回溯法:从错误征兆出发,人工沿着控制流程往回跟踪,直至发现错误的根源。适用小型程序。

  • 原因排除法

    • 归纳法:是一种从特殊推断一般的系统化思考方法。基本思想:从一些线索(错误征兆)着手,通过分析它们之间的关系来找出错误的原因。

    归纳法

    • 演绎法:从一般原理或前提出发,假设所有可能出错的原因,排除不可能正确的假设,最后推导出结论。

    演绎法

纠正错误

  • 修改一个错误常常会引入新的错误

  • 在为纠正某个错误修改程序之前应该回答三个问题:

    1. 在程序的其他地方是否也存在同类的错误?
    2. 本次修改可能会引发什么新的错误?
    3. 为了防止这个错误,我们应该做什么?