标签(空格分隔): 软件工程 测试
测试的目的
发现软件中的存在的错误和缺陷,并加以纠正。应该排除对测试的错误观点,设计合适的测试用例,用尽可能少的测试用例,来发现尽可能多的软件错误
测试用例
一个测试用例是由测试输入数据和预期结果组成,测试时通过输入数据,运行被测程序时,如果运行的实际输入与输出不一致,则表明了发现了程序中错误。
测试用例的设计分为:黑盒测试和白盒测试,也称为白箱测试和黑箱测试
白盒测试主要用于对程序模块的测试,包括:
- 程序模块中所有独立路径至少执行一次
- 对所有逻辑判定的取值(“真”、“假”)都至少测试一次
- 在上下边界即可操作范围内运行所有循环
- 测试内部数据结构的有效性等
黑盒测试又称为行为测试,这种方法把测试方法看做一个黑盒子,测试人员完全不考虑程序内部的逻辑结构和内部特性,只是依据程序的需求规格说明书,检查程序的功能是否符合它的功能需求
黑盒测试可用于各种测试,试图发现的错误有:
- 不正确或者遗漏的功能
- 接口错误,如输入参数输出参数的个数、类型等
- 数据结构错误或外部信息(如外部数据库错误)访问错误
- 性能错误
- 初始化和终止错误
白盒测试
白盒测试方法
主要有逻辑覆盖测试,基本路径测试,数据流测试和循环测试
逻辑覆盖测试
概念:逻辑覆盖测试是一种基本的白盒测试方法。主要考察用测试数据运行被测程序时对程序逻辑的覆盖程度。希望使用最少的测试用例来满足所需的覆盖标准。主要的覆盖标准有:语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖,条件组合覆盖和路径覆盖
public void fun(int y,int z){
if(y>1 && z=0)x=x/y;
if(y=2 || x>1) x=x+1;
}
程序流程图
逻辑覆盖方式 | 概念 | 输入数据 | 预期结果 |
---|---|---|---|
语句覆盖 | 每个可执行语句至少执行一次 | x=0,y=2,z=0 | x=1,y=2,z=2 |
判定覆盖 | 每个判定的分支至少执行一次 | x=0,y=2,z=0;x=0,y=1,z=1 | x=1,y=2,z=0;x=0,y=1,z=1 |
条件覆盖 | 每个条件中的所有可能结果都至少出现一次 | ||
判定条件覆盖 | 每个判定所有可能的结果都至少执行一次,并且,每个判定的每个条件的所有可能结果都至少出现一次 | ||
条件组合覆盖 | 每个判定中的条件结果的所有可能组合都至少出现一次 | ||
路径覆盖 | 每条可能执行到的路径都至少出现一次 |
黑盒测试
黑盒测试是依照软件的需求规约,检查程序的功能是否符合需求规约的要求。主要的黑盒测试方法有:等价类划分,边界值分析,比较测试,错误猜测和因果图方法。
等价类划分
等价类是指输入域的某个子集,该子集中的每个输入数据对揭露软件中的错误都是有效地,测试等价类的某个代表值就等价于对这类其他值得测试
等价类可以分为有效等价类和无效等价类
有效等价类:符合规格说明要求的合理的输入数据集合,主要用来建言程序是否实现了规格说明中规定功能。
无效等价类:指不符合规格说明要求的不合理的或非法输入数据的集合,主要用来检验程序是否做了不符合规格说明的事情
边界值分析
程序在处理输入或者输出范围的边界情况时出错的概率比较大,因此应该设计一些测试用例,使程序运行在输入或者输出范围的边界附近,这样揭露程序中的错误的可能性就越大
边界值分析通常是等价类划分方法的一种补充,在等价类划分方法中,一个等价类中的任一输入都可以作为该等价类的这代表用作测试用例,而边界值分析方法则是专门挑选那些位于输入或输出范围边界附近的数据用作测试用例
因果图
- 因果图是帮助人们系统地选择一组高效测试用例的方法,既考虑了输入条件的组合关系,又考虑了输出条件对输入条件的依赖关系,即是因果关系,其测试用例发现错误的效率比较高
- 用因果图方法设计测试用例的步骤
- 分割功能说明书:将输入条件分为若干组,然后分别对每个组使用因果图,这样可减少条件组合的数目。如测试编译程序时,可将语言中的每个语句作为一个组。
- 识别原因和结果,并加以编号
- 根据功能说明中规定的原因和结果之间的关系画出因果图
- 根据因果图画出判定表
测试策略
V模型
软件开发各阶段与测试策略之间的对应关系
系统工程->系统测试
需求分析->确认测试
设计->集成测试
编码->单元测试
单元测试(模块测试)
对软件设计中的最小单元–软件构件或模块进行测试。单元测试通常使用白盒测试,并且多个构件或模块可以并行进行测试。
单元测试的内容主要包括:接口、局部数据结构、边界条件、独立路径、错误处理路径
集成测试(组装测试)
单元测试后的模块需要集成为软件系统,集成测试是对集成后的软件系统进行测试,主要用来揭露设计阶段产生的错误。
自顶向下的集成测试
- 模块的集成顺序:测试从主控模块开始,然后按照程序结构图的控制层次,将直接或者间接从属于主控模块的模块按照深度优先或者广度优先的方式逐个集成到整个结构中,并对其进行测试。
- 使用自顶向下的继承方式测试一个模块时,由于他的上层模块已经经过测试,所以可用作他的驱动程序,即自顶向下的集成测试时不需要驱动程序。
- 测试步骤:
- 主控模块被直接用作驱动程序,所有直接从属于主控模块的模块用桩模块替换,然后对主控模块进行测试。
- 根据集成的实现方式(广度优先或者是深度优先),下层的桩模块一次一个地替换成真正的模块,从属于该模块的模块用桩模块替换,然后对主控模块进行测试
- 用回归测试来保证没有引入新的错误
- 重复第二步和第三部直至所有的模块都被集成
- 优点:
一个程序的主要控制和决策点通常几种在层次结构的高层模块中,因此,自顶向下的集成测试能够在测试的早期对程序的主要控制和决策进行验证,能较早发现整体性的错误。由于程序结构图中的一棵子树组成的模块往往实现了某个完整的程序gon因此深度优先向下集成能够较早地对某些完整的程序功能进行验证 - 缺点:
其底层模块用桩模块替代,不能反映真实的情况,是重要的数据不能及时回送到上层模块。
自底向上的集成测试
- 模块的集成顺序:从程序结构的最底层模块,然后按照程序结构的控制层次将上层模块集成到整个结构中,并对其进行测试
- 测试步骤:
- 将底层模块组合成成能实现软件特性功能的簇
- 为每个簇编写驱动程序,对簇进行测试
- 移走驱动程序,用簇的直接上层模块替换驱动程序,然后沿着程序结构的层次向上组合成新的簇
- 凡是对新的簇测试后,都要进行回归测试,以保证没有引入新的错误
- 重复第二步到第五步,直至所有的模块都被集成
回归测试
在集成测试的过程中,每当增加一个或者一组新模块时,原先对已经集成的软件就发生了改变。回归测试就是对已经测试的测试用例子集重新测试,以确保对程序的改变和修改,没有传播非故意的副作用。
确认测试
经过集成测试后的软件需要经过测试方能交付使用。确认测试通常采用黑盒测试方法。确认测试仪软件需求规约为依据,以发现软件与需求不一致的地方。主要检查软件是否实现了规约规定的全部功能,文档资料是否完整、正确、合理、其他的需求,如可移植性、可维护性、兼容性和错误恢复能力。
确认测试的结果分为两类:
满足需求规约中的功能和性能特性,用户可以接受
发现与需求规约有偏差,此时需要列出问题清单
α测试和β测试
α测试:用户在开发者产国进行的,软件在开发者对用户的指导下进行的测试,经过α测试之后的软件称为β版软件
β测试:最终用户在一个或多个场景下进行的,开发者不在现场
系统测试
对整个基于计算机系统的进行的一系列测试,测试种类很多,每种测试都有不同的目的,从不同角度测试计算机系统是否被正常地集成,并完成相应的功能
1. 恢复测试:通过各种手段,强制软件发生故障,然后验证系统能否在指定的时间间隔内恢复正常,包括修正错误并重新启动系统
2. 安全保密性测试:测试集成系统中的保护机制能否实际保护系统不受非法侵入。
3. 压力测试:在一种非正常数量,频率或容量的方式下执行的系统,其目的是检查系统对非正常情况下的承受程度
4. 性能测试:用来测试下软件在集成的系统中的运行性能