实验一 黑盒测试
一、实验目的
1、 掌握黑盒测试的基础知识;
2、 掌握黑盒测试的检查内容及测试目的;
3、 掌握黑盒测试的几种基本测试方法:等价类划分方法、边界值分析方法、因果图法和决策表法;
二、实验要求
1、 复习有关内容,理解黑盒测试;
2、 掌握等价类划分、边界值分析方法、因果图法和决策表法,并能设计出测试用例;
3、 对具体软件,能分别使用相应的黑盒测试方法设计测试用例,并实施测试、分析测试结果。
三、实验内容
1、设计函数实现输入日期显示星期几,并用等价类及边界值法测试
实验步骤:
① 设计程序
package org.example.test1;
import java.util.*;
public class rili {
public static void main(String[] args) {
Scanner n=new Scanner(System.in);
int r=0,i,p=0,year,k,z=0,month,day,t,monthsum=0;
//r为闰年数,i为余数。p为平年数。k为起始年数。z为总天数。monthsum为各个月天数
System.out.println("输入1900年1月1号之后的年份:");
year=n.nextInt();
for(k=1900;k<year;k++)//计算输入年数到1900年之间的平年有几个,跟闰年有几个。
{
if(year % 4 == 0 && year % 100 != 0 || year % 400 == 0)
{
r++;
}
else
p++;
}
z=z+r*366;
z=z+p*365;//计算年的总天数。
System.out.println("输入月数:");
month=n.nextInt();
for(t=1;t<month;t++)//计算输入月,之前的月份的总天数。
{
switch(t)
{
case 1:monthsum=monthsum+31;
break;
case 2:
if((year%4==0 && year%100!=0)||(year%400==0))
monthsum=monthsum+29;
else
monthsum=monthsum+28;
break;
case 3:monthsum=monthsum+31;
break;
case 4:monthsum=monthsum+30;
break;
case 5:monthsum=monthsum+31;
break;
case 6:monthsum=monthsum+30;
break;
case 7:monthsum=monthsum+31;
break;
case 8:monthsum=monthsum+31;
break;
case 9:monthsum=monthsum+30;
break;
case 10:monthsum=monthsum+31;
break;
case 11:monthsum=monthsum+30;
break;
case 12:monthsum=monthsum+31;
break;
}
}
System.out.println("输入天:");
day=n.nextInt();
monthsum=monthsum+day;
z=monthsum+(z+1);
i=z%7;
if(i==0) {
System.out.println("星期一");
}
if(i==1) {
System.out.println("星期二");
}
if(i==2) {
System.out.println("星期三");
}
if(i==3) {
System.out.println("星期四");
}
if(i==4) {
System.out.println("星期五");
}
if(i==5) {
System.out.println("星期六");
}
if(i==6) {
System.out.println("星期七");
}
}
}
② 划分等价类,得到等价类表。等价类表格式如下:
|
输入条件 |
有效等价类 |
唯一标识 |
无效等价类 |
唯一标识 |
|
年 |
1900<=y<=2500的闰年 |
1 |
Y<1900 |
10 |
|
|
1900<=y<=2500的平年 |
2 |
y>2500 |
11 |
|
月 |
m=1,3,5,7,8,10,12 |
3 |
m<1 |
12 |
|
|
m=4,6,9,11 |
4 |
m>12 |
13 |
|
|
m=2 |
5 |
|
|
|
日 |
1<=d<=28 |
6 |
d<1 |
14 |
|
|
d=29 |
7 |
d>31 |
15 |
|
|
d=30 |
8 |
|
|
|
|
d=31 |
9 |
|
|
③ 运用等价类划分法设计测试用例,得到测试用例表。测试用例表格式如下:
|
序号 |
输入数据 |
覆盖等价类 |
输出 |
|
1 |
2012.3.31 |
1-3.6-9 |
星期二 |
|
2 |
2022.5.31 |
1-3.6-9 |
日期不存在 |
|
3 |
2022.4.29 |
1.2.4.7 |
星期五 |
|
4 |
2022.4.30 |
1.2.4.8 |
星期六 |
|
5 |
2022.4.31 |
1.2.4.9 |
日期不存在 |
|
6 |
2022.2.28 |
1.2.5.6 |
星期一 |
|
7 |
2012.2.29 |
1.5.7 |
星期三 |
|
8 |
2022.2.29 |
2.5.7 |
日期不存在 |
|
9 |
2055.3.12 |
10.11 |
年份错误 |
|
10 |
2012.13.1 |
12.13 |
月份错误 |
|
11 |
2012.1.33 |
14.15 |
日期错误 |
|
1 |
2012.3.31 |
1-3.6-9 |
星期二 |
④ 运用边界值法设计测试用例。
|
序号 |
输入数据 |
覆盖的边界条件 |
输出 |
|
1 |
1900-01-01 |
最小年份、最小月份、最小日期 |
星期一 |
|
2 |
2500-12-31 |
最大年份、最大月份、最大日期 |
星期六 |
|
3 |
1900-01-07 |
周循环边界(满7天周期) |
星期日 |
|
4 |
2020-02-29 |
闰年2月最大日期 |
星期六 |
|
5 |
2021-02-28 |
平年2月最大日期 |
星期日 |
|
6 |
2021-03-01 |
2/3月日期过渡边界 |
星期一 |
|
7 |
2023-04-30 |
小月份最大日期 |
星期日 |
|
8 |
2023-01-31 |
大月份最大日期 |
星期二 |
|
9 |
1899-12-31 |
年份下限-1 |
年份错误 |
|
10 |
2501-01-01 |
年份上限+1 |
年份错误 |
|
11 |
2023-00-15 |
月份下限-1 |
月份错误 |
|
12 |
2023-13-01 |
月份上限+1 |
月份错误 |
|
13 |
2023-05-00 |
日期下限-1 |
日期错误 |
|
14 |
2023-05-32 |
大月份日期上限+1 |
日期错误 |
2、找零钱最佳组合
假设商店货品价格(R) 都不大于100元(且为整数),若顾客付款(P)在100元内,现有一个程序能在每位顾客付款后给出找零钱的最佳组合(找给顾客货币张数最少)。 假定此商店的货币面值只包括:50元(N50)、10元(N10)、 5元(N5)、1元(N1) 四种。
请结合等价类划分法和边界值分析法为上述程序设计 出相应的测试用例。
实验步骤:
① 设计程序
package org.example.test1;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class ChangeCalculator extends JFrame {
private JTextField priceField;
private JTextField paymentField;
private JTextArea resultArea;
public ChangeCalculator() {
setTitle("找零计算器");
setSize(400, 300);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLayout(new GridLayout(5, 2));
add(new JLabel("商品价格 (1-100元):"));
priceField = new JTextField();
add(priceField);
add(new JLabel("支付金额 (1-100元):"));
paymentField = new JTextField();
add(paymentField);
JButton calculateButton = new JButton("计算找零");
add(calculateButton);
resultArea = new JTextArea();
resultArea.setEditable(false);
add(new JScrollPane(resultArea));
calculateButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
calculateChange();
}
});
}
private void calculateChange() {
try {
int price = Integer.parseInt(priceField.getText());
int payment = Integer.parseInt(paymentField.getText());
// 输入验证
if (price < 1 || price > 100) {
resultArea.setText("错误:价格需在1-100元之间");
return;
}
if (payment < 1 || payment > 100) {
resultArea.setText("错误:支付金额需在1-100元之间");
return;
}
if (payment < price) {
resultArea.setText("错误:支付金额不足");
return;
}
int change = payment - price;
if (change == 0) {
resultArea.setText("无需找零");
return;
}
int[] result = calculateOptimalChange(change);
String output = String.format(
"找零 %d 元,最佳组合:\n50元: %d 张\n10元: %d 张\n5元: %d 张\n1元: %d 张\n总张数:%d",
change, result[0], result[1], result[2], result[3], result[4]
);
resultArea.setText(output);
} catch (NumberFormatException ex) {
resultArea.setText("错误:请输入有效的整数金额");
}
}
private int[] calculateOptimalChange(int change) {
int n50 = change / 50;
change %= 50;
int n10 = change / 10;
change %= 10;
int n5 = change / 5;
change %= 5;
int n1 = change;
int total = n50 + n10 + n5 + n1;
return new int[]{n50, n10, n5, n1, total};
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> {
new ChangeCalculator().setVisible(true);
});
}
}
② 划分等价类,得到等价类表。等价类表格式如下:
|
输入条件 |
有效等价类 |
唯一标识 |
无效等价类 |
唯一标识 |
|
商品价格 |
1-100的整数(1≤R≤100) |
R<1, R>100, 非整数输入 |
商品价格 |
1-100的整数(1≤R≤100) |
|
支付金额 |
R≤P≤100的整数 |
P<R, P>100, 非整数输入 |
支付金额 |
R≤P≤100的整数 |
|
找零金额 |
0≤P-R≤99 |
P-R<0, P-R>99 |
找零金额 |
0≤P-R≤99 |
③ 运用等价类划分法设计测试用例,得到测试用例表。测试用例表格式如下:
|
序号 |
输入数据 |
覆盖等价类 |
输出 |
|
1 |
(50, 100) |
有效边界值 |
找零50元:1张50 |
|
2 |
(99, 100) |
有效最小找零 |
找零1元:1张1元 |
|
3 |
(1, 100) |
有效最大找零 |
找零99元:组合计算 |
|
4 |
(50, 50) |
找零为0的情况 |
无需找零 |
|
5 |
(0, 50) |
无效价格下限 |
价格错误 |
|
6 |
(101, 200) |
无效价格上限 |
价格错误 |
|
7 |
(80, 70) |
支付不足 |
支付金额不足 |
|
8 |
(50, 150) |
无效支付金额上限 |
支付金额错误 |
|
9 |
(50.5, 100) |
非整数输入 |
输入格式错误 |
④ 运用边界值法设计测试用例。
|
序号 |
输入(价格,支付) |
测试边界 |
预期输出 |
|
1 |
(1, 1) |
最小金额交易 |
无需找零 |
|
2 |
(100, 100) |
最大金额交易 |
无需找零 |
|
3 |
(50, 50) |
找零零边界 |
无需找零 |
|
4 |
(99, 100) |
最小找零边界 |
1元×1 |
|
5 |
(1, 100) |
最大找零边界 |
50+10×4+5×1+1×4=99元 |
|
6 |
(50, 101) |
支付金额上限+1 |
支付金额错误 |
|
7 |
(50, 50) |
刚好支付 |
无需找零 |
|
8 |
(50, 55) |
找零包含所有面额 |
5元×1 |
|
9 |
(95, 100) |
需要多种面额组合 |
5元×1 |

浙公网安备 33010602011771号