1. 程序的质量主要取决于设计的质量。
2. 测试分为单元测试,集成测试,系统测试。
3. 测试的目标是在既定时间内尽可能多的发现系统中的错误,但是不能证明程序的正确性。
4. 程序设计语言的基本成分:数据成分,运算成分,控制成分,传输成分。
5. 不要为了追求效率而是程序语句复杂化,程序的效率应该通过选择高效的算法来实现。
6. 应该尽量避免使用临时变量。
7. 尽量只采用选择,分支,循环三种基本的控制方式编写程序。
8. 从程序运行时间,存储器效率,输入输出的效率来考虑程序的效率。
9. 软件测试是根据软件开发的各个阶段的规格说明和程序的内部结构而精心设计的测试用例,并利用这些测试用例运行程序以发现错误的过程。
10. 软件测试的目标:希望通过软件测试暴露软件中隐藏的错误和缺陷,以保证软件产品的质量。
11. 成功的测试:测试用例发现了程序中迄今为止尚未发现的错误。
12. 软件测试只能查找出程序中的错误,不能证明程序的正确性。
13. 测试用例包括测试数据和预期输出两部分。
14. 软件测试可分为“黑盒测试”和“白盒测试”。
15. 软件测试可分为“单元测试”,“集成测试”,“系统测试”和“验收测试”。
16. 测试重点:模块接口,局部数据结构,出错处理,独立路径,边界条件。
17. 计算机测试:
18. 集成测试的策略:
a) 自顶向下:
i. 优点:不需要测试驱动程序;
ii. 能够在测试阶段的早期实现并验证系统的主要功能;
iii. 能够在早期发现上层模块的错误。
b) 缺点:
i. 需要存根程序;
ii. 底层模块中的错误发现时间比较晚;
iii. 不能充分展开人力。
c) 自下向上:优缺点正好相反。
19. “白盒测试”技术:按照程序内部的逻辑测试程序,校验程序中的每条通路是否按照预定的要求正常工作,又称为结构测试。
白盒测试包括:
语句覆盖:选择足够多的测试数据,使得被测程序中每个语句至少被执行一次。
判定覆盖:保证程序中每个语句都被执行一次,并且保证每种可能的结果都应该至少执行一次。
条件覆盖:保证每个语句都至少执行一次,并且保证每个判定表达式中的每个条件都取到相应的可能值。
判定/条件覆盖:选取足够多的测试数据,使得判定表达式中的每个条件都能取到各种可能值,并且判定表达式也都取到各种可能的结构。
条件组合覆盖:选取足够多的测试数据,使得每个判定表达式条件的各种可能组合都至少出现一次。
路径覆盖:选取足够多的测试数据,使得程序中每条可能的路径都执行一次,是白盒测试中覆盖程度最高的测试方法。
以上为逻辑测试。
下面是控制结构测试。
基本路径测试:一种白盒测试技术,首先计算过程设计结果的逻辑复杂度,并以该复杂度为指南定义执行路径的基本集合,从该基本集合导出的测试用例可以保证程序中每条语句至少执行一次,而且每个条件在执行时都将分别取true(真)和false(假)值。
基本步骤:
1. 根据过程设计结果画出相应的流图;
画出相应的流图:
2. 计算流图的环形复杂度;
3. 确定线性独立路径的基本集合;
所谓独立路径是指至少引入程序的一个新处理语句集合或一个新条件的路径,用流图术语描述,独立路径至少包含一条在定义该路径之前不曾用过的边;
使用基本路径测试法设计测试用例时,程序的环形复杂度决定了程序中独立路径的数量,而且这个数是确保程序中所有语句至少被执行一次所需的测试数量的上界。
在导出测试用例时,识别判定节点是很有用的。
4. 设计可强制执行基本集合中每条路径测试用例。
应该选取数据使得在测试每条路径时都适当地设置好了各个判定节点的条件。
条件测试:简单条件格式:一个布尔变量或一个关系表达式,在布尔变量或关系表达式之前还可能有一个NOT算符。关系表达式的形式如下:
E1<关系算符>E2 关系算符:>,<,≥≤≠=
复合条件:复合条件由两个或多个简单条件、布尔算符和括弧组成。布尔算符有OR,AND和NOT。不包含关系表达式的条件称为布尔表达式;
条件成分类型:包括布尔算符、布尔变量、布尔括弧、关系算符及算术表达式;
条件错误常见类型:
布尔算符错 (布尔算符不正确,遗漏布尔算符或有多余的布尔算符);
布尔变量错;
布尔括弧错;
关系算符错;
算术表达式错。
循环测试:一种专注于循环结构有效性的白盒测试技术,
1. 简单循环测试:
应该使用下列测试集来测试简单循环,其中n是允许通过循环的最大次数;
跳过循环;
只通过循环一次;
通过循环两次;
通过循环m次,其中m<n-1;
通过循环n-1,n,n+1次。
2. 嵌套循环测试:
如果把简单循环的测试方法直接应用到嵌套循环,可能的测试数就会随嵌套层数的增加按几何级数增长,这会导致不切实际的测试数目。B. Beizer提出了一种能减少测试数的方法;
从最内层循环开始测试,把所有其他循环都设置为最小值;
对最内层循环使用简单循环测试方法,而使外层循环的迭代参数(例如,循环计数器)取最小值,并为越界值或非法值增加一些额外的测试;
由内向外,对下一个循环进行测试,但保持所有其他外层循环为最小值,其内循环为“典型”值;
继续进行下去,直到测试完所有循环。
3. 串接循环:
如果串接循环的各个循环都彼此独立,则可以使用前述的测试简单循环的方法来测试串接循环;
但是,如果两个循环串接,而且第一个循环的循环计数器值是第二个循环的初始值,则这两个循环并不是独立的。当循环不独立时,建议使用测试嵌套循环的方法来测试串接循环。
黑盒测试技术:为了发现以下错误:
功能不正确或遗漏了功能,界面错误,数据结构错误或数据库访问错误,性能错误,初始化或终止错误。
黑盒测试技术应该考虑的问题:
怎样测试功能的有效性;
哪些类型的输入将构成好测试用例;
系统是否对特定的输入值特别敏感;
怎样划分数据类的边界;
系统能够承受什么样的数据率和数据量;
数据的特定组合将对系统运行产生什么影响。
黑盒测试技术常用方法:
1. 等价类划分:把程序的输入域划分成数据类,据此可以导出测试用例;
使用等价划分法设计测试方案首先需要划分输入数据的等价类,为此需要研究程序的功能说明,从而确定输入数据的有效(Valid)等价类和无效(Invalid)等价类;
在确定输入数据的等价类时常常还需要分析输出数据的等价类,以便根据输出数据的等价类导出对应的输入数据等价类。
等价类划分规则:
如果规定了输入值的范围,则可划分出一个有效的等价类(输入值在此范围内),两个无效的等价类(输入值小于最小值或大于最大值);
如果规定了输入数据的个数,则类似地也可以划分出一个有效的等价类和两个无效的等价类;
如果规定了输入数据的一组值,而且程序对不同输入值做不同处理,则每个允许的输入值是一个有效的等价类,此外还有一个无效的等价类(任一个不允许的输入值);
如果规定了输入数据必须遵循的规则,则可以划分出一个有效的等价类(符合规则)和若干个无效的等价类(从各种不同角度违反规则);
如果规定了输入数据为整型,则可以划分出正整数、零和负整数等三个有效类
如果程序的处理对象是表格,则应该使用空表,以及含一项或多项的表。
2. 边界值分析:经验表明,处理边界情况时程序最容易发生错误,使用边界值分析(Boundary Value Analysis)方法设计测试方案首先应该确定边界情况,这需要经验和创造性,通常输入等价类和输出等价类的边界,就是应该着重测试的程序边界情况。
选取的测试数据应该刚好等于、刚刚小于和刚刚大于边界值;
按照边界值分析法,应该选取刚好等于、稍小于和稍大于等价类边界值的数据作为测试数据,而不是选取每个等价类内的典型值或任意值作为测试数据。
如规定输入输出条件范围,则选取的测试数据应该刚好等于、刚刚小于和刚刚大于边界值;
如规定输入0<=n<=100,则选0,100,-1,101作为测试数据;
如果规定了输入输出个数,则分别选最大个数,最小个数,比最大个数多1,比最小个数少1作为测试数据;
如规定学生至少选5门课,至多选9门课,则选5, 9, 4, 10作为测试数据;
如果输入输出为有序集合,如文件或表格,应将注意力集中在有序集的第一个和最后一个元素;
如果程序中定义的数据结构有预定义的边界,如数组的上下界,则选择刚好打到边界和刚好超出边界的数据为测试数据。
3. 错误推测:对于程序中可能存在哪类错误的推测,是挑选测试方案的一个重要因素,错误推测法在很大程度上靠直觉和经验进行。它的基本想法是列举出程序中可能有的错误和容易发生错误的特殊情况,并且根据它们选择测试方案,已经发现的错误数目往往和尚未发现的错误数目成正比,因此,在进一步测试时要着重测试那些已经发现了较多错误的程序段。
例如:在测试一个排序程序时,输入表为空表、输入表只有一个元素、输入表所有元素都相同、输入表已经排好序。
4. 因果图法:如果在测试时必须考虑输入条件的各种组合,可使用一种适合于描述对于多种条件的组合,相应产生多个动作的形式来设计测试用例,这时就需要利用因果图,因果图方法最终生成的就是判定表,它适合于检查程序输入条件的各种组合情况。
基本步骤:
a. 分析软件规格说明描述中,哪些是原因 (即输入条件或输入条件的等价类),哪些是结果 (即输出条件),并给每个原因和结果赋予一个标识符;
b. 分析软件规格说明描述中的语义,找出原因与结果之间,原因与原因之间对应的是什么关系? 根据这些关系,画出因果图;
c. 由于语法或环境限制,有些原因与原因之间,原因与结果之间的组合情况不可能出现。为表明这些特殊情况,在因果图上用一些记号标明约束或限制条件;
d. 把因果图转换成判定表;
e. 把判定表的每一列拿出来作为依据,设计测试用例.
因果图基本符号:
软件可靠性:程序在给定的时间间隔内,按照规格说明书的规定成功地运行的概率。
软件的平均无故障时间MTTF是一个重要的质量指标,往往作为对软件的一项要求由用户提出
估算MTTF使用下述符号表示有关的数量:
ET——测试之前程序中错误总数;
IT ——程序长度(机器指令总数);
τ——测试(包括调试)时间;
Ed(τ)——在0至τ期间发现的错误数;
Ec(τ)——在0至τ期间改正的错误数。
失效率正比于软件中剩余的(潜藏的)错误数,而平均无故障时间MTTF与剩余的错误数成反比。
估算平均无故障时间估算:
经验表明,平均无故障时间与单位长度程序中剩余的错误数成反比,即
MTTF=1/(K(Et/It)-Ec/It)
其中K为常数,它的值应该根据经验选取。美国的一些统计数字表明,K的典型值是200。
估算平均无故障时间的公式,可以评价软件测试的进展情况。此外,由上式可得
Ec=Et-It/(K*MTTF)
因此,也可以根据对软件平均无故障时间的要求,估计需要改正多少个错误之后,测试工作才能结束。
估算程序中的错误数常用“分别测试法”:随机地给一部分错误加标记,分别测试法使用两个测试员(或测试小组),彼此独立地测试同一个程序的两个副本,把其中一个测试员发现的错误作为有标记的错误。具体做法是,在测试过程的早期阶段,由测试员甲和测试员乙分别测试同一个程序的两个副本,由另一名分析员分析他们的测试结果。用τ表示测试时间,假设:
τ= 0 时错误总数为B0;
τ=τ1时测试员甲发现的错误数为B1;
τ=τ1时测试员乙发现的错误数为B2;
τ=τ1时两个测试员发现的相同错误数为bc。
如果认为测试员甲发现的错误是有标记的,即程序中有标记的错误总数为B1,则测试员乙发现的B2个错误中有bc个是有标记的。假定测试员乙发现有标记错误和发现无标记错误的概率相同,则可以估计出测试前程序中的错误总数为:
Bo=B1*B2/bc
1. 程序的质量主要取决于设计的质量。
2. 测试分为单元测试,集成测试,系统测试。
3. 测试的目标是在既定时间内尽可能多的发现系统中的错误,但是不能证明程序的正确性。
4. 程序设计语言的基本成分:数据成分,运算成分,控制成分,传输成分。
5. 不要为了追求效率而是程序语句复杂化,程序的效率应该通过选择高效的算法来实现。
6. 应该尽量避免使用临时变量。
7. 尽量只采用选择,分支,循环三种基本的控制方式编写程序。
8. 从程序运行时间,存储器效率,输入输出的效率来考虑程序的效率。
9. 软件测试是根据软件开发的各个阶段的规格说明和程序的内部结构而精心设计的测试用例,并利用这些测试用例运行程序以发现错误的过程。
10. 软件测试的目标:希望通过软件测试暴露软件中隐藏的错误和缺陷,以保证软件产品的质量。
11. 成功的测试:测试用例发现了程序中迄今为止尚未发现的错误。
12. 软件测试只能查找出程序中的错误,不能证明程序的正确性。
13. 测试用例包括测试数据和预期输出两部分。
14. 软件测试可分为“黑盒测试”和“白盒测试”。
15. 软件测试可分为“单元测试”,“集成测试”,“系统测试”和“验收测试”。
16. 测试重点:模块接口,局部数据结构,出错处理,独立路径,边界条件。
17. 计算机测试:
18. 集成测试的策略:
a) 自顶向下:
i. 优点:不需要测试驱动程序;
ii. 能够在测试阶段的早期实现并验证系统的主要功能;
iii. 能够在早期发现上层模块的错误。
b) 缺点:
i. 需要存根程序;
ii. 底层模块中的错误发现时间比较晚;
iii. 不能充分展开人力。
c) 自下向上:优缺点正好相反。
19. “白盒测试”技术:按照程序内部的逻辑测试程序,校验程序中的每条通路是否按照预定的要求正常工作,又称为结构测试。
白盒测试包括:
语句覆盖:选择足够多的测试数据,使得被测程序中每个语句至少被执行一次。
判定覆盖:保证程序中每个语句都被执行一次,并且保证每种可能的结果都应该至少执行一次。
条件覆盖:保证每个语句都至少执行一次,并且保证每个判定表达式中的每个条件都取到相应的可能值。
判定/条件覆盖:选取足够多的测试数据,使得判定表达式中的每个条件都能取到各种可能值,并且判定表达式也都取到各种可能的结构。
条件组合覆盖:选取足够多的测试数据,使得每个判定表达式条件的各种可能组合都至少出现一次。
路径覆盖:选取足够多的测试数据,使得程序中每条可能的路径都执行一次,是白盒测试中覆盖程度最高的测试方法。
以上为逻辑测试。
下面是控制结构测试。
基本路径测试:一种白盒测试技术,首先计算过程设计结果的逻辑复杂度,并以该复杂度为指南定义执行路径的基本集合,从该基本集合导出的测试用例可以保证程序中每条语句至少执行一次,而且每个条件在执行时都将分别取true(真)和false(假)值。
基本步骤:
1. 根据过程设计结果画出相应的流图;
画出相应的流图:
2. 计算流图的环形复杂度;
3. 确定线性独立路径的基本集合;
所谓独立路径是指至少引入程序的一个新处理语句集合或一个新条件的路径,用流图术语描述,独立路径至少包含一条在定义该路径之前不曾用过的边;
使用基本路径测试法设计测试用例时,程序的环形复杂度决定了程序中独立路径的数量,而且这个数是确保程序中所有语句至少被执行一次所需的测试数量的上界。
在导出测试用例时,识别判定节点是很有用的。
4. 设计可强制执行基本集合中每条路径测试用例。
应该选取数据使得在测试每条路径时都适当地设置好了各个判定节点的条件。
条件测试:简单条件格式:一个布尔变量或一个关系表达式,在布尔变量或关系表达式之前还可能有一个NOT算符。关系表达式的形式如下:
E1<关系算符>E2 关系算符:>,<,≥≤≠=
复合条件:复合条件由两个或多个简单条件、布尔算符和括弧组成。布尔算符有OR,AND和NOT。不包含关系表达式的条件称为布尔表达式;
条件成分类型:包括布尔算符、布尔变量、布尔括弧、关系算符及算术表达式;
条件错误常见类型:
布尔算符错 (布尔算符不正确,遗漏布尔算符或有多余的布尔算符);
布尔变量错;
布尔括弧错;
关系算符错;
算术表达式错。
循环测试:一种专注于循环结构有效性的白盒测试技术,
1. 简单循环测试:
应该使用下列测试集来测试简单循环,其中n是允许通过循环的最大次数;
跳过循环;
只通过循环一次;
通过循环两次;
通过循环m次,其中m<n-1;
通过循环n-1,n,n+1次。
2. 嵌套循环测试:
如果把简单循环的测试方法直接应用到嵌套循环,可能的测试数就会随嵌套层数的增加按几何级数增长,这会导致不切实际的测试数目。B. Beizer提出了一种能减少测试数的方法;
从最内层循环开始测试,把所有其他循环都设置为最小值;
对最内层循环使用简单循环测试方法,而使外层循环的迭代参数(例如,循环计数器)取最小值,并为越界值或非法值增加一些额外的测试;
由内向外,对下一个循环进行测试,但保持所有其他外层循环为最小值,其内循环为“典型”值;
继续进行下去,直到测试完所有循环。
3. 串接循环:
如果串接循环的各个循环都彼此独立,则可以使用前述的测试简单循环的方法来测试串接循环;
但是,如果两个循环串接,而且第一个循环的循环计数器值是第二个循环的初始值,则这两个循环并不是独立的。当循环不独立时,建议使用测试嵌套循环的方法来测试串接循环。
黑盒测试技术:为了发现以下错误:
功能不正确或遗漏了功能,界面错误,数据结构错误或数据库访问错误,性能错误,初始化或终止错误。
黑盒测试技术应该考虑的问题:
怎样测试功能的有效性;
哪些类型的输入将构成好测试用例;
系统是否对特定的输入值特别敏感;
怎样划分数据类的边界;
系统能够承受什么样的数据率和数据量;
数据的特定组合将对系统运行产生什么影响。
黑盒测试技术常用方法:
1. 等价类划分:把程序的输入域划分成数据类,据此可以导出测试用例;
使用等价划分法设计测试方案首先需要划分输入数据的等价类,为此需要研究程序的功能说明,从而确定输入数据的有效(Valid)等价类和无效(Invalid)等价类;
在确定输入数据的等价类时常常还需要分析输出数据的等价类,以便根据输出数据的等价类导出对应的输入数据等价类。
等价类划分规则:
如果规定了输入值的范围,则可划分出一个有效的等价类(输入值在此范围内),两个无效的等价类(输入值小于最小值或大于最大值);
如果规定了输入数据的个数,则类似地也可以划分出一个有效的等价类和两个无效的等价类;
如果规定了输入数据的一组值,而且程序对不同输入值做不同处理,则每个允许的输入值是一个有效的等价类,此外还有一个无效的等价类(任一个不允许的输入值);
如果规定了输入数据必须遵循的规则,则可以划分出一个有效的等价类(符合规则)和若干个无效的等价类(从各种不同角度违反规则);
如果规定了输入数据为整型,则可以划分出正整数、零和负整数等三个有效类
如果程序的处理对象是表格,则应该使用空表,以及含一项或多项的表。
2. 边界值分析:经验表明,处理边界情况时程序最容易发生错误,使用边界值分析(Boundary Value Analysis)方法设计测试方案首先应该确定边界情况,这需要经验和创造性,通常输入等价类和输出等价类的边界,就是应该着重测试的程序边界情况。
选取的测试数据应该刚好等于、刚刚小于和刚刚大于边界值;
按照边界值分析法,应该选取刚好等于、稍小于和稍大于等价类边界值的数据作为测试数据,而不是选取每个等价类内的典型值或任意值作为测试数据。
如规定输入输出条件范围,则选取的测试数据应该刚好等于、刚刚小于和刚刚大于边界值;
如规定输入0<=n<=100,则选0,100,-1,101作为测试数据;
如果规定了输入输出个数,则分别选最大个数,最小个数,比最大个数多1,比最小个数少1作为测试数据;
如规定学生至少选5门课,至多选9门课,则选5, 9, 4, 10作为测试数据;
如果输入输出为有序集合,如文件或表格,应将注意力集中在有序集的第一个和最后一个元素;
如果程序中定义的数据结构有预定义的边界,如数组的上下界,则选择刚好打到边界和刚好超出边界的数据为测试数据。
3. 错误推测:对于程序中可能存在哪类错误的推测,是挑选测试方案的一个重要因素,错误推测法在很大程度上靠直觉和经验进行。它的基本想法是列举出程序中可能有的错误和容易发生错误的特殊情况,并且根据它们选择测试方案,已经发现的错误数目往往和尚未发现的错误数目成正比,因此,在进一步测试时要着重测试那些已经发现了较多错误的程序段。
例如:在测试一个排序程序时,输入表为空表、输入表只有一个元素、输入表所有元素都相同、输入表已经排好序。
4. 因果图法:如果在测试时必须考虑输入条件的各种组合,可使用一种适合于描述对于多种条件的组合,相应产生多个动作的形式来设计测试用例,这时就需要利用因果图,因果图方法最终生成的就是判定表,它适合于检查程序输入条件的各种组合情况。
基本步骤:
a. 分析软件规格说明描述中,哪些是原因 (即输入条件或输入条件的等价类),哪些是结果 (即输出条件),并给每个原因和结果赋予一个标识符;
b. 分析软件规格说明描述中的语义,找出原因与结果之间,原因与原因之间对应的是什么关系? 根据这些关系,画出因果图;
c. 由于语法或环境限制,有些原因与原因之间,原因与结果之间的组合情况不可能出现。为表明这些特殊情况,在因果图上用一些记号标明约束或限制条件;
d. 把因果图转换成判定表;
e. 把判定表的每一列拿出来作为依据,设计测试用例.
因果图基本符号:
软件可靠性:程序在给定的时间间隔内,按照规格说明书的规定成功地运行的概率。
软件的平均无故障时间MTTF是一个重要的质量指标,往往作为对软件的一项要求由用户提出
估算MTTF使用下述符号表示有关的数量:
ET——测试之前程序中错误总数;
IT ——程序长度(机器指令总数);
τ——测试(包括调试)时间;
Ed(τ)——在0至τ期间发现的错误数;
Ec(τ)——在0至τ期间改正的错误数。
失效率正比于软件中剩余的(潜藏的)错误数,而平均无故障时间MTTF与剩余的错误数成反比。
估算平均无故障时间估算:
经验表明,平均无故障时间与单位长度程序中剩余的错误数成反比,即
MTTF=1/(K(Et/It)-Ec/It)
其中K为常数,它的值应该根据经验选取。美国的一些统计数字表明,K的典型值是200。
估算平均无故障时间的公式,可以评价软件测试的进展情况。此外,由上式可得
Ec=Et-It/(K*MTTF)
因此,也可以根据对软件平均无故障时间的要求,估计需要改正多少个错误之后,测试工作才能结束。
估算程序中的错误数常用“分别测试法”:随机地给一部分错误加标记,分别测试法使用两个测试员(或测试小组),彼此独立地测试同一个程序的两个副本,把其中一个测试员发现的错误作为有标记的错误。具体做法是,在测试过程的早期阶段,由测试员甲和测试员乙分别测试同一个程序的两个副本,由另一名分析员分析他们的测试结果。用τ表示测试时间,假设:
τ= 0 时错误总数为B0;
τ=τ1时测试员甲发现的错误数为B1;
τ=τ1时测试员乙发现的错误数为B2;
τ=τ1时两个测试员发现的相同错误数为bc。
如果认为测试员甲发现的错误是有标记的,即程序中有标记的错误总数为B1,则测试员乙发现的B2个错误中有bc个是有标记的。假定测试员乙发现有标记错误和发现无标记错误的概率相同,则可以估计出测试前程序中的错误总数为:
Bo=B1*B2/bc