题面:
解答:
等价类划分首先需要划分有效的等价类和无效的等价类,则:
提示:
测试用例需要覆盖以上所有的等价类
在设计有效测试用例时,可以一次性覆盖尽可能多的有效等价类,但设计无效测试用例时,为了确认是否是因为这个等价类导致的无效,所以必须一个一个测试无效等价类
解答:
有效测试用例:
无效测试用例:
加密类型码无效:
前缀码无效:
后缀码无效:
题面:
有一个在线购物网站,主要功能包括登录,商品选购,在线支付完成购物等。用户在使用这些功能时可能会出现各种情况:如账号不存在、密码错误、账户余额不足等。设目前该系统中仅有一个账号 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酒吧
测试工程师们满意地离开了酒吧
然后一名顾客点了一份炒饭,酒吧炸了
题面:
解答:
正交表得自己记一下,不难,长这样:(以后真要用这个可以直接上网抄一个来)
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 | 填 | 填 | 不填 |
设计测试用例:(对着上面的表照抄)
完了不认识填这个字了
题面:
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 |
题面:
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}
提示:
程序控制流图的每个语句算一个控制节点(用圆形表示),节点的编号为程序的行号
解答:
环路复杂度的计算,常用的有以下两种:
解答:
环路复杂度 = 3(分支语句的数量) + 1 = 4
提示:
基本路径是所有不重复的,从开头走到结束的路径(因此理论上基本路径在遇到循环的情况有无数条,所以对于带有循环的基本路径,一般只取循环一次的典型值
解答:
基本路径有以下4条:
提示:
测试用例就对着基本路径来,保证给定的条件可以让程序按着当前的基本路径执行即可,当然,测试用例答案不唯一
解答:
num | cycle | flag | |
---|---|---|---|
1 | 10 | 0 | true |
2 | 100 | 10 | true |
3 | 10 | 1 | flase |
4 | 5 | 1 | flase |
题面:
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;
}
}
getGCD
方法实现语句覆盖测试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