2023 软件质量保证与测试期末考解答题知识点整理

文章介绍了软件测试中的等价类划分法,用于设计加密代码的测试用例,以及场景法在在线购物网站事件流图中的应用。同时,讨论了正交法在学生信息输入界面测试用例设计中的应用,并针对特定程序设计了满足不同覆盖标准(语句覆盖、判定覆盖等)的测试用例。此外,提到了程序控制流图的绘制、环路复杂度计算及基本路径确定,以及如何编写测试脚本实现语句和条件覆盖测试。
摘要由CSDN通过智能技术生成

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. 分析生成测试场景
  3. 对每个场景设计相应的测试用例

提示:

绘制事件流图时,每个圆表示一个操作,基本流为正常的操作流程,备选流为正常操作流程可能产生的其他操作

解答:

事件流

提示:

测试场景直接把序按流程执行下来所有可能的结果全写出来就行

测试用例就直接按着场景来写

解答:

场景1:基本流

场景2:基本流,备选流1

场景3:基本流,备选流2

场景4:基本流,备选流3

场景5:基本流,备选流4

测试用例:

场景/条件账号密码操作预期结果
成功购物abc123登录系统,选取A货物购买1个支付成功
账号不存在asdasd123登录系统登录失败
密码错误abcasdas登录系统登录失败
货物缺货abc123登录系统,买一个B货物提示货物缺货
余额不足abc123登录系统,买15个A货物支付失败

来点程序员笑话放松一下顺便加深一下对场景法的了解

一个测试工程师走进一家酒吧,要了一杯啤酒

一个测试工程师走进一家酒吧,要了一杯咖啡

一个测试工程师走进一家酒吧,要了0.7杯啤酒

一个测试工程师走进一家酒吧,要了-1杯啤酒

一个测试工程师走进一家酒吧,要了2^32杯啤酒

一个测试工程师走进一家酒吧,什么也没要

一个测试工程师走进家酒吧,又走出去又从窗户进来又从后门出去从下水道钻进来

一个测试工程师走进家酒吧,又走出去又进来又出去又进来又出去,最后在外面把老板打了一顿

一个测试工程师走进一家酒吧,要了一杯烫烫烫的锟斤拷

一个测试工程师走进一家酒吧,要了NaN杯Null

1T测试工程师把酒吧拆了

一个测试工程师化装成老板走进一家酒吧,要了500杯啤酒,并且不付钱

一万个测试工程师在酒吧外呼啸而过

一个测试工程师走进一家酒吧,要了一杯啤酒‘;DROPTABLE酒吧

测试工程师们满意地离开了酒吧

然后一名顾客点了一份炒饭,酒吧炸了

3. 有一个学生信息输入界面,输入项有:姓名、学号、性别,输入项状态有填和不填,请采用正交法对其进行测试用例设计

题面:

  1. 请选择 L 4 ( 2 3 ) L_4(2^3) L4(23)正交表
  2. 根据选定的正交表进行变量映射
  3. 设计测试用例

解答:

正交表得自己记一下,不难,长这样:(以后真要用这个可以直接上网抄一个来)

123
1000
2011
3101
4110

变量映射:(其实就是把输入项和状态放进去)

将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各出现一次truefalse即可

  • 条件覆盖:判定语句的每个子条件都至少要取得一次真值和假值,在题目中就是A > 4B < 9A == 5B > 28都各出现一次truefalse即可

  • 条件/判定覆盖:就是测试用例满足判定覆盖和条件覆盖的条件,只要写过了上面两个,那所有测试用例就一定满足条件/判定覆盖

  • 条件组合覆盖:每个判定语句的子条件真假组合结果都要执行一次,在题目中就是第一个ifA > 4B < 9;第二个ifA == 5B > 28这些东西所有可能的true false组合都要出现一次,画个表可以方便理解:

    A > 4B < 9
    TT
    TF
    FT
    FF
    A == 5B > 28
    TT
    TF
    FT
    FF

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

提示:

测试用例就对着基本路径来,保证给定的条件可以让程序按着当前的基本路径执行即可,当然,测试用例答案不唯一

解答:

numcycleflag
1100true
210010true
3101flase
451flase

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;
    }
}
  1. 设计测试脚本,对GCD的getGCD方法实现语句覆盖测试
  2. 设计测试脚本,对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

  • 8
    点赞
  • 96
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值