资源描述
实验报告书
课程名称:软件测试
实验题目:黑盒测试报告
专 业:教育技术学
班 级:教技142
学生姓名:安卓
指导老师:郭小雪
所属学期:2017-2018学年第二学期
一、引言
1.1 目的
测试报告为三角形问题和找零钱最佳组合问题项目的黑盒测试报告,目的在于总结测试阶段的测试以及分析测试结果。
1.2实验环境
在Windows 2000(SP2) 或Windows XP 操作系统上,使用C++语言,VC6.0工具作为开发环境(IDE)
1.3实验要求
1. 根据给出的程序分别使用等价类划分法、边界值分析法、判定表方法、因果图法、正交试验法、功能图法、错误推测法来设计相应的测试用例。
2. 输入数据进行测试,填写测试用例。
二、 实验原理
黑盒测试原理:已知产品的功能设计规格,可以进行测试证明每个实现了的功能是否符合要求。软件的黑盒测试意味着测试要在软件的接口处进行。这种方法是把测试对象看作一个黑盒子,测试人员完全不考虑程序内部的逻辑结构和内部特性,只依据程序的需求规格说明书,检查程序的功能是否符合它的功能说明。因此黑盒测试又叫功能测试。
从理论上讲,黑盒测试只有采用穷举输入测试,把所有可能的输入都作为测试情况考虑,才能查出程序中所有的错误。实际上测试情况有无穷多个,人们不仅要测试所有合法的输入,而且还要对那些不合法但可能的输入进行测试。这样看来,完全测试是不可能的,所以我们要进行有针对性的测试,通过制定测试案例指导测试的实施,保证软件测试有组织、按步骤,以及有计划地进行。黑盒测试行为必须能够加以量化,才能真正保证软件质量,而测试用例就是将测试行为具体量化的方法之一。具体的黑盒测试用例设计方法包括等价类划分法、边界值分析法、错误推测法、因果图法、判定表驱动法、正交试验设计法、功能图法等。
等价类划分的办法是把程序的输入域划分成若干部分(子集),然后从每个部分中选取少数代表性数据作为测试用例。每一类的代表性数据在测试中的作用等价于这一类中的其他值。该方法是一种重要的,常用的黑盒测试用例设计方法。
1 划分等价类
划分等价类:等价类是指某个输入域的子集合。在该子集合中,各个输入数据对于揭露程序中的错误都是等效的,并合理地假定:测试某等价类的代表值就等于对这一类其它值的测试。因此,可以把全部输入数据合理划分为若干等价类,在每一个等价类中取一个数据作为测试的输入条件,就可以用少量代表性的测试数据。取得较好的测试结果。等价类划分可有两种不同的情况:有效等价类和无效等价类。
有效等价类:是指对于程序的规格说明来说是合理的,有意义的输入数据构成的集合。利用有效等价类可检验程序是否实现了规格说明中所规定的功能和性能。
无效等价类:与有效等价类的定义恰巧相反。
设计测试用例时,要同时考虑这两种等价类。因为,软件不仅要能接收合理的数据,也要能经受意外的考验。这样的测试才能确保软件具有更高的可靠性。
2 边界值分析
边界值分析是通过选择等价类边界的测试用例。边界值分析法不仅重视输入条件边界,而且也必须考虑输出域边界。它是对等价类划分方法的补充。
(1)边界值分析方法的考虑;长期的测试工作经验告诉我们,大量的错误是发生在输入或输出范围的边界上,而不是发生在输入输出范围的内部。因此针对各种边界情况设计测试用例,可以查出更多的错误。
使用边界值分析方法设计测试用例,首先应确定边界情况。通常输入和输出等价类的边界,就是应着重测试的边界情况。应当选取正好等于,刚刚大于或刚刚小于边界的值作为测试数据,而不是选取等价类中的典型值或任意值作为测试数据。
(2)基于边界值分析方法选择测试用例的原则:
1)如果输入条件规定了值的范围,则应取刚达到这个范围的边界的值,以及刚刚超越这个范围边界的值作为测试输入数据。
2)如果输入条件规定了值的个数,则用最大个数,最小个数,比最小个数少一,比最大个数多一的数作为测试数据。
3)根据规格说明的每个输出条件,使用前面的原则1)。
4)根据规格说明的每个输出条件,应用前面的原则2)。
5)如果程序的规格说明给出的输入域或输出域是有序集合,则应选取集合的第一个元素和最后一个元素作为测试用例。
6)如果程序中使用了一个内部数据结构,则应当选择这个内部数据结构的边界上的值作为测试用例。
7)分析规格说明,找出其它可能的边界条件。
3 错误推测法
错误推测法是基于经验和直觉推测程序中所有可能存在的各种错误,从而有针对性的设计测试用例的方法。
错误推测方法的基本思想:列举出程序中所有可能有的错误和容易发生错误的特殊情况,根据他们选择测试用例。例如, 在单元测试时曾列出的许多在模块中常见的错误。以前产品测试中曾经发现的错误等, 这些就是经验的总结。还有,输入数据和输出数据为0的情况。输入表格为空格或输入表格只有一行。这些都是容易发生错误的情况。可选择这些情况下的例子作为测试用例。
4 因果图法
前面介绍的等价类划分方法和边界值分析方法,都是着重考虑输入条件,但未考虑输入条件之间的联系,相互组合等。考虑输入条件之间的相互组合,可能会产生一些新的情况。但要检查输入条件的组合不是一件容易的事情,即使把所有输入条件划分成等价类,他们之间的组合情况也相当多。因此必须考虑采用一种适合于描述对于多种条件的组合,相应产生多个动作的形式来考虑设计测试用例。这就需要利用因果图(逻辑模型)。
因果图方法最终生成的就是判定表。它适合于检查程序输入条件的各种组合情况。
三、实验内容
3.1 三角形问题
1) 划分等价类
有效等价类:
输入3个正整数或正小数:
1、两数之和大于第三数,如A<B+C;B<C+A;C<A+B
2、两数之和不大于第三数
3、两数相等,如A=B或B=C或C=A
4、三数相等,如A=B=C
5、三数不相等,如A!=B,B!=C,C!=A
无效等价类:
1、 空
2、负整数
3、非数字
4、少于三个数
三角形测试用例类别
输入条件
有效等价类
无效等价类
是否是三角形
(A>0) (1)
(B>0) (2)
(C>0) (3)
(A+B>C) (4)
(B+C>A) (5)
(C+A>B) (6)
(A<=0) (7)
(B<=0) (8)
(C<=0) (9)
(A+B<=C) (10)
(B+C<=A) (11)
(C+A<=B) (12)
是否是等腰三角形
(A=B) (13)
(B=C) (14)
(C=A) (15)
(A!=B)and(B!=C)and(C!=A) (16)
是否是等腰直角三角形
(A=B)and(A2+B2=C2) (17)
(B=C)and(B2+C2=A2) (18)
(C=A)and(C2+A2=B2) (19)
(A!=B)and(B!=C)and(C!=A) (20)
是否是等边三角形
(A=B)and(B=C)and(C=A) (21)
(A!=B) (22)
(B!=C) (23)
(C!=A) (24)
三角形测试用例:用最少的测试用例覆盖所有的有效等价类,而无效等价类每个类型都要覆盖到
序号
输入[A,B,C]
覆盖等价类
输出
1
[3,4,5]
(1)(2)(3)(4)(5)(6)
是三角形
2
[1,2,3]
(10)
非三角形
3
[1,3,2]
(11)
非三角形
4
[3,1,2]
(12)
非三角形
5
[3,3,4]
(1)(2)(3)(4)(5)(6)(13)
等腰三角形
6
[3,4,4]
(1)(2)(3)(4)(5)(6)(14)
等腰三角形
7
[3,4,3]
(1)(2)(3)(4)(5)(6)(15)
等腰三角形
8
[3,4,5]
(1)(2)(3)(4)(5)(6)(16)(20)(22)(23)(24)
是三角形
9
[3,3,3]
(1)(2)(3)(4)(5)(6)(16)(21)
等边三角形
10
[3,4]
无效等价类
错误提示
三角形问题”的测试用例(边界值分析法)
测试用例说明
测试数据
期望结果
(1)a=0
0 3 4
输入无效
(2)b=0
3 0 4
(3)c=0
3 4 0
(4)a>0
3 4 5
这个三角形是三边不等的
(5)b>0
3 4 5
(6)c>0
3 4 5
(7)a+b=c
2 3 5
输入无效
(8)a+c=b
2 3 5
(9)b+c=a
2 3 5
(10)a+b<c
2 3 6
(11)a+c<b
2 3 6
(12)b+c<a
2 3 6
(13)|a-b|=c
5 3 2
(14)|a-c|=b
5 3 2
(15)|b-c|=a
5 3 2
(16)|a-b|>c
5 3 1
(17)|a-c|>b
5 3 1
(18)|b-c|>a
5 3 1
(19)a≠b≠c
3 4 5
这个三角形是三边不等的
(20)a=b≠c
4 4 5
这个三角形是等腰的
(21)a=c≠b
4 5 4
(22)b=c≠a
5 4 4
(23)a=b=c
4 4 4
这个三角形是等边的
测试源代码
三、 测试代码
等价值测试法
package cn.heihe.sjx.test;
import java.util.Scanner;
/**
* “三角形问题”的测试用例(等价类测试)
*
* @author Mario
*
*/
public class TestTriangle {
@SuppressWarnings("resource")
public static void main(String[] args) {
try {
int a, b, c;
System.out.println("开始黑盒测试");
Scanner in = new Scanner(System.in);
System.out.print("条件1.请输入第一个大于0且小于等于100的整数");
a = Integer.parseInt(in.nextLine());
if (a <= 0 || a > 100 || !String.valueOf(a).matches("[0-9]+")) {
throw new Exception();
}
System.out.print("条件2.请输入第二个大于0且小于等于100的整数");
b = Integer.parseInt(in.nextLine());
if (b <= 0 || b > 100 || !String.valueOf(b).matches("[0-9]+")) {
throw new Exception();
}
System.out.print("条件3.请输入第三个大于0且小于等于100的整数");
c = Integer.parseInt(in.nextLine());
if (c <= 0 || c > 100 || !String.valueOf(c).matches("[0-9]+")) {
throw new Exception();
}
if ((!(a + b <= c || a + c <= b || b + c <= a)) && (a >= 1 && a <= 100) && (b >= 1 && b <= 100)
&& (c >= 1 && c <= 100)) {
if (a == b && a == c) {
System.out.println(a + "," + b + "," + c + "可以组成一个等边三角形");
} else if (a == b || a == c || b == c) {
System.out.println(a + "," + b + "," + c + "可以组成一个等腰三角形");
} else if ((a * a + b * b == c * c && a == b) || (a * a + c * c == b * b && a == c)
|| (c * c + b * b == a * a && c == b)) {
System.out.println(a + "," + b + "," + c + "可以组成一个等腰直角三角形");
} else if ((a * a + b * b == c * c) || (a * a + c * c == b * b) || (c * c + b * b == a * a)) {
System.out.println(a + "," + b + "," + c + "可以组成一个直角三角形");
} else {
System.out.println(a + "," + b + "," + c + "可以组成一个一般三角形");
}
} else {
if (a < 1 || a > 100)
System.out.println("不满足条件1,不能构成三角形");
if (b < 1 || b > 100)
System.out.println("不满足条件2,不能构成三角形");
if (c < 1 || c > 100)
System.out.println("不满足条件3,不能构成三角形");
if (c < 1 || c > 100)
System.out.println("不满足条件3,不能构成三角形");
if (a >= b + c)
System.out.println("不满足a<b+c,不能构成三角形");
if (b >= a + c)
System.out.println("不满足b<a+c,不能构成三角形");
if (c >= a + b)
System.out.println("不满足c<a+b,不能构成三角形");
}
System.out.println("黑盒测试结束");
} catch (Exception e) {
System.out.println("不满足条件,不能构成三角形\n黑盒测试结束");
}
}
边界值测试法
package cn.heihe.sjx.test;
import java.util.Scanner;
/**
* “三角形问题”的测试用例(边界值测试)
*
* @author Mario
*/
public class TestTriangle2 {
@SuppressWarnings("resource")
public static void main(String[] args) {
try {
int a, b, c;
System.out.println("开始黑盒测试");
Scanner in = new Scanner(System.in);
System.out.print("条件1.请输入第一个大于0且小于等于100的整数");
a = Integer.parseInt(in.nextLine());
System.out.print("条件2.请输入第二个大于0且小于等于100的整数");
b = Integer.parseInt(in.nextLine());
System.out.print("条件3.请输入第三个大于0且小于等于100的整数");
c = Integer.parseInt(in.nextLine());
if (a < 1 || a > 100 || !String.valueOf(a).matches("[0-9]+")) {
throw new Exception();
}
if (b < 1 || b > 100 || !String.valueOf(b).matches("[0-9]+")) {
throw new Exception();
}
if (c < 1 || c > 100 || !String.valueOf(c).matches("[0-9]+")) {
throw new Exception();
}
if ((!(a + b <= c || a + c <= b || b + c <= a))) {
if (a != b && b != c && a != c) {
System.out.println("这个三角形是三边不等的");
} else if (a == b && b == c && a == c) {
System.out.println("这个三角形是等边的");
} else if (a == b || a == c || c == b) {
System.out.println("这个三角形是等腰的");
}
} else {
System.out.println("输入无效");
}
System.out.println("黑盒测试结束");
} catch (Exception e) {
System.out.println("输入无效\n黑盒测试结束");
}
}
}
3.2 找零钱最佳组合
一、分析输入的情形。
R
P
R>100
0<R<=100
R<=0
P>100
R<=P<=100
P<R
二、分析输出情形。
N50
N10
N5
N1
N50=1
N50=0
4>=N10>=1
N10=0
N5=1
N5=0
4>=N1>=1
N1=0
三、分析规格中每一决策点之情形,以RR1,RR2,RR3表示计算要找50,10,5元货币数时之剩余金额。
R>100 R<=0 P>100 P<R RR1>=50 RR2>=10 RR3>=5
四、由上述之输入/输出条件组合出可能的情形。(RR=P-R)
R>100
R<=0
0<R<=100,P>100
0<R<=100,P<R
0<R<=100,R<=P<=100,RR=50
0<R<=100,R<=P<=100,RR=49
0<R<=100,R<=P<=100,RR=10
0<R<=100,R<=P<=100,RR=9
0<R<=100,R<=P<=100,RR=5
0<R<=100,R<=P<=100,RR=4
0<R<=100,R<=P<=100,RR=1
0<R<=100,R<=P<=100,RR=0
五、为满足以上之各种情形,测试资料设计如下:
1.货品价格=101
2.货品价格=0
3.货品价格=-1
4.货品价格=100,付款金额=101
5.货品价格=100,付款金额=99
6.货品价格=50,付款金额=100
7.货品价格=51,付款金额=100
8.货品价格=90,付款金额=100
9.货品价格=91,付款金额=100
10.货品价格=95,付款金额=100
11.货品价格=96,付款金额=100
12.货品价格=99,付款金额=100
13.货品价格=100,付款金额=100
测试源代码
package com.xu.ceshi;
import java.util.Scanner;
public class Price {
public static void main(String[] args) {
System.out.println("请输入您购买的东西价格:");
Scanner scanner=new Scanner(System.in);
int value=scanner.nextInt();
if(value>100||value<0){
System.out.println("无效货品价格");
System.out.println("请输入您购买的东西价格:");
value=scanner.nextInt();
}
System.out.println("请输入您支付的金额:");
int value2=scanner.nextInt();
if(value>value2||value2>100){
System.out.println("无效付款");
}else if(value==value2){
System.out.println("不找零");
}else{
int value3=value2-value;
if(value3>100||value3<0){
System.out.println("输入的价钱不在本店范围内");
value=scanner.nextInt();
}
Price price=new Price();
price.process(value3);
}
}
public void process(int money){
System.out.println("将"+money+"元找零需要");
int[] value={100,50,10,5,1};
int[] count=new int[value.length];
for(int i=0;i<value.length;i++){
while(money>=value[i]){
money-=value[i];
count[i]++;
}
if(count[i] !=0){
System.out.print("应找回"+count[i]+"张"+value[i]+"元 ");
}
}
}
}
四、心得体会
通过这一次的黑盒测试实验,我们小组成员学习到了很多的知识。首先对于测试计划上的失误,可以通过小组讨论,理清问题所在,交流寻找解决方案,以保证软件测试的后续展开。
还有对于测试人员对软硬件的熟悉程度引起的延误,可暂时延后测试行程,组员之间相互沟通交流软件、硬件系统使用心得,共同提高熟练程度后继续展开测试工作。在这过程中我们发现我们仍然有很多不足的地方,例如对测试的基本知识掌握程序不够,编写测试用例可能不完整等等。
20
展开阅读全文