![cover](https://img-blog.csdnimg.cn/8405f4562b844c71822bc56ec9d69ab6.jpeg)
2023 软件质量保证与测试期末考解答题知识点整理
仅供班级复习使用,无含金量
目录
1.某种信息加密代码由以下三部分组成,请用等价类划分法分析它所有的等价类并设计测试用例
题面:
- 加密类型码:空白或三位数字
- 前缀码:非0或1开头的三位数
- 后缀码:四位数字
解答:
等价类划分首先需要划分有效的等价类和无效的等价类,则:
- 加密类型码:
- 有效等价类:空白,000 - 999
- 无效等价类:非数字,小于三位数,大于三位数
- 前缀码:
- 有效等价类:200-999
- 无效等价类:非数字,0开头的三位数,1开头的三位数,小于三位数,大于三位数,非数字
- 后缀码:
- 有效等价类:0000-9999
- 无效等价类:非数字,小于四位数,大于四位数
提示:
测试用例需要覆盖以上所有的等价类
在设计有效测试用例时,可以一次性覆盖尽可能多的有效等价类,但设计无效测试用例时,为了确认是否是因为这个等价类导致的无效,所以必须一个一个测试无效等价类
解答:
-
有效测试用例:
- 空白 200 1111
- 123 456 7890
-
无效测试用例:
-
加密类型码无效:
- z 200 1111 (非数字
- 12 200 1111 (低于三位数
- 1234 200 1111 (高于三位数
-
前缀码无效:
- 123 z 1111 (非数字
- 123 012 1111 (0开头
- 123 123 1111 (1开头
- 123 22 1111 (低于三位数
- 123 2234 1111 (高于三位数
-
后缀码无效:
- 123 234 z (非数字
- 123 234 123 (小于四位数
- 123 234 12345 (大于四位数
-
2.根据程序描述,使用场景法画出事件流图、分析测试场景并设计测试用例
题面:
有一个在线购物网站,主要功能包括登录,商品选购,在线支付完成购物等。用户在使用这些功能时可能会出现各种情况:如账号不存在、密码错误、账户余额不足等。设目前该系统中仅有一个账号 abc;密码为 123; 账户余额为 200;仅有商品 A,售价均为 50 元,库存为 15, 商品 B 售价为 50 元,库存为0
试采用场景法:
- 分析画出事件流图,并标注基本流和备注流
- 分析生成测试场景
- 对每个场景设计相应的测试用例
提示:
绘制事件流图时,每个圆表示一个操作,基本流为正常的操作流程,备选流为正常操作流程可能产生的其他操作
解答:
提示:
测试场景直接把序按流程执行下来所有可能的结果全写出来就行
测试用例就直接按着场景来写
解答:
场景1:基本流
场景2:基本流,备选流1
场景3:基本流,备选流2
场景4:基本流,备选流3
场景5:基本流,备选流4
测试用例:
场景/条件 | 账号 | 密码 | 操作 | 预期结果 |
---|---|---|---|---|
成功购物 | abc | 123 | 登录系统,选取A货物购买1个 | 支付成功 |
账号不存在 | asdasd | 123 | 登录系统 | 登录失败 |
密码错误 | abc | asdas | 登录系统 | 登录失败 |
货物缺货 | abc | 123 | 登录系统,买一个B货物 | 提示货物缺货 |
余额不足 | abc | 123 | 登录系统,买15个A货物 | 支付失败 |
来点程序员笑话放松一下顺便加深一下对场景法的了解
一个测试工程师走进一家酒吧,要了一杯啤酒
一个测试工程师走进一家酒吧,要了一杯咖啡
一个测试工程师走进一家酒吧,要了0.7杯啤酒
一个测试工程师走进一家酒吧,要了-1杯啤酒
一个测试工程师走进一家酒吧,要了2^32杯啤酒
一个测试工程师走进一家酒吧,什么也没要
一个测试工程师走进家酒吧,又走出去又从窗户进来又从后门出去从下水道钻进来
一个测试工程师走进家酒吧,又走出去又进来又出去又进来又出去,最后在外面把老板打了一顿
一个测试工程师走进一家酒吧,要了一杯烫烫烫的锟斤拷
一个测试工程师走进一家酒吧,要了NaN杯Null
1T测试工程师把酒吧拆了
一个测试工程师化装成老板走进一家酒吧,要了500杯啤酒,并且不付钱
一万个测试工程师在酒吧外呼啸而过
一个测试工程师走进一家酒吧,要了一杯啤酒‘;DROPTABLE酒吧
测试工程师们满意地离开了酒吧
然后一名顾客点了一份炒饭,酒吧炸了
3. 有一个学生信息输入界面,输入项有:姓名、学号、性别,输入项状态有填和不填,请采用正交法对其进行测试用例设计
题面:
- 请选择 L 4 ( 2 3 ) L_4(2^3) L4(23)正交表
- 根据选定的正交表进行变量映射
- 设计测试用例
解答:
正交表得自己记一下,不难,长这样:(以后真要用这个可以直接上网抄一个来)
1 | 2 | 3 | |
---|---|---|---|
1 | 0 | 0 | 0 |
2 | 0 | 1 | 1 |
3 | 1 | 0 | 1 |
4 | 1 | 1 | 0 |
变量映射:(其实就是把输入项和状态放进去)
将1映射为填,0映射为不填
姓名 | 学号 | 性别 | |
---|---|---|---|
1 | 不填 | 不填 | 不填 |
2 | 不填 | 填 | 填 |
3 | 填 | 不填 | 填 |
4 | 填 | 填 | 不填 |
设计测试用例:(对着上面的表照抄)
- 不填写姓名,不填写学号,不填写性别
- 不填写姓名,填写学号,填写性别
- 填写姓名,不填写学号,填写性别
- 填写姓名,填写学号,不填写性别
完了不认识填这个字了
4. 为以下程序设计测试用例集,要求满足语句覆盖、判定覆盖、条件覆盖、条件/判定覆盖、条件组合覆盖
题面:
public int do_work(int A, int B) {
int x = 0;
if ((A > 4) && (B < 9))
x = A - B;
if (A == 5 && B > 28)
x = A + B;
return x;
}
提示:
答案不唯一,只要符合题意就行,建议自己画个表来做看的直观一点
-
语句覆盖:所有语句都能执行到,那么使得两个
if
全为true
即可 -
判定覆盖:所有判定语句的真假情况都被执行一次,判定覆盖实际上包括了语句覆盖,使得两个
if
各出现一次true
和false
即可 -
条件覆盖:判定语句的每个子条件都至少要取得一次真值和假值,在题目中就是
A > 4
、B < 9
、A == 5
、B > 28
都各出现一次true
和false
即可 -
条件/判定覆盖:就是测试用例满足判定覆盖和条件覆盖的条件,只要写过了上面两个,那所有测试用例就一定满足条件/判定覆盖
-
条件组合覆盖:每个判定语句的子条件真假组合结果都要执行一次,在题目中就是第一个
if
的A > 4
、B < 9
;第二个if
的A == 5
、B > 28
这些东西所有可能的true false
组合都要出现一次,画个表可以方便理解:A > 4 B < 9 T T T F F T F F A == 5 B > 28 T T T F F T F F
5. 根据程序画出程序控制流图,计算环路复杂度,并导出基本路径,最后设计测试用例
题面:
1 public int Function1(int num, int cycle, boolean flag)
2 {
3 int ret = 0;
4 while( cycle > 0 )
5 {
6 if( flag == true )
7 {
8 ret = num - 10;
9 break;
10 }
11 else
12 {
13 if( num%2 ==0 )
14 {
15 ret = ret * 10;
16 }
17 else
18 {
19 ret = ret + 1;
20 }
21 }
22 cycle--;
23 }
24 return ret;
25}
提示:
程序控制流图的每个语句算一个控制节点(用圆形表示),节点的编号为程序的行号
解答:
提示:
环路复杂度的计算,常用的有以下两种:
- 程序中所有的分支语句数量 + 1
- 控制流图中所有的闭合区间数量(所有控制结点的最外层也算一个)
解答:
环路复杂度 = 3(分支语句的数量) + 1 = 4
提示:
基本路径是所有不重复的,从开头走到结束的路径(因此理论上基本路径在遇到循环的情况有无数条,所以对于带有循环的基本路径,一般只取循环一次的典型值
解答:
基本路径有以下4条:
- 3-4-24
- 3-4-6-8-24
- 3-4-6-13-15-22-4-24
- 3-4-6-13-19-22-4-24
提示:
测试用例就对着基本路径来,保证给定的条件可以让程序按着当前的基本路径执行即可,当然,测试用例答案不唯一
解答:
num | cycle | flag | |
---|---|---|---|
1 | 10 | 0 | true |
2 | 100 | 10 | true |
3 | 10 | 1 | flase |
4 | 5 | 1 | flase |
6. 根据程序设计测试脚本,实现语句覆盖和条件覆盖测试
题面:
public class GCD {
public int getGCD(int x, int y) {
if (x < 1 || x > 100) {
System.out.println("数据超出范围");
return -1;
}
if (y < 1 || y > 100) {
System.out.println("数据超出范围");
return -1;
}
int max, min, result = 1;
if (x >= y) {
max = x;
min = y;
} else {
max = y;
min = x;
}
for (int n = 1; n <= min; n++) {
if (min % n == 0 && max % n == 0) {
if (n > result)
result = n;
}
}
System.out.println("因数:" + result);
return result;
}
}
- 设计测试脚本,对GCD的
getGCD
方法实现语句覆盖测试 - 设计测试脚本,对GCD的
getGCD
方法实现条件覆盖测试
提示:
如果忘记这两个逻辑覆盖是什么意思:
-
语句覆盖:所有语句都能执行到
-
条件覆盖:判定语句的每个子条件都至少要取得一次真值和假值
JUnit 测试类用@Test
注解来标识测试方法,使用assertEquals()
方法来预期输出和程序输出是否相符
用法如下:assertEquals(预期输出, 程序输出)
程序的作用是求两个数的最大公因数,测试用例答案不唯一,建议自行构思并补全
解答:
class GCDTest {
@Test
void getGCD() {
GCD gcd = new GCD();
assertEquals(预期值, gcd.getGCD(参数1, 参数2));
.....
}
}
额外小知识
其实公因数算法压根不需要写这么大一坨,欧几里得算法三行就能搞定:
int gcd(int a, int b) {
if (a % b == 0) return b;
else return gcd(b, a % b);
}
还想知道更多?快加入校内的算法协会一起研究更多骚操作吧 `:D
![Logo](https://devpress.csdnimg.cn/79de2bf0b7994defa4242ef90d5513fa.jpg)
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)