测试用例方法论

等价类划分法

适用场景

有数据输入的地方,就可以使用等价类划分法,例如:输入框

测试思想

从大量数据中划分范围(等价类),然后从每个范围中挑选代表数据,这些代表 数据要能反应这个范围内数据的测试结果

概念

有效等价类:对程序来说,有意义、合理的数据(正确的、有效的数据)

无效等价类:对程序来说,没有意义、不合理的数据(错误的、无效的数据)

举例

手机号输入框:只允许输入数字

无效等价类:汉字、表情、符号、空格

有效等价类:数字

边界值法

适用场景

有数据输入的地方,在实际工作中,一般和等价类划分一起使用

测试思想

边界值是编程时最容易出错的位置

概念

是有效等价类和无效等价类之间的分界点,叫边界值(最大值、最小值),还要测试次边界,也就是边界值两边的 数据

举例

密码输入框:8-20位字符(只允许输入字母、英文字符、数字)

边界值:8位字符、20位字符

次边界值:7位字符、9位字符、19位字符、21位字符

因果图/判定表法

适用场景

在一个界面有多个控件,如果控件之间存在组合关系或者限制关系,不同控件组合会产生不同的输出结果,为了弄清楚不同的输入组合会产生怎么样的输出结果,可以使用因果图或判定表

概念

因:输入条件

果:输出结果

就是通过画图的方式表达输入条件和输出结果之间的关系

步骤

1、找出所有的输入条件

2、找出所有的输出结果

3、分析,列出条件之间所有的组合和限制条件

4、确定每组输入条件的组合会产生怎么样的输出结果,画因果图,填写判定表

5、编写测试用例,每一列代表一种组合

特点

1、输入条件的排序顺序无关紧要

2、输出结果的排序顺序无关紧要

3、先测哪种组合后测哪种组合无关紧要

4、每种组合都是独立的

判定表名词术语

条件桩:问题的所有条件

动作桩:问题的所有输出

条件项:针对条件桩的取值

动作项:条件项的各种取值情况下的输出结果

正交排序法

适用场景

在一个界面中有多个控件,每个控件有多个取值,要考虑不同控件不同取值之间的组合 ,且组合数量较大的话,我们就可以使用正交排列法。

思想

使用最少的抽样数据达到最广的,覆盖率最高的统计结果。

正交表共识

l:line 行

n:表示正交表有几行,需要测试的组合的个数

n值是固定的,一旦正交表确定n值就是固定的,不需要测试人员自己计算。

m:表示正交表中允许出现的最大值

根据每个控件的取值个数来确定m值

k:表示正交表有几列

根据组合的控件个数进行确定,选择合适的正交表

方法总结:

a、 如果有多余的列,可以删除掉

b、 能映射的值先映射好(替换)

c、 把每一列多出的机会,尽量均匀分配给该列的各个取值

d、 要检查是否有完全一样的组合,如果有要适当处理(建议修改,也可以删除)

e、 选择正交表时正好能应用正交表示首选,如果不合适呢么选择最接近的。

实际工作中,属性设置测试,兼容性测试常用正交排列法,而且兼容性测试可以不编写测试用例,直接用正交排列表测试各种兼容组合

测试大纲法

适用场景:

软件中有多个窗口,窗口中有若干操作(功能点),为了理清窗口之间的关系(结果),可以使用测试大纲法。

场景法

适用场景:

业务比较复杂的软件系统都适合使用场景法,场景法是基于软件业务的测试方法,测试人员把自己当成最终用户,尽可能真实的模拟用户在使用此软件的操作情形:

重点模拟两类操作:

用户正确操作的业务过程—验证软件的业务功能是否正确实现

模拟用户错误操作的情形—验证软件的异常处理能力(健壮性)

测试思路:

场景法是模拟用户操作软件时的各种情景,主要用于测试软件的业务逻辑和流程。当拿到一个测试任务时,我们并不先关注某个文本框的等价类等是否满足要求,而是先关注它的主要功能和业务流程是否正确实现,这就需要场景法来完成测试。当业务流程测试没有问题,也就是软件的主要功能没有问题时,我们再去关注控件的等价类、边界值等细节测试。

场景划分:

1)基本流(有效流、正确流)

模拟用户正确的业务操作流程就是基本流

2)备选流(无效流、错误流)

模拟用户错误的操作流程就是备选流

注:根据不同的场景去编写测试用例,一个场景可以是一条测试用例,也可以是多条测试用例。

错误推断法

应用场景

测试人员使用经验或直觉去发现程序错误,当你的测试用例都用完了的时候,你可以凭借自己的经验去判断软件有哪些地方可能有问题。

编写测试用例

任务要求

任意输入2个正整数值分别存入x、y中,据此完成下述分析:若x≤0或y≤0,则提示:“输入不符合要求”;若2值相同,则提示“可以构建圆形或正方形”;若2<|x-y|≤5,则提示“可以构建椭圆”;若|x-y|>5,则提示“可以构建矩形”;若0<|x-y|≤2,提示“可以构建长方形”。编写程序代码,使用JUnit框架编写测试类对编写的程序代码进行测试,测试类中设计最少的测试数据满足语句覆盖测试,每条测试数据需要在测试类中编写一个测试方法。使用assertEquals判断输入数据测试方法期望结果值和实际返回值是否一致。

