实验一_黑盒测试
实验一 黑盒测试
一、实验目的
1、 掌握黑盒测试的基础知识;
2、 掌握黑盒测试的检查内容及测试目的;
3、 掌握黑盒测试的几种基本测试方法:等价类划分方法、边界值分析方法、因果图法和决策表法;
二、实验要求
1、 复习有关内容,理解黑盒测试;
2、 掌握等价类划分、边界值分析方法、因果图法和决策表法,并能设计出测试用例;
3、 对具体软件,能分别使用相应的黑盒测试方法设计测试用例,并实施测试、分析测试结果。
三、实验内容
1、设计函数实现输入日期显示星期几,并用等价类及边界值法测试
实验步骤:
① 设计程序
public static void main(String[] args) {
while (true){
int[] monthOfDaysPing = {31,28,31,30,31,30,31,31,30,31,30,31};
int[] monthOfDaysRun = {31,29,31,30,31,30,31,31,30,31,30,31};
Scanner sc = new Scanner(System.in);
int data = 0;
try {
data = sc.nextInt();
}catch (Exception e){
System.out.println("日期格式输入错误");
continue;
}
if((data+"").length()!=8){
System.out.println("日期格式错误");
continue;
}
if(Integer.parseInt((data+"").substring(4,6))>12 || (Integer.parseInt((data+"").substring(4,6))<1)){
System.out.println("月份格式错误");
continue;
}
int oneToLastYearDays = 0;
int curYear = data/10000;
//System.out.println(curYear+"curYear");
int curMonth = (data/100)%100;
//System.out.println(curMonth+"curMonth");
int lastYear = curYear-1;
int sumDays = 0;
int curYearDays = 0;
if((curYear%400==0)||(curYear%4==0&&curYear%100!=0)){
if(data%100<1||data%100>monthOfDaysRun[curMonth-1]){
System.out.println("当月天数错误");
continue;
}
}else{
if(data%100<1||data%100>monthOfDaysPing[curMonth-1]){
System.out.println("当月天数错误");
continue;
}
}
for(int i = 1;i<=lastYear;i++){
if((i%400==0)||(i%4==0&&i%100!=0)){
oneToLastYearDays = oneToLastYearDays+366;
}else {
oneToLastYearDays=oneToLastYearDays+365;
}
}
System.out.println("去年的所有天数"+oneToLastYearDays);
System.out.println("去年年底的星期"+oneToLastYearDays%7);
if((curYear%400==0)||(curYear%4==0&&curYear%100!=0)){
for(int i = 1;i<curMonth;i++){
curYearDays = curYearDays+monthOfDaysRun[i];
}
}else{
for(int i = 1;i<curMonth;i++){
curYearDays = curYearDays+monthOfDaysPing[i];
}
}
System.out.println("满月的天数"+curYearDays);
System.out.println("当月天数"+(data%100));
sumDays = oneToLastYearDays+curYearDays+(data%100);
System.out.println("星期"+(sumDays)%7);
}
}
② 划分等价类,得到等价类表。等价类表格式如下:
输入条件 |
有效等价类 |
唯一标识 |
无效等价类 |
唯一标识 |
输入日期的长度基类型 |
6位数字字符 |
日期 |
有非有效字符 位数少于6位 位数多余6位 |
… |
月份范围 |
01~12 |
月份 |
小于1 大于12 |
… |
天数范围 |
01-31 01-30 01-29 01-28 |
日期 |
不在规定范围内 |
|
|
|
|
|
|
③ 运用等价类划分法设计测试用例,得到测试用例表。测试用例表格式如下:
序号 |
输入数据 |
覆盖等价类 |
输出 |
输入日期长度及类型 |
1位数字字符 5位数字字符 6位数字字符 7位数字字符 有1个非数字字符 全部是非数字字符 八位有效数字 |
5 20221 202201 2022012 2022.3.26 ....... 20220326 |
显示出错 显示出错 显示出错 显示出错 显示出错 显示出错 有效输入 |
月份范围 |
在有效范围边界上选取数据 |
20220101 20220001 20221201 20221301 |
有效输入 显示出错 有效输入 显示出错 |
天数范围 |
31天的月份 30天的月份 29天的月份 28天的月份 |
20220231 20220131 20220230 20220430 20220229 20200229 20220228
|
显示出错 有效输入 显示出错 有效输入 显示出错 有效输入 有效输入 |
④ 运用边界值法设计测试用例。
年份最小边界值: 00000000
月份边界值20220101 20221201
31天的月份边界值20221231 20221201
30天的月份边界值 20220430 20220401
29天的月份天数的边界值 20200229 20200201
28天月份天数边界值 20220228 20220201
2、找零钱最佳组合
假设商店货品价格(R) 都不大于100元(且为整数),若顾客付款(P)在100元内,现有一个程序能在每位顾客付款后给出找零钱的最佳组合(找给顾客货币张数最少)。假定此商店的货币面值只包括:50元(N50)、10元(N10)、 5元(N5)、1元(N1) 四种。
请结合等价类划分法和边界值分析法为上述程序设计出相应的测试用例。
实验步骤:
public static void main(String[] args) {
int flag=1;
while(flag!=0){
Scanner sc = new Scanner(System.in);
System.out.println("请输入商品价格:");
int sPrice=0;
try {
sPrice= sc.nextInt();
}catch (Exception e){
System.out.println("商品价格输入错误");
continue;
}
System.out.println("请输入顾客付钱金额:");
int fu = 0;
try{
fu= sc.nextInt();
}catch (Exception e){
System.out.println("顾客付款输入错误");
continue;
}
if(fu<=0||sPrice<=0){
System.out.println("输入错误");
continue;
}
if(sPrice>fu){
System.out.println("顾客付款应大于商品价格");
continue;
}
int zhao = fu-sPrice;
int[] money = new int[]{50,10,5,1};
int[] count = new int[4];
for(int i = 0;i<money.length;i++){
count[i] = zhao/money[i];
zhao = zhao%money[i];
}
System.out.println(Arrays.toString(count));
System.out.println("是否继续测试?如果退出请输入0,继续输入1");
flag = sc.nextInt();
}
}
输入条件 |
有效等价类 |
唯一标识 |
无效等价类 |
唯一标识 |
商品价格(R)于客户付款(P)之间的关系 |
R<=P |
|
R>P |
… |
商品价格 |
大于0的数字 |
|
非数字字符 小于0 |
… |
客户付款 |
大于0的数字 |
|
非数字字符 小于等于0 |
|
|
|
|
|
|
运用等价类划分法设计测试用例,得到测试用例表。测试用例表格式如下:
序号 |
输入数据 |
覆盖等价类 |
输出 |
商品价格(R)于客户付款(P)之间的关系 |
商品价格大于用户付款 P=R P<R |
20 15 20 20 20 30 |
输入错误 有效输入 有效输入 |
商品价格 |
小于等于0的数字 非数字字符 正整数 |
-1 . 20 |
输入错误 输入错误 有效输入 |
客户付款 |
小于等于0的数字 非数字字符 正整数 |
-1 . 20 |
输入错误 输入错误 有效输入
|
⑤ 运用边界值法设计测试用例。
0 0 100 100 20 21 21 20
3、有一个饮料自动售货机(处理单价为5角钱)的控制处理软件,它的软件规格说明如下:
若投入5角钱的硬币,按下“橙汁”或“啤酒”的按钮,则相应的饮料就送出来。若投入1元钱的硬币,同样也是按“橙汁”或“啤酒”的按钮,则自动售货机在送出相应饮料的同时退回5角钱的硬币。
模拟程序如下:
用因果图法测试该程序,并撰写实验报告。
实验步骤:
①编写程序
②分析原因与结果
序号 |
输入数据 |
|
输出 |
|
1元 啤酒 0.5元 啤酒 1元 橙汁 0.5元 橙汁 |
|
找0.5元 啤酒 啤酒 找0.5元 橙汁 橙汁 |
③画出因果图
④转化为决策表
|
橙汁 |
啤酒 |
0.5 |
橙汁 |
啤酒
|
1 |
找0.5元 橙汁
|
找0.5元 啤酒
|
⑤根据决策表设计测试用例,得到测试用例表
序号 |
输入数据 |
|
输出 |
1 |
1元 啤酒
|
|
找0.5元 啤酒
|
2 |
0.5元 啤酒
|
|
啤酒
|
3 |
1元 橙汁
|
|
找0.5元 橙汁
|
4 |
0.5元 橙汁 |
|
橙汁 |
4、航空服务查询问题:根据航线,仓位,飞行时间查询航空服务。
假设一个中国的航空公司规定:
① 中国去欧美的航线所有座位都有食物供应,每个座位都可以播放电影。
② 中国去非欧美的国外航线都有食物供应,只有商务仓可以播放电影。
③ 中国国内的航班的商务仓有食物供应,但是不可以播放电影
④ 中国国内航班的经济仓只有当飞行时间大于2小时时才有食物供应,但是不可以播放电影。
请用程序实现上述功能,并用决策表法设计测试用例,再执行测试,撰写实验报告。
实验步骤:
① 编写程序
import java.util.Scanner;
/**
* 假设一个中国的航空公司规定:
* ① 中国去欧美的航线所有座位都有食物供应,每个座位都可以播放电影。
* ② 中国去非欧美的国外航线都有食物供应,只有商务仓可以播放电影。
* ③ 中国国内的航班的商务仓有食物供应,但是不可以播放电影
* ④ 中国国内航班的经济仓只有当飞行时间大于2小时时才有食物供应,但是不可以播放电影。
*/
public class sy1_4 {
public static void main(String[] args) {
int flag = 1;
while(flag!=0){
Scanner sc = new Scanner(System.in);
System.out.println("请选择您的航线 欧美(请输入1) 国外非欧美(请输入2) 国内(请输入3)");
int route = sc.nextInt();
System.out.println("请选择您的舱位: 商务舱(请选择1) 经济舱(请选择2)");
int cw = sc.nextInt();
System.out.println("请选择您的飞行时间: 两小时以内(请选择1) 超过两小时(请选择2)");
int time = sc.nextInt();
if(route==1){
System.out.println("您的仓位有食物供应,且可以播放电影");
}else if(route==2){
if(cw==1){
System.out.println("您的仓位有食物供应,且可以播放电影");
}else{
System.out.println("您的仓位有食物供应,但不可以播放电影");
}
}else {
if (cw==1){
System.out.println("您的仓位有食物供应,但不可以播放电影");
}else{
if (time == 1) {
System.out.println("您的仓位没有食物供应,且不可以播放电影");
}else {
System.out.println("您的仓位有食物供应,但不可以播放电影");
}
}
}
System.out.println("是否继续测试?如果退出请输入0,继续输入1");
flag = sc.nextInt();
}
}
}
② 构造决策表
等价类表
等价类 |
编号 |
等价类 |
编号 |
等价类 |
编号 |
航线位国外欧美航线 |
M1 |
仓位位商务舱 |
D1 |
飞行时间小于2h |
Y1 |
航线为国外非欧美航线 |
M2 |
仓位为经济舱 |
D2 |
飞行时间大2h |
Y2 |
航线位国内航线 |
M3 |
|
|
|
|
条件桩 |
动作桩 |
C1:航线位国外欧美航线 |
A1:播放电影 |
C2:航线为国外非欧美航线 |
A2:食物供应 |
C3:航线位国内航线 |
|
C4:仓位位商务舱 |
|
C5:仓位为经济舱 |
|
C6:飞行时间小于2h |
|
C7:飞行时间大2h |
|
由于2^7=128太大,因此修改条件装
条件桩 |
动作桩 |
C1:上图M1,M2,M3中之一 |
A1:播放电影 |
C2: 上图D1,D2之一 |
A2:食物供应 |
C3: 上图Y1,Y2之一 |
|
初始决策表
|
|
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
条件桩 |
C1航线 |
M1 |
M1 |
M1 |
M1 |
M2 |
M2 |
M2 |
M2 |
M3 |
M3 |
M3 |
M3 |
C2仓位 |
D1 |
D1 |
D2 |
D2 |
D1 |
D1 |
D2 |
D2 |
D1 |
D1 |
D2 |
D2 |
|
C3飞行时间 |
Y1 |
Y2 |
Y1 |
Y2 |
Y1 |
Y2 |
Y1 |
Y2 |
Y1 |
Y2 |
Y1 |
Y2 |
|
动作桩 |
A1:播放时间 |
Y |
Y |
Y |
Y |
Y |
Y |
|
|
|
|
|
|
A2:食物供应 |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
Y |
|
Y |
合并后的决策表
选项 规则 |
1 |
2 |
3 |
4 |
5 |
6 |
|
条件桩 |
C1航线 |
M1 |
M2 |
M2 |
M3 |
M3 |
M3 |
C2仓位 |
- |
D1 |
2 |
D1 |
D2 |
D2 |
|
C3飞行时间 |
- |
- |
- |
- |
Y1 |
Y2 |
|
动作桩 |
A1:播放时间 |
Y |
Y |
|
|
|
|
A2:食物供应 |
Y |
Y |
Y |
Y |
|
Y |
③ 根据决策表设计测试用例,得到测试用例表
测试用例编号 |
航线 |
仓位 |
飞行时间 |
预期输出 |
1 |
国外欧美航线 |
商务舱/经济舱 |
小于2h/大于等于2h |
播放电影 食物供应 |
2 |
国外非欧美航线 |
商务舱 |
小于2h/大于等于2h |
播放电影 食物供应 |
3 |
国外非欧美航线 |
经济舱 |
小于2h/大于等于2h |
食物供应 |
4 |
国内航线 |
商务舱 |
小于2h/大于等于2h |
食物供应 |
5 |
国内航线 |
经济舱 |
小于2h |
- |
6 |
国内航线 |
经济舱 |
大于等于2h |
食物供应 |
四、实验思考
① 在实际的测试中,如何设计测试用例才能达到用最少的测试用例检测出最多的缺陷; 1.先要对需求做充足的分析,结合被测对象的特点,列出等价类。
2.在此基础上分析出所有边界值,包括隐性的边界。
3.在上述两类集合中选取交集,进行用例设计。
•根据输入参数的代表值组合而成的有效等价类和无效测试用例按照测试用例的使用频 率和重要程度排序,为每个测试用例设置不同的优先级,根据时间和资源的实际情况, 有针对性地选择要执行的测试用例;
•优先选择包含边界值和边界值组合的测试用例;
•将一个等价类的每个代表值和其他等价类的每个代表值组合设计测试用例;
•保证满足最小原则,及一个等价类的每个代表值至少在一个测试用例中出现。
② 在进行用例设计时,如何考虑软件测试用例的充分性和减少软件测试用例的冗余性;
在编写测试用例的时候,要充分熟悉需求,并且了解软件的架构设计,各个模块的设计。 精心选择测试数据来达到对需求的一个较好的覆盖率。 在实际测试过程中,会因为软件的特性,可能各个模块之间有关联,这时可以安排好测试用例的执行顺序,以达到测试数据的重用。 这个需要一定经验积累。