测试用例方法论
等价类划分法
适用场景
有数据输入的地方,就可以使用等价类划分法,例如:输入框
测试思想
从大量数据中划分范围(等价类),然后从每个范围中挑选代表数据,这些代表 数据要能反应这个范围内数据的测试结果
概念
有效等价类:对程序来说,有意义、合理的数据(正确的、有效的数据)
无效等价类:对程序来说,没有意义、不合理的数据(错误的、无效的数据)
举例
手机号输入框:只允许输入数字
无效等价类:汉字、表情、符号、空格
有效等价类:数字
边界值法
适用场景
有数据输入的地方,在实际工作中,一般和等价类划分一起使用
测试思想
边界值是编程时最容易出错的位置
概念
是有效等价类和无效等价类之间的分界点,叫边界值(最大值、最小值),还要测试次边界,也就是边界值两边的 数据
举例
密码输入框: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() {
assertEquals("输入不符合要求",testGraphics.buildGraphics(-1,5));
assertEquals("输入不符合要求",testGraphics.buildGraphics(5, -1));
assertEquals("输入不符合要求",testGraphics.buildGraphics(0, 5));
assertEquals("输入不符合要求",testGraphics.buildGraphics(5, 0));
assertEquals("可以构建圆形或正方形",testGraphics.buildGraphics(5, 5));
assertEquals("可以构建椭圆",testGraphics.buildGraphics(10,7));
assertEquals("可以构建长方形",testGraphics.buildGraphics(10,8));
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() {
assertEquals("可以构建长方形",testGraphics.buildGraphics(3, 4));
assertEquals("可以构建圆形或正方形",testGraphics.buildGraphics(5, 5));
assertEquals("可以构建椭圆",testGraphics.buildGraphics(8, 11));
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() {
assertEquals("输入不符合要求",testGraphics.buildGraphics(-1,5));
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() {
assertEquals("可以构建圆形或正方形",testGraphics.buildGraphics(5, 5));
assertEquals("可以构建椭圆",testGraphics.buildGraphics(10,7));
assertEquals("可以构建长方形",testGraphics.buildGraphics(10,8));
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() {
assertEquals("输入不符合要求",testGraphics.buildGraphics(-1,5));
assertEquals("输入不符合要求",testGraphics.buildGraphics(5, -1));
assertEquals("输入不符合要求",testGraphics.buildGraphics(0, 5));
assertEquals("输入不符合要求",testGraphics.buildGraphics(5, 0));
assertEquals("可以构建圆形或正方形",testGraphics.buildGraphics(5, 5));
assertEquals("可以构建椭圆",testGraphics.buildGraphics(10,7));
assertEquals("可以构建长方形",testGraphics.buildGraphics(10,8));
assertEquals("可以构建矩形",testGraphics.buildGraphics(10,1)); }
@Test public void testEquivalencePartitioning() {
assertEquals("可以构建长方形",testGraphics.buildGraphics(3, 4));
assertEquals("可以构建圆形或正方形",testGraphics.buildGraphics(5, 5));
assertEquals("可以构建椭圆",testGraphics.buildGraphics(8, 11));
assertEquals("可以构建矩形",testGraphics.buildGraphics(15, 4)); }
@Test public void testErrorInference() {
assertEquals("输入不符合要求",testGraphics.buildGraphics(-1,5));
assertEquals("输入不符合要求",testGraphics.buildGraphics(5, -1)); }
@Test public void testScenario() {
assertEquals("可以构建圆形或正方形",testGraphics.buildGraphics(5, 5));
assertEquals("可以构建椭圆",testGraphics.buildGraphics(10,7));
assertEquals("可以构建长方形",testGraphics.buildGraphics(10,8));
assertEquals("可以构建矩形",testGraphics.buildGraphics(10,1)); } }
|
在上面的测试类中,我们通过assertEquals
方法来判断实际输出和期望输出是否一致。每个测试方法对应一个测试用例,覆盖了不同的情况。