一、实验原理
1、黑盒测试
黑盒测试是一种软件测试方法,测试者并不需要知道被测试的软件的内部结构或代码,而是仅仅通过输入预设的数据和观察输出结果来评估软件的正确性和质量。
在黑盒测试中,测试者会根据软件的需求或规格说明书设计测试用例,以尽可能地覆盖软件的各个功能和边界条件,以确保软件能够按照需求和预期的方式运行。测试者通常会使用各种技术和工具来辅助测试,比如等价类划分、边界值分析、决策表等。
2、决策表划分方法
决策表划分方法是黑盒测试中常用的一种测试设计技术,它能够帮助测试者有效地设计测试用例,覆盖软件的各种可能的输入和输出情况。决策表是一种表示条件和动作之间关系的表格,其中条件和动作都是用布尔逻辑表达式描述的。
决策表划分方法的基本思路是将决策表按照条件的组合情况分成若干个等价类,每个等价类都包含一组具有相同条件组合情况的测试用例。常见的决策表划分方法包括以下几种:
- 等价类划分法:将所有可能的输入值划分为若干个等价类,每个等价类都具有相同的功能和行为。然后,从每个等价类中选择一个典型的输入值作为测试用例,以覆盖该等价类中的所有情况。
- 边界值分析法:在等价类划分的基础上,对每个等价类的边界值分别进行测试。因为边界值通常是比较容易出现错误的地方,所以边界值分析法能够有效地发现潜在的缺陷。
- 因果图分析法:通过绘制因果图来分析条件之间的关系,从而确定测试用例,帮助测试者更加清晰地理解软件的功能和行为,减少测试用例的数量,提高测试效率。
- 判定表划分法:将判定表按照条件的组合情况分解成若干个等价类,每个等价类都包含一组具有相同条件组合情况的测试用例。然后,从每个等价类中选择一个典型的输入值作为测试用例,以覆盖该等价类中的所有情况。
实际情况中测试者需要根据具体的测试需求和软件特点选择合适的决策表划分方法以进行测试用例设计。
二、实验步骤
1、参照testtrangle.java示例程序,实现程序功能;
2、设计针对有效等价类的简化判定表。判定表中一组条件加上对应的动作称为一条规则。可以把两条或多条具有相同动作、而其条件项之间存在着相似性的规则合并判定表;
3、设计判断表并化简;
4、编写测试用例;
5、执行测试用例,并将执行结果记录在测试用例表中;
6、测试执行结果统计对比测试用例表中各测试用例的“预期执行结果”和“实际执行结果”。
三、详细设计
1、Triangle测试程序
public String triangle() {
if (a <= 0 || b <= 0 || c <= 0) {
return "not a triangle";
} else {
int max = a;
int min = b + c;
if (b > max) {
max = b;
min = a + c;
}
if (c > max) {
max = c;
min = a + b;
}
if (min <= max) {
return "not a triangle";
}
if (a == b || b == c || a == c) {
if (a == b && b == c) {
return "equilateral";
} else {
return "isosceles";
}
} else {
return "scalene";
}
}
}
2、测试数据集设计
为了便于按照不同方式测试各种情况的数据,根据程序接收的参数设计数据集格式如下:
数据集的数据结构是一个二维数组,每一行表示一个测试用例,每个用例包括四个特征:边a、边b,边c和类型。其中,边长是数值型特征,类型是分类特征。具体来说,这个数据集中每个测试用例包含四个元素,可以表示为:
{edge,edge,edge,type}
其中edge是int类型,类型是String类型,表示三角形的类型,可能为以下四种之一:" equilateral"、" isosceles"、" scalene"和" not a triangle"。
3、判定表设计
判定表一般由条件桩、动作桩,条件项和动作项组成,条件加上对应的动作称为规则:
(1)条件项分析
对三角形的测试需要考虑以下情况:
- 三条边是否能构成三角形;
- 不同边之间的长度关系;
用C来表示条件项,则具体设计的条件项为:
- a > 0
- b > 0
- c > 0
- a + b > c
- a + c > b
- b + c > a
- a = b
- a = c
- b = c
合并C1,C2,C3,形成新的条件项C123 = C1 & C2 & C3;
合并C4,C5,C6,形成新的条件项C456 = C4 & C5 & C6;
(2)动作项分析
用E来表示动作项,根据三角形可能存在的情况,设计具体的动作项为:
- equilateral
- isosceles
- scalene
- not a triangle
(3)判定表设计
序号 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | … | 16 | 17 | 18 | 19 | … | 24 | |
条 件 | C123 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | … | 1 | 0 | 0 | 0 | … | 0 |
C456 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | … | 0 | 1 | 1 | 1 | … | 1 | |
C7 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | … | 0 | 1 | 1 | 1 | … | 0 | |
C8 | 1 | 1 | 0 | 0 | 1 | 1 | 0 | 0 | 1 | 1 | 0 | … | 0 | 1 | 1 | 0 | … | 0 | |
C9 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | … | 0 | 1 | 0 | 1 | … | 0 | |
动 作 | E1 | 1 | 1 | 1 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | … | 0 | 0 | 0 | 0 | … | 0 |
E2 | 0 | 0 | 0 | 1 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | … | 0 | 0 | 0 | 0 | … | 0 | |
E3 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | … | 0 | 0 | 0 | 0 | … | 0 | |
E4 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | … | 1 | 1 | 1 | 1 | … | 1 |
(4)判定表化简
序号 | 01-02 | 03 | 04 | 05 | 06 | 07 | 08 | 09-16 | 17-24 | |
条 件 | C123 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 |
C456 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | |
C7 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | — | — | |
C8 | 1 | 0 | 0 | 1 | 1 | 0 | 0 | — | — | |
C9 | — | 1 | 0 | 1 | 0 | 1 | 0 | — | — | |
动 作 | E1 | 1 | 1 | 0 | 1 | 0 | 0 | 0 | 0 | 0 |
E2 | 0 | 0 | 1 | 0 | 1 | 1 | 0 | 0 | 0 | |
E3 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | |
E4 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 |
(5)测试用例设计
根据化简后的判定表,结合实验要求用尽可能少的测试用例检测出尽可能多的软件缺陷,设计测试用例如下:
序号 | 判定表规则序号 | 测试用例→{a, b, c} | 预期执行结果 |
1 | 01-02, 03, 05 | {5, 5, 5} | equilateral |
2 | 04 | {8, 8, 6} | isosceles |
3 | 06 | {6, 9, 6} | isosceles |
4 | 07 | {9, 6, 6} | isosceles |
5 | 08 | {3, 4, 5} | scalene |
6 | 09-16 | {5, 5, 10} | not a triangle |
7 | 17-24 | {0, -1, 2} | not a triangle |
4、样例测试
首先按照Fixture方法编写测试方法执行前后需要进行的操作,代码如下:
@BeforeEach
public void setUp(int a, int b, int c) {
triangle = new Triangle(a, b, c);
}
@AfterEach
public void tearDown() {
triangle = null;
}
public boolean verify(String expected, String actual) {
return Objects.equals(expected, actual);
}
public String record(int a, int b, int c, String expected, String actual, boolean testResult) {
if (testResult) {
return String.format("Pass. a:%d, b:%d, c:%d, result:%s", a, b, c, actual);
} else {
return String.format("Fail. a:%d, b:%d, c:%d, Excepted:%s, Actual:%s", a, b, c, expected, actual);
}
}
public void testTriangle(int a, int b, int c, String res) {
setUp(a, b, c);
String actual = triangle.triangle();
boolean testResult = verify(res, actual);
System.out.println(record(a, b, c, res, actual, testResult));
tearDown();
}
四、实验结果与分析
1、实验结果
2、实验分析
项目 | 统计数据 |
测试用例总数 | 7 |
测试用例执行总数 | 7 |
测试用例执行率 | 100% |
测试用例通过总数 | 7 |
测试用例通过率 | 100% |
测试用例未通过总数 | 0 |
测试用例未通过率 | 0% |
从表中得出所有测试样例全部通过,说明Triangle测试程序设计完善,通过测试。