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