软件测试的艺术_读书笔记(四)

第三章 模块(单元)测试

模块测试是对系统中的单个子模块、子程序进行测试的过程, 一开始并不是对整个程序进行测试, 将注意力集中在构成程序的较小模块的测试上面,发现软件问题。

目的 : 将模块的功能与定义模块的功能说明书进行比较,不是为了说明模块符合其规格说明,而是为了揭示出模块与其规格说明书存在着矛盾。

三个方面来探讨模块测试 :

  1. 测试用例的设计方式
  2. 模块测试及集成的顺序
  3. 对执行模块测试的建议

1.测试用例的设计

 测试输入 : 模块的规格说明书和模块的源代码,规格说明书一般都规定了模块的输入和输出以及模块的功能

 模块测试的设计:总体上是面向白盒测试,对模块内部的程序流程和逻辑有清晰的认识;然后使用黑盒测试方法对照模块的规格说明书进行测试

例子: 增加薪水的模块

功能描述 :给销售额最高的部门的雇员增加薪水2000,但是如果符合该条件的员工的工资目前达到或超过15000或者是管理人员,则只增加1000

输入情况如下表所示,部门销售额信息和员工信息,如果模块正确完成功能,返回错误码0,如果部门雇员表或者部门表中不存在任何信息,模块将返回错误代码1

如果某个符合条件的部门中未发现任何雇员,模块将返回错误码2

输入参数 : dsize和esize 分别代表部门数量和雇员数量

部门表

部门

销售额

   

雇员表

姓名

工号

部门

薪水

       

源代码: 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71

public class Test {
    public static int ERRCODE = 0;
    public static double MAXSALES = 0;
    public static double SALARY_LIMIT=15000;
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int dsize = scanner.nextInt();
        int esize = scanner.nextInt();
        if (dsize <= 0 || esize <= 0) {
            ERRCODE = 1;
        else {
            //获得最大的销售额
            for (int i = 1; i <= dsize; i++) {
                if (SALES(i) >= MAXSALES)
                    MAXSALES = SALES(i);
            }
            for (int i = 1; i <= dsize; i++) {
                if (SALES(i) == MAXSALES) {
                    boolean has = false//判断是否有
                    for (int j = 1; j <= dsize ; j++) {
                        //查看薪水最高的部门的员工,加薪资
                        if (getDeptNameInDeptTable(i).equals(getDeptNameInEmpTable(j))) {
                            has = true;
                            if(getSalary(j) >= SALARY_LIMIT || isManager(j)) {
                                setSalary(getSalary(j) + 1000L);
                            else {
                                setSalary(getSalary(j) + 2000L);
                            }
                        }
                    }
                    //所有符合条件的部门都没有员工
                    if (!has) ERRCODE=2;
                }
            }
        }
        System.out.println(ERRCODE);
    }
    /**
     * 查看部门的销售额
     * 实际应该查询数据表中每一行记录,这里随机产生
     * @param i
     * @return
     */
    private static double SALES(int i) {
        return new Random().nextInt(10000);
    }
    /**
     * 在部门表中获得部门名称
     */
    private static String getDeptNameInDeptTable(int i) {
        return "";
    }
    /**
     * 在员工表中获得部门名称
     */
    private static String getDeptNameInEmpTable(int i) {
        return "";
    }
    /**
     * 在员工表中获得员工薪水
     */
    private static double getSalary(int i) {
        return new Random().nextInt(10000);
    }
    /**
     * 设置新的薪水
     */
    private static double setSalary(double i) {
        return new Random().nextInt(10000);
    }
}

1.1 测试逻辑分析

第一步:列举代码的逻辑判断 : 

9 if (dsize <= 0 || esize <= 0)
14 if (SALES(i) >= MAXSALES)
18 if (SALES(i) == MAXSALES)
22 if (getDeptNameInDeptTable(i).equals(getDeptNameInEmpTable(j)))
24 if(getSalary(j) >= SALARY_LIMIT || isManager(j))
32 if (!has)

分析逻辑判断,使用判定覆盖准则,设计充足的测试用例

判定

正确结果

错误结果

9 dsize<=0 或者 esize <=0 dsiz>0 且 esize>0
14 至少发生一次 把较低的销售额排在后面
18 至少发生一次  并非所有部门的销售额相同
22   最大销售额的的部门能找到一名雇员  雇员表的中有一名员工不符合部门部门条件
24  符合条件的雇员薪水大于15000或者是管理者  某符合条件的雇员不是管理管理且薪水低于15000
32  符合条件的部门没有雇员  符合条件的部门至少有一名雇员

1.2 测试用例设计

白盒测试角度的条件覆盖 : 

测试用例

 输入

 预期输出

 分析

1 dsize=esize=0 ERRCODE = 1  

dsize=esize=3

EMPTAB

JONES

 E

 D42

21000

SMITH  E  D32 14000
LORIN  M  D42 10000

DEPTTAB

D42

10000

D42 8000
D95 10000
ERRCODE = 2

分析 : 用例1和用例2 , 覆盖逻辑判断中的所有情况,做到了条件覆盖,但是还有部分代码没有执行,没有加薪资,没有出现 ERRCODE =0的返回结果,需要出现多重条件覆盖的,

dsize=0 esize >0 

ERRCODE = 1  
4 esize =0 dsize >0  ERRCODE = 1  
5

dsize=esize=3

EMPTAB

JONES

 E

 D42

21000

SMITH  E  D32 14000
LORIN  M  D42 10000

DEPTTAB

D42

10000

D42 8000
D95 9000
ERRCODE = 0

分析 :白盒测试满足了条件覆盖,但是还是有些情况没有覆盖到,多个销售额第一的部门,而且每个部门都有人,

黑盒测试的边界输入:

  1. esize为1,0,65535(最大指)
  2. dsize为1,0,65535(最大值)
  3. 某销售额最高的部门有1名雇员,没有雇员,有65535名雇员
  4. 销售额最高的部门有1个,多个
  5. 符合条件的雇员为管理人员,薪水<15000和≥15000
  6. 符合条件的雇员不是管理人员的薪水<15000和≥15000

输出边界 

      ERRCODE = 0, 1, 2 

筛选 : 将不切实际的去处掉(危险动作,但是部门不太可能有6万多个,所以去处)

输入 : 

  1. esize为1,0
  2. dsize为1,0,
  3. 某销售额最高的部门有1名雇员,没有雇员,2-3名
  4. 销售额最高的部门有1个,2-3个
  5. 符合条件的雇员为管理人员,薪水<15000和≥15000
  6. 符合条件的雇员不是管理人员的薪水<15000和≥15000

对比上面表格设计的测试用例,没有覆盖的情况做添加 ;

增量测试和非增量测试 

软件测试先独立的测试每个模块,然后将这些模块组装成完整的程序再测测试—非增量测试

先将下一步要测试的模块组装到测试完成的模块集合中,然后再进行测试 - 增量测试

增量测试的两种模式  : 自顶向下,自底向上

结论:

  1. 增量测试比非增量测试,工作量要少
  2. 增量测试可以较早的发现模块中接口不匹配、不正确假设或变成错误
  3. 增量测试,调试更加容易一下
  4. 增量测试会将测试进行的更加彻底,底层模块反复测试
  5. 所以相对来说增量测试会好一些。

自顶向下测试和自底向上测试

各有优势,一个优势就是另个劣势,一个劣势就是另个优势

多数: 自底向上,可靠性强 ; 方便定位 ;

猜你喜欢

转载自blog.csdn.net/LoveG_G/article/details/114121901