编写程序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class Graphics {

public String buildGraphics(int x, int y) {
if (x <= 0 || y <= 0) {
return "输入不符合要求";
} else if (x == y) {
return "可以构建圆形或正方形";
} else if (Math.abs(x - y) > 5) {
return "可以构建矩形";
} else if (0 < Math.abs(x - y) && Math.abs(x - y) <= 2) {
return "可以构建长方形";
} else {
return "可以构建椭圆";
}
}

}

分析

边界值法

分析:

  • 输入值为x=-1, y=5,期望输出为”输入不符合要求”
  • 输入值为x=5, y=-1,期望输出为”输入不符合要求”
  • 输入值为x=0, y=5,期望输出为”输入不符合要求”
  • 输入值为x=5, y=0,期望输出为”输入不符合要求”
  • 输入值为x=5, y=5,期望输出为”可以构建圆形或正方形”
  • 输入值为x=10, y=7,期望输出为”可以构建椭圆”
  • 输入值为x=10, y=8,期望输出为”可以构建长方形”
  • 输入值为x=10, y=1,期望输出为”可以构建矩形”

实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public class testGraphics {

Graphics testGraphics = new Graphics();
@Test
public void testInvalid() {
// 输入值为x=-1, y=5,期望输出为"输入不符合要求"
assertEquals("输入不符合要求",testGraphics.buildGraphics(-1,5));
// 输入值为x=5, y=-1,期望输出为"输入不符合要求"
assertEquals("输入不符合要求",testGraphics.buildGraphics(5, -1));
// 输入值为x=0, y=5,期望输出为"输入不符合要求"
assertEquals("输入不符合要求",testGraphics.buildGraphics(0, 5));
// 输入值为x=5, y=0,期望输出为"输入不符合要求"
assertEquals("输入不符合要求",testGraphics.buildGraphics(5, 0));
// 输入值为x=5, y=5,期望输出为"可以构建圆形或正方形"
assertEquals("可以构建圆形或正方形",testGraphics.buildGraphics(5, 5));
// 输入值为x=10, y=7,期望输出为"可以构建椭圆"
assertEquals("可以构建椭圆",testGraphics.buildGraphics(10,7));
// 输入值为x=10, y=8,期望输出为"可以构建长方形"
assertEquals("可以构建长方形",testGraphics.buildGraphics(10,8));
// 输入值为x=10, y=15,期望输出为"可以构建矩形"
assertEquals("可以构建矩形",testGraphics.buildGraphics(10,1));
}

}

等价划分法

分析:

  • 输入值为x=3, y=4,期望输出为”可以构建长方形”
  • 输入值为x=5, y=5,期望输出为”可以构建圆形或正方形”
  • 输入值为x=8, y=11,期望输出为”可以构建椭圆”
  • 输入值为x=15, y=4,期望输出为”可以构建矩形”

实现:

1
2
3
4
5
6
7
8
9
10
11
12
	@Test
public void testEquivalencePartitioning() {
// 都是有效等效类
// 输入值为x=3, y=4,期望输出为"可以构建长方形"
assertEquals("可以构建长方形",testGraphics.buildGraphics(3, 4));
// 输入值为x=5, y=5,期望输出为"可以构建圆形或正方形"
assertEquals("可以构建圆形或正方形",testGraphics.buildGraphics(5, 5));
// 输入值为x=8, y=11,期望输出为"可以构建椭圆"
assertEquals("可以构建椭圆",testGraphics.buildGraphics(8, 11));
// 输入值为x=15, y=20,期望输出为"可以构建矩形"
assertEquals("可以构建矩形",testGraphics.buildGraphics(15, 4));
}

错误推断法

分析:

  • 输入值为x=”abc”, y=5,期望输出为”输入不符合要求”
  • 输入值为x=5, y=”def”,期望输出为”输入不符合要求”
  • 输入值为x=-5, y=5,期望输出为”输入不符合要求”
  • 输入值为x=5, y=-5,期望输出为”输入不符合要求”

实现:

1
2
3
4
5
6
7
8
9
	@Test
public void testErrorInference() {
// 输入值为x="abc", y=5,期望输出为"输入不符合要求"
// assertEquals("输入不符合要求",testGraphics.buildGraphics(abc, 5));
// 输入值为x=-1, y=5,期望输出为"输入不符合要求"
assertEquals("输入不符合要求",testGraphics.buildGraphics(-1,5));
// 输入值为x=5, y=-1,期望输出为"输入不符合要求"
assertEquals("输入不符合要求",testGraphics.buildGraphics(5, -1));
}

场景测试法

