進行單元測試步驟:
第一步:将所有的運算分類情況封裝在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型的話就不會出現這個問題。在黑白盒測試的時候,感覺黑盒測試比白盒測試更加好,因為黑盒測試有點像我們的使用者,使用者根本不知道我們的代碼是如何的,他肯定是不按情理出牌的,這樣更加有利于我們該軟體的完善,對各種情況都可以考慮到,是開發出來的軟體更加人性化。
雖然剛開始做實驗的時候覺得無從下手,都有了不想寫的念頭了,但是通過查閱相關的資料發現,原來單元測試是這麼有用的,再一步一步的寫下去,才感受到了它的益處,其知道它是和我們做好一個軟體息息相關。本次實驗真是收獲頗豐。