进行单元测试步骤:
第一步:将所有的运算分类情况封装在Calculator类中:
import java.math.BigDecimal;
import java.text.DecimalFormat;
public class Calculator{
long sum;
char a[]={'+','-','×','÷'};
char b[]={'+','-','×','÷'};
public void IntegerandInteger(int b,int c,int d){
if(a[b]==a[0])
{
sum=c+d;
}
else if(a[b]==a[1])
{
sum=c-d;
}
else if(a[b]==a[2])
{
sum=c*d;
}
else if(a[b]==a[3])
{
sum=(long) ((float)c/d);
}
}
public void Integerandfraction(int b,int c,int d,int f){
if(a[b]==a[0])
{
sum=(long) (c+(float)f/d);
}
else if(a[b]==a[1])
{
sum=(long) (c-(float)f/d);
}
else if(a[b]==a[2])
{
sum=(long) (c*((float)f/d));
}
else if(a[b]==a[3])
{
sum=(long) ((float)c/((float)f/d));
}
}
public void fractionandfraction(int b,int c,int d,int g,int f){
if(a[b]==a[0])
{
sum=(long) ((float)d/c+(float)g/f);
}
else if(a[b]==a[1])
{
sum=(long) ((float)d/c-(float)g/f);
}
else if(a[b]==a[2])
{
sum=(long) (((float)d/c)*((float)g/f));
}
else if(a[b]==a[3])
{
sum=(long) (((float)d/c)/((float)g/f));
}
}
public void twoIntegerandfraction(int c,int d,int f,int g,int h,int l){
if(a[c]==a[0])
{
if(b[d]==b[0])
{
sum=(long) (f+g+(float)l/h);
}
else if(b[d]==b[1])
{
sum=(long) (f+g-(float)l/h);
}
else if(b[d]==b[2])
{
sum=(long) (f+g*((float)l/h));
}
else if(b[d]==b[3])
{
sum=(long) (f+(float)g/((float)l/h));
}
}
else if(a[c]==a[1])
{
if(b[d]==b[0])
{
sum=(long) (f-g+(float)l/h);
}
else if(b[d]==b[1])
{
sum=(long) (f-g-(float)l/h);
}
else if(b[d]==b[2])
{
sum=(long) (f-g*((float)l/h));
}
else if(b[d]==b[3])
{
sum=(long) (f-(float)g/((float)l/h));
}
}
else if(a[c]==a[2])
{
if(b[d]==b[0])
{
sum=(long) (f*g+(float)l/h);
}
else if(b[d]==b[1])
{
sum=(long) (f*g-(float)l/h);
}
else if(b[d]==b[2])
{
sum=(long) (f*g*((float)l/h));
}
else if(b[d]==b[3])
{
sum=(long) ((float)f*g/((float)l/h));
}
}
else if(a[c]==a[3])
{
if(b[d]==b[0])
{
sum=(long) ((float)f/g+(float)l/h);
}
else if(b[d]==b[1])
{
sum=(long) ((float)f/g-(float)l/h);
}
else if(b[d]==b[2])
{
sum=(long) ((float)f/g*((float)l/h));
}
else if(b[d]==b[3])
{
sum=(long) ((float)f/g/((float)l/h));
}
}
}
public void allfraction(int c,int d,int f,int g,int h,int l,int s,int p){
if(a[c]==a[0])
{
if(b[d]==b[0])
{
sum=(long) ((float)g/f+(float)l/h+(float)p/s);
}
else if(b[d]==b[1])
{
sum=(long) ((float)g/f+(float)l/h-(float)p/s);
}
else if(b[d]==b[2])
{
sum=(long) ((float)g/f+((float)l/h)*((float)p/s));
}
else if(b[d]==b[3])
{
sum=(long) ((float)g/f+((float)l/h)/((float)p/s));
}
}
else if(a[c]==a[1])
{
if(b[d]==b[0])
{
sum=(long) ((float)g/f-(float)l/h+(float)p/s);
}
else if(b[d]==b[1])
{
sum=(long) ((float)g/f-(float)l/h-(float)p/s);
}
else if(b[d]==b[2])
{
sum=(long) ((float)g/f-((float)l/h)*((float)p/s));
}
else if(b[d]==b[3])
{
sum=(long) ((float)g/f-((float)l/h)/((float)p/s));
}
}
else if(a[c]==a[2])
{
if(b[d]==b[0])
{
sum=(long) (((float)g/f)*((float)l/h)+(float)p/s);
}
else if(b[d]==b[1])
{
sum=(long) (((float)g/f)*((float)l/h)-(float)p/s);
}
else if(b[d]==b[2])
{
sum=(long) (((float)g/f)*((float)l/h)*((float)p/s));
}
else if(b[d]==b[3])
{
sum=(long) (((float)g/f)*((float)l/h)/((float)p/s));
}
}
else if(a[c]==a[3])
{
if(b[d]==b[0])
{
sum=(long) (((float)g/f)/((float)l/h)+(float)p/s);
}
else if(b[d]==b[1])
{
sum=(long) (((float)g/f)/((float)l/h)-(float)p/s);
}
else if(b[d]==b[2])
{
sum=(long) (((float)g/f)/((float)l/h)*((float)p/s));
}
else if(b[d]==b[3])
{
sum=(long) (((float)g/f)/((float)l/h)/((float)p/s));
}
}
}
public void allInteger(int c,int d,int f,int g,int h){
if(a[c]==a[0])
{
if(b[d]==b[0])
{
sum=f+g+h;
}
else if(b[d]==b[1])
{
sum=f+g-h;
}
else if(b[d]==b[2])
{
sum=f+g*h;
}
else if(b[d]==b[3])
{
sum=(long) (f+(float)g/h);
}
}
else if(a[c]==a[1])
{
if(b[d]==b[0])
{
sum=f-g+h;
}
else if(b[d]==b[1])
{
sum=f-g-h;
}
else if(b[d]==b[2])
{
sum=f-g*h;
}
else if(b[d]==b[3])
{
sum=(long) (f-(float)g/h);
}
}
else if(a[c]==a[2])
{
if(b[d]==b[0])
{
sum=f*g+h;
}
else if(b[d]==b[1])
{
sum=f*g-h;
}
else if(b[d]==b[2])
{
sum=f*g*h;
}
else if(b[d]==b[3])
{
sum=(long) ((float)f*g/h);
}
}
else if(a[c]==a[3])
{
if(b[d]==b[0])
{
sum=(long) ((float)f/g+h);
}
else if(b[d]==b[1])
{
sum=(long) ((float)f/g-h);
}
else if(b[d]==b[2])
{
sum=(long) ((float)f/g*h);
}
else if(b[d]==b[3])
{
sum=(long) ((float)f/g/h);
}
}
}
public void Integerandtwofraction(int c,int d,int f,int g,int h,int l,int s){
if(a[c]==a[0])
{
if(b[d]==b[0])
{
sum=(long) (f+(float)h/g+(float)s/l);
}
else if(b[d]==b[1])
{
sum=(long) (f+(float)h/g-(float)s/l);
}
else if(b[d]==b[2])
{
sum=(long) (f+((float)h/g)*((float)s/l));
}
else if(b[d]==b[3])
{
sum=(long) (f+((float)h/g)/((float)s/l));
}
}
else if(a[c]==a[1])
{
if(b[d]==b[0])
{
sum=(long) (f-(float)h/g+(float)s/l);
}
else if(b[d]==b[1])
{
sum=(long) (f-(float)h/g-(float)s/l);
}
else if(b[d]==b[2])
{
sum=(long) (f-((float)h/g)*((float)s/l));
}
else if(b[d]==b[3])
{
sum=(long) (f-((float)h/g)/((float)s/l));
}
}
else if(a[c]==a[2])
{
if(b[d]==b[0])
{
sum=(long) (f*((float)h/g)+(float)s/l);
}
else if(b[d]==b[1])
{
sum=(long) (f*((float)h/g)-(float)s/l);
}
else if(b[d]==b[2])
{
sum=(long) (f*((float)h/g)*((float)s/l));
}
else if(b[d]==b[3])
{
sum=(long) (f*((float)h/g)/((float)s/l));
}
}
else if(a[c]==a[3])
{
if(b[d]==b[0])
{
sum=(long) (f/((float)h/g)+(float)s/l);
}
else if(b[d]==b[1])
{
sum=(long) (f/((float)h/g)-(float)s/l);
}
else if(b[d]==b[2])
{
sum=(long) (f/((float)h/g)*((float)s/l));
}
else if(b[d]==b[3])
{
sum=(long) (f/((float)h/g)/((float)s/l));
}
}
}
public long getSum(){
return sum;
}
}
第二步:将JUnit4单元测试包引入这个项目中
第三步,生成JUnit测试框架,之后系统会自动生成一个新类CalculatorTest,再根据情况完善CalculatorTest类里面的代码,完整的CalculatorTest代码如下:
import static org.junit.Assert.*;
import org.junit.Before;
import org.junit.Test;
public class CalculatorTest {
private Calculator calculator=new Calculator();
@Before
public void setUp() throws Exception {
}
@Test
public void testIntegerandInteger() {
calculator.IntegerandInteger(0,1,2);
assertEquals(3, calculator.getSum());
}
@Test
public void testIntegerandfraction() {
calculator.Integerandfraction(0, 1, 2, 4);
assertEquals(3,calculator.getSum());
}
@Test
public void testFractionandfraction() {
calculator.fractionandfraction(0,3,1,2,3);
assertEquals(1,calculator.getSum());
}
@Test
public void testTwoIntegerandfraction() {
calculator.twoIntegerandfraction(0, 0, 2, 3, 1, 2);
assertEquals(7,calculator.getSum());
}
@Test
public void testAllfraction() {
calculator.allfraction(0, 0, 5, 3, 5, 4, 5, 3);
assertEquals(2,calculator.getSum());
}
@Test
public void testAllInteger() {
calculator.allInteger(0, 0, 3, 4, 5);
assertEquals(12,calculator.getSum());
}
@Test
public void testIntegerandtwofraction() {
calculator.Integerandtwofraction(0, 0, 3, 5, 2, 5, 3);
assertEquals(4,calculator.getSum());
}
@Test
public void testFactorial() {
calculator.Factorial(3);
assertEquals(6,calculator.getSum());
}
}
第四步,运行测试代码,结果如下:

