大纲
-
应用题(每小题10分,共30分)
- 使用边界值分析法,设计测试用例(快递的那题)
- 决策表
- 分析条件桩和动作桩
- 画出决策表
- 简化决策表,设计设计测试用例
-
分析题(每小题5分,共30分)
- 设计测试用例,满足判定覆盖
- 设计测试用例,满足判定条件覆盖
- 按照程序代码,画出控制流程图
- 计算环的复杂度,就是计算连通度的方法
- 导出基本路径集
- 基于基本路径集做路径覆盖的测试用例
-
设计题(每小题10分,共20分)
- 为该集成测试的任务设计两套不同的测试方案(自底向上,自顶向下等)
stub为桩模块,Dri为驱动模块 - 对这两种方案分析各自的优缺点,并针对一种方案进行说明
- 为该集成测试的任务设计两套不同的测试方案(自底向上,自顶向下等)
-
综合题(20分)
GBT/5532-2008 8.3
分析这三条标准的编制理由
黑盒测试
考黑盒测试方法大抵是差不多的,判定表和之前学的稍有差别,在第一次判定之后,会根据条件项是否会影响动作项将判定表简化一下。
边界值测试
边界值是由于软件的任何数值运算都会有一定的范围限制,考试只会考一些很好找到的边界值条件,
例如在条件判断语句中重新的比大小。
- 边界值分析法:在边界上取五个值:min、min+、nom、max-、max
讲人话就是取的五个值都在范围内,- 取一个最小值
- 取一个比最小值稍大的值
- 取一个正常值
- 取一个比最大值稍小的值
- 取一个最大值
要求 | 边界值分析法的取值 | 健壮性边界测试的取值 | 最坏情况测试 |
---|---|---|---|
int x属于[5,10] | 5,6,7,9,10 | 4,5,6,7,9,10,11 | 在单变量取极值的情况和健壮性边界测试一致 |
int x属于(5,10) | 6,7,9 | 5,6,7,9,10 | 在单变量取极值的情况和健壮性边界测试一致 |
一般会使用边界值分析测试方法,就是在边界上选取5个取值;
如果是使用健壮性边界测试会特别说明,会多取两个靠近边界值的界外点
黑盒测试例题
快递收费标准
快递按公斤计算超过1公斤按2公斤算,超过2公斤就按3公斤算以此类推。(每个产品的重量在产品的详情里面都有标注)
江浙沪首重10元续重1.5元,北京,安徽,福建,广东,广西,贵州,海南,河北,河南,黑龙江,湖北,湖南,江西,辽宁,宁夏,山东,山西,陕西,四川,天津,云南,重庆首重18元续重15元,甘肃,吉林,内蒙古,青海,西藏,新疆首重25元续重22元。
首重是指1公斤以内,续重是每增加一公斤
f(x,y)=
-
(这里简单介绍一下边界范围)
题目有两个边界,快递公斤数和公里数,快递公斤数范围为 x ∈ [ 0 , 1 ] ; x ∈ [ 1 , + ∞ ) x\in[0,1];x\in[1,+\infty) x∈[0,1];x∈[1,+∞);公里数的范围为 y ∈ [ 0 , 500 ] ; y ∈ ( 500 , 1000 ] ; y ∈ ( 1000 , 3000 ] y\in[0,500];y\in(500,1000];y\in(1000,3000] y∈[0,500];y∈(500,1000];y∈(1000,3000] -
按照题目要求,使用边界值测试方法设计测试用例:
序号 x(重量) y(公里) 期望输出 1 1 500 10 2 1.1 500 11.5 3 1 1000 18 4 1.1 1000 33 5 1 3000 25 6 1.1 3000 47
基于判定表测试
判定表通常由四个部分组成:
- 条件桩 : 列出问题的所有条件
- 条件项: 列出左列条件桩的取值(真假值)
- 动作桩: 列出问题规定可能采取的操作
- 动作项: 列出在对应的条件项组合下应采取的动作
考法就是我们的测试步骤,列出所有的条件和动作;生成判定表;简化判定表;写出测试用例
说的看似很复杂其实就是先通过判断语句找出题目中的条件,这个时候就可以看出输入的动作,每一个判定做笛卡尔积就产生了没简化的判定表,再将动作相同的项合并就产生简化后的判定表,我们直接看题目。
判定表例题
1、用决策表测试法测试以下程序:该程序有三个输入变量month、day、year(month 、 day和year均为整数值,并且满足:1≤month≤12和1≤day≤31),分别作为输入日期的月份、日、年份,通过程序可以输出该输入日期在日历上隔一天的日期(next day)。例如,输入为 2004 年11月29日,则该程序的输出为2004年12月1日。
(1) 分析各种输入情况,列出为输入变量 month 、 day 、 year 划分的有效等价类。
(2) 分析程序的规格说明,并结合以上等价类划分的情况,给出问题规定的可能采取的操作(即列出所有的动作桩)。
(3) 根据 (1) 和 (2) ,画出简化后的决策表。
-
做等价类的划分
(1)答:(这里的划分标准就是按照题目的意思,认真读题)等价类 划分 month变量的有效等价类: M1: {month=4,6,9,11}
M2: {month=1,3,5,7,8,10}
M3: {month=12}
M4: {month=2}day变量的有效等价类: D1:{1≤day≤26}
D2: {day=27}
D3: {day=28}
D4: {day=29}
D5: {day=30}
D6:{day=31}year变量的有效等价类: Y1: {year是闰年}
Y2: {year不是闰年} -
分析得出动作桩
考虑各种有效的输入情况,程序中可能采取的操作有以下六种:
a1: day+2
a2: day=2
a3: day=1
a4: month+1
a5: month=1
a6: year+1 -
根据 (1) 和 (2) ,画出简化后的决策表。
这里直接放简化的决策表,主要是表格的格式,这个的条件桩和动作桩太多了,导致整个决策表比较大,考试应该会考一个条件和动作少一点的,但是书上这个案例合适一点就拿来举例了。
白盒测试
这里做过很多遍了,主要是理解判定覆盖、判定条件覆盖、条件组合覆盖等的区别
覆盖类型 | 覆盖条件 |
---|---|
语句覆盖 | 所有的语句至少覆盖一次 |
判定覆盖 | 所有的判断的真假至少覆盖一次 |
条件覆盖 | 所有条件的真假至少覆盖一次 |
判定条件覆盖 | 所有条件的真假至少覆盖一次并且保证判断的真假也要覆盖到 |
条件组合覆盖 | 每个判断中所有条件的组合要覆盖一次 |
路径覆盖 | 每个可能路径都需要覆盖一次 |
白盒测试例题
老师出的题目可能是每个判定中只有单个条件,所以判定覆盖、条件覆盖、判定条件覆盖在测试用例上没区别,我给两道经典的题目,更加详细地了解他们的区别。
1.题目一:使用逻辑覆盖测试方法测试以下程序段
void DoWork (int x,int y,int z)
{
1 int k=0;
2 float j=0;
3 if ( (x>3)&&(z<10) )
4 {
4 k=xy-1;
5 j=sqrt(k);
6 }
7 if((x==4)||(y>5))
8 j=xy+10;
9 j=j%3;
10 }
说明:程序段中每行开头的数字(1~10)是对每条语句的编号。
(1)画出程序的控制流图(用题中给出的语句编号表示)。
(2)分别以语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、组合覆盖和路径覆盖方法设计测试用例,并写出每个测试用例的执行路径(用题中给出的语句编号表示)。
- 通过程序画出控制流图,这个不难,需要注意的地方是每个判定就导致一次分支,遇到循环语句就有回流分支,注意这两个地方就没问题了,计算圈复杂度采用计算连通度的方法(边-点+2)可以得到会有几条基本路径。
- 这里我们计算一下圈复杂度:11-10+2=3,所以有三个环,就说明有三条基本路径
- 这个基本路径集不唯一,从最少的路径开始慢慢加上环外的语句就可以导出了
- 1->2->3->7->9->10
- 1->2->3->7->8->9->10
- 1->2->3->4->5->6->7->8->9->10
集成测试
这种题会给一个程序模块化的设计示意图,然后大家选择集成测试方案后根据方案特点将这个示意图拆分。
(D表示Dri为驱动模块的意思,S为stub为桩模块的意思)
我这里给一个自顶向下和自底向上这两种方式
集成测试的结构示意图:
自底向上的集成测试方案:
通过示意图可以看出底层模块有M4、M5、M3,所以先选择这三个作为测试对象,三个可以并列进行,建立三个驱动模块为D1、D2、D3;
然后测试M2,建立驱动模块D4;
最后测试M1;
具体的测试过程:
优点:
- 有助于最大限度地减少对桩模块的需求
- 可以实施多个模块的并行测试,提高了测试效率,测试人员能较好地锁定软件故障的位置
缺点:
- 不能很好地支持有限功能的早期发布
- 对驱动程序的需求让测试管理变得很复杂
自顶向下的集成测试方案:
(我这里采用的深度优先的策略,这个很容易看出区别的)
通过示意图可以看出顶层模块为M1,建立两个桩模块为S1、S2;
然后测试M2,建立桩模块S3、S4;
测试M3、M4、M5;
具体的测试过程:
优点:
- 有助于最大限度地减少驱动程序的需求
- 高级别的逻辑和数据流可以在过程的早期阶段测试
缺点:
- 不能很好地支持有限功能的早期发布
- 对桩模块的需求让测试管理变得重要而且可能很复杂
系统测试
系统测试的技术要求
- 系统的每个特性应至少被一个正常测试用例和一个被认可的异常测试用例
- 测试用例的输入应至少包括有效等价类值、无效等价类值和边界数据值
- 应逐项测试系统、子系统设计说明规定的系统的功能、性能等特性
- 应测试软件配置项之间及软件配置项与硬件之间的接口
- 应测试系统的输出及其格式
- 应测试运行条件在边界状态和异常状态下,或人为设定的状态下,系统的稳定性
- 应测试系统访问和数据安全性
- 应测试系统的全部存储量、输入输出通道和处理时间的余量
- 应按系统或子系统设计文档的要求,对系统的功能、性能进行强度测试
- 应测试设计中用于提高系统安全性、可靠性的结构、算法、容错、冗余
- 对完整性级别高的系统,应对其进行安全性、可靠性分析,明确每一个可能原因,并对此进行针对性的测试
测试成本计算
软件质量标准和软件质量保证
软件测试依据的国家技术标准规范主要有以下八个:
GB/T 17544-1998 《信息系统及软件完整性级别》
GB/T 16260-2006 《软件质量模型与度量》
GB/T 18905-2002 《软件工程产品评价》
*GB/T 8567-2006 《计算机软件文档编制规范》
GB/T9386-2008 《计算机软件测试文件编制规范》
GB/T 25000.1-2010 《软件质量要求与评价(SQuaRE)指南》
CSTCJSBZ02 《应用软件产品测试规范》
CSTCJSBZ03 《软件产品测试评分标准》
这个不用背了解一下我国有哪些软件测试标准就可以了,考试会告诉你几个标准的细节,然后让你分析为什么怎么制定
GBT/5532-2008 8.3的查询网址
例:根据上述的标准和规范,分析那些设计问题会使QQ性能降低、会影响QQ的安全。
信息系统及软件完整性级别中:QQ的软件系统验收完整性级别为4级系统级别,它不是分布式的存储结构,无法保证同一个用户同一时刻的大数据量的轰炸,性能会下降很多
QQ的容灾备份是3级在线数据恢复,通过网络将关键数据进行备份并存放至异地,制定有相应灾难恢复计划,有备份中心,并配备部分数据处理系统及网络通信系统。当网络较差的时候QQ消息会丢失,极大的降低了用户的体验感。
QQ的应用软件产品测试对待手机认证不太完善,没有对手机用户的认证关系,丢了手机就丢了QQ号,会对个人用户的QQ安全带来影响。
只要分点答,不要太离谱就可以了,可以从几个方面来答题:安全性的角度、容灾备份的角度、软件性能的角度、经济价值的角度等等诸多角度来分析。
按照国家标准,软件测试分析以下方面,大家可以按照这些方面来分析:
- 功能性
- 适合性方面
- 准确性方面
- 互操作性方面
- 安全保密性方面
- 可靠性
- 成熟性方面
- 容错性方面
- 易恢复性方面
- 易用性
- 易理解性方面
- 易学性方面
- 易操作性方面
- 吸引性方面
- 效率
- 时间特性方面
- 资源利用性方面
- 维护性
- 易分析性方面
- 易改变性方面
- 稳定性方面
- 易测试性方面
- 可移植性
自动化测试
为什么要用自动化测试?
主要是可以大量地降低测试成本,可以从诸多方面做答。
- 必要性:
- 手工测试不适合回归测试。回归测试是软件开发测试中非常频繁的一项测试,若通过手工测试,则会耗费大量的人力物力
- 许多与时序、死锁、资源冲突、多线程等错误,通过手工测试很难捕捉到
- 进行系统负载测试,需要模拟大量数据或大量并发用户等。
附录:
黑盒例题的测试程序:
import org.junit.Assert;
import org.junit.Test;
public class JunitTest {
//被测试程序
public double cost(double x, double y) {
if(y >= 0 && y <= 500) {
return 10 + (Math.ceil(x) - 1) * 1.5;
} else if(y > 500 && y <= 1000) {
return 18 + (Math.ceil(x) - 1) * 15;
} else if(y > 1000 && y <= 3000){
return 25 + (Math.ceil(x) - 1) * 22;
}
else {
return -1;
}
}
//断言测试
@Test
public void testCost(){
Assert.assertEquals(10, cost(1, 500), 0.0);
Assert.assertEquals(11.5, cost(1.1, 500), 0.0);
Assert.assertEquals(18, cost(1, 1000), 0.0);
Assert.assertEquals(33, cost(1.1, 1000), 0.0);
Assert.assertEquals(25, cost(1, 3000), 0.0);
Assert.assertEquals(47, cost(1.1, 3000), 0.0);
}
}