實驗五
一、結對伙伴:
陳江煥 博客:http://www.cnblogs.com/c-19/
二、分工
首先我們兩個合作將含有界面的源程序中核心代碼抽取出來封裝成一個類,并建立單元測試進行測試;
然后由陳江煥負責白盒測試中條件覆蓋組合,我負責測試用例表;
最后我們兩個合作共同完成黑盒測試。
三、白盒單元測試:
1、實驗環境:Eclipse集成開發環境+JUnit4測試框架+java
2、測試用例表:
測試項目名稱 |
四則運算單元測試 |
|||
測試人員 |
林惠映、陳江煥 |
編制日期 |
2015年4月29 |
|
功能特性 |
JUnit4是著名的單元測試框架,在JUnit4中所有的測試用例采用@Annotation標注,使用@Test標簽標注測試方法,建立一個簡單的測試Unit中各個運算的用例,點擊run運行單元測試后就會出現JUnit的運行器,并給出運行次數、錯誤以及故障次數的提示,并且@Test該標注不能刪,否則其測試情況將不會出現,當用代碼寫出了相應的測試后,fail(“尚未實現”)標志要屏蔽,否則測試情況會給出錯誤提示 |
|||
用例編號 |
輸入數據(a,b,num) |
預期輸出(a,b,Res) |
實際輸出(a,b,Res) |
測試狀態 |
1 |
(2,3,0) |
(2,3,5) |
(2,3,5) |
測試正確 |
2 |
(4,2,1) |
(4,2,2) |
(4,2,2) |
測試正確 |
3 |
(1,2,,2) |
(1,2,2) |
(1,2,2) |
測試正確 |
4 |
(8,2,3) |
(8,2,4) |
(8,2,4) |
測試正確 |
3、條件分支覆蓋情況:
4、源程序中含界面的核心計算代碼:
if (bj == B2) { int a, b, num, i = 1; if (i < count) { T3.setText(null);//當按鈕按下一題時就將T3與T4的內容更新 T4.setText(null); num = (int) (Math.random() * 5); a = (int) (Math.random() * 200) - 100; b = (int) (Math.random() * 200) - 100; i++; if (num == 0) { if (a < 0 && b < 0) { T2.setText("(" + a + ")" + "+(" + b + ")="); } else if (a < 0 && b > 0) { T2.setText("(" + a + ")" + "+" + b + "="); } else if (a > 0 && b < 0) { T2.setText(a + "+(" + b + ")="); } else { T2.setText(a + "+" + b + "="); } c = a + b; } else if (num == 1) { if (a < 0 && b < 0) { T2.setText("(" + a + ")" + "-(" + b + ")="); } else if (a < 0 && b > 0) { T2.setText("(" + a + ")" + "-" + b + "="); } else if (a > 0 && b < 0) { T2.setText(a + "-(" + b + ")="); } else { T2.setText(a + "-" + b + "="); } c = a - b; } else if (num == 2) { if (a < 0 && b < 0) { T2.setText("(" + a + ")" + "*(" + b + ")="); } else if (a < 0 && b > 0) { T2.setText("(" + a + ")" + "*" + b + "="); } else if (a > 0 && b < 0) { T2.setText(a + "*(" + b + ")="); } else { T2.setText(a + "*" + b + "="); } c = a * b; } else if (num == 3&&b!=0) { if (a < 0 && b < 0) { T2.setText("(" + a + ")" + "/(" + b + ")="); } else if (a < 0 && b > 0) { T2.setText("(" + a + ")" + "/" + b + "="); } else if (a > 0 && b < 0) { T2.setText(a + "/(" + b + ")="); } else { T2.setText(a + "/" + b + "="); } d= (float)a/(float)b; BigDecimal bg = new BigDecimal(d); d1 =(float)bg.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue(); }
5、將核心代碼封裝成一個類用于單元測試:
import java.util.*; public class Unit { int num,a,b,c; public Unit() { num = (int) (Math.random() * 5); a = (int) (Math.random() * 200) - 100;//-100~100 b = (int) (Math.random() * 200) - 100;//-100~100 if (num == 0)//num為0時,是加法運算 { add(a,b); } else if (num == 1) //num為1表示減法運算 { jian(a,b); } else if (num == 2) { //num為2表示乘法運算 chen(a,b); } else if (num == 3&&b!=0) { //num為3表示除法運算,并且要考慮除數不能為0的情況,因此b!=0 chu(a,b); } } public static int add(int a,int b) { return a+b; } public static int jian(int a,int b) { return a-b; } public static int chen(int a,int b) { return a*b; } public static int chu(int a,int b) { return a/b; } }
6、 單元測試用例代碼:
1 import static org.junit.Assert.*; 2 import org.junit.Before; 3 import org.junit.Test; 4 public class UnitTest { 5 Unit unit; 6 public void setUp() throws Exception { 7 unit=new Unit(); 8 } 9 @Test 10 public void testAdd() { 11 int res=unit.add(2, 3); 12 assertEquals(5,res); 13 //fail("尚未實現"); 14 } 15 @Test 16 public void testJian() { 17 int res=unit.jian(4, 2); 18 assertEquals(2,res); 19 //fail("尚未實現"); 20 } 21 @Test 22 public void testChen() { 23 int res=unit.chen(1, 2); 24 assertEquals(2,res); 25 //fail("尚未實現"); 26 } 27 @SuppressWarnings("deprecation") 28 @Test 29 public void testChu() { 30 int res=unit.chu(8,2); 31 assertEquals(4,res); 32 //fail("尚未實現"); 33 } 34 //處理除0異常,即當除數為0的情況 35 @Test(expected = ArithmeticException.class) 36 public void chuzero(){ 37 unit.chu(1,0); 38 39 } 40 41 }
測試結果:
7、測試結果分析:
在單元測試中寫入我們所要測試的測試代碼,并給出測試用例,在所給測試用例的情況下,如果預期結果與實際結果相一致(即測試情況均為綠色打鉤通過),則代表測試結果通過,否則則表示程序有錯;測試結果用函數assetEquals();
四、黑盒測試
1、當輸入答案為字符時,會出現異常
解決辦法:
源代碼
B1.addActionListener(new ActionListener() { //按鈕B1表示確定 public void actionPerformed(ActionEvent e) { Object bj = e.getSource(); // 獲得事件源 if (bj == B1) { if (d1== Float.parseFloat(T3.getText()) || c == Float.parseFloat(T3.getText()) || s ==Float.parseFloat(T3.getText())) { T4.setText("恭喜你,答對了"); t=t+1; sum=sum+20;//每答對一題加20分 } else { T4.setText("抱歉,你答錯了"); f=f+1; } } } });
在源代碼的第四行即if()后面一個布爾變量
boolean flag = false;與try,在12行后面加catch語句以及判斷語句
catch(Exception g)
{
flag=true;
}
if(flag)
{
JOptionPane.showMessageDialog(null,"輸入結果不能為字符,請輸入數字!");
}
運行結果:
2、輸入的題目個數為負數時,系統沒給出提示
源代碼8:
Object bj = e.getSource(); // 獲得事件源 if (bj == B3) { try{ //如果輸入字符,拋出異常,提示錯誤 count = Integer.parseInt(T1.getText()); //將文本中獲取的字符串轉換為整型 } catch(Exception f) { flag=true; } if(flag) { JOptionPane.showMessageDialog(null,"輸入有誤,請輸入數字!"); } if(count>5) { JOptionPane.showMessageDialog(null, "題目個數不能超過五個!請重新輸入。"); }
解決辦法:
在上面的源代碼8的第13行加一個if()判斷語句,
if(count<0)
{
JOptionPane.showMessageDialog(null,"不能輸入負數,請輸入整型!");
}
運行結果:
五、出現的程序問題及解決:
寫完測試代碼后沒有刪掉fail(”尚未實現”)語句,所以使得測試出來的結果均為錯誤;因此詞句一定要刪;
寫完核心代碼與測試代碼后進行測試,測試結果有問題,經檢查,所定義的函數得要是靜態類型,并要由一個返回類型
標注@Test不能刪掉
AssertEquals()支持boolean,long,int等類型變量
六、心得總結
分工很重要,分工分好了,可以大大提高效率并可以學到許多東西,并且在合作當中要多與合作伙伴交流,討論,這樣才能共同進步,才能學到知識。
文章列表