白盒测试与黑盒测试:
白盒测试:
IntegerandInteger白盒测试:
当c=4,d=4时 | ||
判断 | 条件 | 结果 |
a[b]==a[0] | 8 | |
a[b]==a[1] | ||
a[b]==a[2] | 16 | |
a[b]==a[3] | 1 |
上面的白盒演示是整数与整数的两项测试,其余形式两项的白盒测试情况同上。
twoIntegerandfraction白盒测试:
当f=1,g=3,l=4,h=2 | |||
一级条件 | 二级条件 | ||
a[c]==a[0] | b[d]==b[0] | 6 | |
b[d]==b[1] | 2 | ||
b[d]==b[2] | |||
b[d]==b[3] | |||
a[c]==a[1] | |||
-4 | |||
-1 | |||
a[c]==a[2] | 5 | ||
1.5 | |||
a[c]==a[3] | 2.33 | ||
-1.67 | |||
0.67 | |||
0.17 |
上面的白盒演示是两个整数与一个分数的三项测试,其余形式三项的白盒测试情况同上。
Factorial白盒测试:
当a=3时 | ||
a==0 | ||
a!=0 |
上面的白盒演示是阶乘的测试。
黑盒测试:
测试内容 | 期望结果 | 实际结果 |
窗口中框中数据非正常输入 | 有相应的提示窗口弹出,提示输入错误 | 没有窗口弹出提示输入的不规范 |
通过黑盒的测试,将原代码进行改进,改进后运行截图如下:
实验总结:
本次的实验由于某种原因未能结对完成,这是一个比较遗憾的事情,但是通过本次的实验我却收获了不少。我知道了如何写单元测试以及如何做黑白盒的测试,以后写代码也可以通过本次实验的方法,这样可以使我们的代码更加完善,有关核心算法的出错几率会相应地减少。在单元测试的过程中出现了一些问题,至今还是不明白,例如:为什么返回计算的结果时,如果返回的是double或者float型测试的时候总是提示错误,如果把它改成int或者long型的话就不会出现这个问题。在黑白盒测试的时候,感觉黑盒测试比白盒测试更加好,因为黑盒测试有点像我们的用户,用户根本不知道我们的代码是如何的,他肯定是不按情理出牌的,这样更加有利于我们该软件的完善,对各种情况都可以考虑到,是开发出来的软件更加人性化。
虽然刚开始做实验的时候觉得无从下手,都有了不想写的念头了,但是通过查阅相关的资料发现,原来单元测试是这么有用的,再一步一步的写下去,才感受到了它的益处,其知道它是和我们做好一个软件息息相关。本次实验真是收获颇丰。