应用题(每小题10分,共30分)
分析题(每小题5分,共30分)
设计题(每小题10分,共20分)
综合题(20分)
GBT/5532-2008 8.3
分析这三条标准的编制理由
考黑盒测试方法大抵是差不多的,判定表和之前学的稍有差别,在第一次判定之后,会根据条件项是否会影响动作项将判定表简化一下。
边界值是由于软件的任何数值运算都会有一定的范围限制,考试只会考一些很好找到的边界值条件,
例如在条件判断语句中重新的比大小。
| 要求 | 边界值分析法的取值 | 健壮性边界测试的取值 | 最坏情况测试 |
|---|---|---|---|
| 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)分别以语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、组合覆盖和路径覆盖方法设计测试用例,并写出每个测试用例的执行路径(用题中给出的语句编号表示)。





这种题会给一个程序模块化的设计示意图,然后大家选择集成测试方案后根据方案特点将这个示意图拆分。
(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的软件系统验收完整性级别为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);
}
}