软件测试学习——黑盒测试实验报告

软件测试课程作业三

实验内容

  • 编写一个实现两数相除的函数,并基于此,采用划分法和边界值法,设计相应的测试用例。请注意:程序的逻辑,以及测试用例和套件设计的合理性。
  • 另外测试用例用表哥形式(简单形式),即用一个表,列出针对同一段代码的所有测试用例,通常要标明一个测试用例的编号、既定输入和预期输出(即测试所涉及的人机交互流程),以及相关注意事项。

实验过程

两数相除的函数

采用同作业二类似的程序框架,由于在黑盒测试中着重试错,对于非数值不合法输入的编写同样重要。代码如下

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
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
/*
** 程序名:testDevide
** 程序功能:从input输入文件中逐行输入两个值,第一个值做被除数,第二个值做除数,
** 在输入合法的情况下(范围-100~100)打印运算成功并输出商值。
** 否则打印错误信息
** 作者:Edwardzcn
*/
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> pii;
typedef pair<string, string> pss;
#define rep(i, a, n) for (int i = a; i < n; ++i)
#define per(i, a, n) for (int i = n - 1; i >= a; --i)

#define DEBUG_INPUT DEBUG_INPUT
#define LOW_BOUND -100.0
#define UP_BOUND 100.0
#define EPS 1e-10

/*
** 函数名:isNum
** 函数功能:用来检测是否为合法输入数
** 参数名称与类型:
** string s
** 返回值:
** bool
*/
bool isNum(string s)
{
bool flag = false;
if (s == "")
return false;
rep(i, 0, s.size())
{
if (i == 0 && s[i] == '-')
continue;
if (s[i] == '.')
{
if (!flag)
flag = true;
else
return false;
}
else if (s[i] < '0' || s[i] > '9')
return false;
}
return true;
}

/*
** 函数名:getDevide
** 函数功能:根据两输入值获取商值
** 参数名称与类型:
** double a
** double b
** 返回值类型:
** double
*/
double getDevide(double a, double b)
{
return a / b;
}

/*
** 函数名:main
** 函数功能:主函数,入口
** 参数名称与类型:
** int argc
** char* argv[]
** 返回值类型:
** int
*/
int main(int argc, char *argv[])
{
cout << ("======= Start Program: testLeapYear ==========\n");

#ifdef DEBUG_INPUT
freopen("input", "r", stdin);
// freopen("output", "w", stdout);
#endif // DEBUG_INPUT
string a, b;
int parseNum;
while (cin >> a >> b)
{
// cout << "# " << a << " " << b << endl;
// 调用
bool a_type = isNum(a);
bool b_type = isNum(b);
double a_double, b_double;
int flag = true;
// 判断非数字的情况
if (!a_type)
{
flag = false;
cout << "Error: a=" << a << " is not a num." << endl;
}
if (!b_type)
{
flag = false;
cout << "Error: b=" << b << " is not a num." << endl;
}
if (!flag)
{
cout << "Try Again." << endl;
continue;
}
stringstream ss;
// ss.clear();
// ss << a;
// ss >> a_double;
// ss.clear();a.size()
// ss << b;
// ss >> b_double;
a_double = stod(a, string::size_type());
b_double = stod(b, string::size_type());
// cout << "# " << a_double << " " << b_double << endl;
// 判断超出数字限制
if (a_double < LOW_BOUND + EPS || a_double > UP_BOUND - EPS)
{
flag = false;
cout << "Error a=" << a_double << " out of bound." << endl;
}
if (b_double < LOW_BOUND + EPS || b_double > UP_BOUND - EPS)
{
flag = false;
cout << "Error b=" << b_double << " out of bound." << endl;
}
// 对0的判断
if (abs(b_double) < EPS)
{
flag = false;
cout << "Error b=" << 0 << " undevisable." << endl;
}
if (!flag)
{
cout << "Try Again." << endl;
continue;
}
// 进行运算
double ans = getDevide(a_double, b_double);
cout << "Correct! The value is " << ans << " ." << endl;
}

cout << "==============================================" << endl;
return 0;
}

等价类划分法检测

  • 等价类划分

    主要采用数值类型划分,和区间划分,这里还需要考虑除数特殊值情况的划分。(由于有效/无效对于同一测例是互斥的),这里我们保持行的原子性,所以将有效无效合并为一列。

  • 等价类划分表格

    划分原则 情况 有效/无效等价类 编号
    数值类型 a 为数值,b 为数值 1
    数值类型 a,b 至少有一个为非数值 2
    区间 -100< a <100, -100< b <100 3
    区间 a,b 至少有一个不在要求区间内 4
    特殊值 b 不为 0 5
    特殊值 b 为 0 6
  • 测例表格

    测例编号 输入 预计输出 实际输出 划分覆盖
    1 a=-51 b=0.00005 -1020000 -1.02e+06 覆盖 1,3,5
    2 a=100 b=0 2 Error 2 Error 覆盖 1,4,6
    3 a=1823kja1 b=34 1 Error 1 Error 覆盖 2
  • 程序测试

    Lab3_1
    Lab3_1

    实验结果符合预期,填入上面测例表格的实际输出中。

边界值法检测

  • 边界值

    主要考虑输入符合数值规范下,是否控制在限定区间内。在本题程序中,限定

    • 被除数: \((-100,100)\)
    • 除数: \((-100,0) \cup (0,100)\)

    除数为 0 的检测在上面等价类划分中做过了,这里就不再重复测试了,主要针对-100,100 上下边界进行测试中,在程序中我定义了宏名LOW_BOUNDUP_BOUND方便表示。

  • 边界值测例表格

    测例编号 输入 预计输出 实际输出
    1 a=-100 b=-100 2 Error 2 Error
    2 a=-100 b=100 2 Error 2 Error
    3 a=100 b=-100 2 Error 2 Error
    4 a=100 b=100 2 Error 2 Error
  • 健壮性边界值测例补充

    测例编号 输入 预计输出 实际输出
    5 a=-102 b=-98 1 Error 1 Error
    5 a=105 b=106 2 Error 2 Error
  • 程序检测

    Lab3_2
    Lab3_2

    实验结果符合预期,填入上面测例表格的实际输出中。

实验结果

见上一节两种测试方法的程序检测截图。

实验总结

本次实验亲手编程体验了黑盒子测试的过程,深刻体会到其与白盒测试的不同,从功能性上和试错角度进行测试,而非从程序结构角度。在编写测例的过程中,我完全没有回过头看程序结构,这就很好的说明了“黑盒”的含义。