分析:

  • 输入值为x=5, y=5,期望输出为”可以构建圆形或正方形”
  • 输入值为x=10, y=7,期望输出为”可以构建椭圆”
  • 输入值为x=10, y=2,期望输出为”可以构建长方形”
  • 输入值为x=10, y=1,期望输出为”可以构建矩形”

实现:

1
2
3
4
5
6
7
8
9
10
11
	@Test
public void testScenario() {
// 输入值为x=5, y=5,期望输出为"可以构建圆形或正方形"
assertEquals("可以构建圆形或正方形",testGraphics.buildGraphics(5, 5));
// 输入值为x=10, y=7,期望输出为"可以构建椭圆"
assertEquals("可以构建椭圆",testGraphics.buildGraphics(10,7));
// 输入值为x=10, y=8,期望输出为"可以构建长方形"
assertEquals("可以构建长方形",testGraphics.buildGraphics(10,8));
// 输入值为x=10, y=15,期望输出为"可以构建矩形"
assertEquals("可以构建矩形",testGraphics.buildGraphics(10,1));
}

总代码:

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
72
73
74
75
76
77
78
79
80
public class Graphics {

public String buildGraphics(int x, int y) {
if (x <= 0 || y <= 0) {
return "输入不符合要求";
} else if (x == y) {
return "可以构建圆形或正方形";
} else if (Math.abs(x - y) > 5) {
return "可以构建矩形";
} else if (0 < Math.abs(x - y) && Math.abs(x - y) <= 2) {
return "可以构建长方形";
} else {
return "可以构建椭圆";
}
}

}


public class testGraphics {

Graphics testGraphics = new Graphics();
// 边界值法
@Test
public void testBoundaryValue() {
// 输入值为x=-1, y=5,期望输出为"输入不符合要求"
assertEquals("输入不符合要求",testGraphics.buildGraphics(-1,5));
// 输入值为x=5, y=-1,期望输出为"输入不符合要求"
assertEquals("输入不符合要求",testGraphics.buildGraphics(5, -1));
// 输入值为x=0, y=5,期望输出为"输入不符合要求"
assertEquals("输入不符合要求",testGraphics.buildGraphics(0, 5));
// 输入值为x=5, y=0,期望输出为"输入不符合要求"
assertEquals("输入不符合要求",testGraphics.buildGraphics(5, 0));
// 输入值为x=5, y=5,期望输出为"可以构建圆形或正方形"
assertEquals("可以构建圆形或正方形",testGraphics.buildGraphics(5, 5));
// 输入值为x=10, y=7,期望输出为"可以构建椭圆"
assertEquals("可以构建椭圆",testGraphics.buildGraphics(10,7));
// 输入值为x=10, y=8,期望输出为"可以构建长方形"
assertEquals("可以构建长方形",testGraphics.buildGraphics(10,8));
// 输入值为x=10, y=15,期望输出为"可以构建矩形"
assertEquals("可以构建矩形",testGraphics.buildGraphics(10,1));
}

// 等价类划分法
@Test
public void testEquivalencePartitioning() {
// 输入值为x=3, y=4,期望输出为"可以构建长方形"
assertEquals("可以构建长方形",testGraphics.buildGraphics(3, 4));
// 输入值为x=5, y=5,期望输出为"可以构建圆形或正方形"
assertEquals("可以构建圆形或正方形",testGraphics.buildGraphics(5, 5));
// 输入值为x=8, y=11,期望输出为"可以构建椭圆"
assertEquals("可以构建椭圆",testGraphics.buildGraphics(8, 11));
// 输入值为x=15, y=20,期望输出为"可以构建矩形"
assertEquals("可以构建矩形",testGraphics.buildGraphics(15, 4));
}

// 错误推断法
@Test
public void testErrorInference() {
// 输入值为x="abc", y=5,期望输出为"输入不符合要求"
// assertEquals("输入不符合要求",testGraphics.buildGraphics(abc, 5));
// 输入值为x=-1, y=5,期望输出为"输入不符合要求"
assertEquals("输入不符合要求",testGraphics.buildGraphics(-1,5));
// 输入值为x=5, y=-1,期望输出为"输入不符合要求"
assertEquals("输入不符合要求",testGraphics.buildGraphics(5, -1));
}

// 场景测试法
@Test
public void testScenario() {
// 输入值为x=5, y=5,期望输出为"可以构建圆形或正方形"
assertEquals("可以构建圆形或正方形",testGraphics.buildGraphics(5, 5));
// 输入值为x=10, y=7,期望输出为"可以构建椭圆"
assertEquals("可以构建椭圆",testGraphics.buildGraphics(10,7));
// 输入值为x=10, y=8,期望输出为"可以构建长方形"
assertEquals("可以构建长方形",testGraphics.buildGraphics(10,8));
// 输入值为x=10, y=15,期望输出为"可以构建矩形"
assertEquals("可以构建矩形",testGraphics.buildGraphics(10,1));
}
}

在上面的测试类中,我们通过assertEquals方法来判断实际输出和期望输出是否一致。每个测试方法对应一个测试用例,覆盖了不同的情况。