個人專案----詞頻統計----單元測試

YangXiaomoo發表於2016-10-14

經歷了很多磨難算終於整出來一個成功的測試用例了,廢話不多說。

我用java編寫詞頻統計,所以使用了junit4。本次學習單元測試是對已有的程式編寫測試用例,原有的程式方法如下。

 1 public ArrayList<Map.Entry<String,Integer>> SortMap(Map<String,Integer> oldmap){  
 2         
 3            ArrayList<Map.Entry<String,Integer>> list = new ArrayList<Map.Entry<String,Integer>>(oldmap.entrySet());  
 4              
 5            Collections.sort(list,new Comparator<Map.Entry<String,Integer>>(){  //降序  
 6                @Override  
 7                public int compare(Entry<String, Integer> o1, Entry<String, Integer> o2) {  
 8                    return o2.getValue().compareTo(o1.getValue());  
 9                }  
10            }); 
11            
12            return list;
13        }

 

部分測試用例程式碼

編寫一個亂序的Map,將其輸入進SortMap方法,Integer表示詞頻,本應該是亂序,但為了簡便給每個String搭配了一個遞增的數字。

1         Map<String,Integer> testmap = new TreeMap<String,Integer>();
2         String[] wordlist = {"English","is","very","useful"};
3         
4         for(int i = 0;i < 4;i++){
5             testmap.put(wordlist[i], i);
6         }

把建立的Map放入ArrayList中,這裡要特殊說明一下,Map存入<String,Integer>的搭配時並不像list那樣順序儲存。所以對儲存後的list進行了排序。這就得到在單元測試裡我所期待的結果。

 1         ArrayList<Map.Entry<String,Integer>> list = new ArrayList<Map.Entry<String,Integer>>(testmap.entrySet());
 2         for(int i=0;i<list.size();i++){
 3             for(int j=i+1;j<list.size();j++){
 4                 if(list.get(i).getValue()<list.get(j).getValue()){
 5                     Map.Entry<String,Integer> swap = list.get(i);
 6                     list.set(i, list.get(j));
 7                     list.set(j, swap);
 8                 }
 9             }
10         }

最後對把期望值和實際值進行對比。

 1 assertEquals(list,wc.SortMap(testmap)); 

 結果顯示

使用單元測試感受

剛開始在找單元測試的資料時,一直不瞭解這是個什麼東西,能幹什麼用,可是在有了一定的瞭解之後發現單元測試是一個測試,程式設計師需要用它來對程式碼進行測試。於是,很自然就會想到,幹嘛非得要用這個東西做什麼測試呢。但在接下來的學習過程中就推翻了我之前的想法,並使我能理解和感受到單元測試所帶來的好處。

由於我在編寫好程式後使用juint4測試的,所以這個過程是與實際開發的過程相反的。所以出現了原有程式能跑,但測試用例卻跑不了的情況。這樣的現象帶給了我兩點好處。第一:我明白了在以後的程式設計過程中可以使用單元測試這個工具,先把目標設定好,再去編寫程式,這樣能夠很方便檢測到問題的來源,更直接的清楚我所編寫的程式碼能不能實現所要求的功能,例如這次編寫的測試用例,雖然測試程式碼比原方法還要長,但這個過程卻保證了我編寫了一個有效而且高效的方法。也就是在未完成方法,但明確功能的情況下,通過這個方法能夠清晰的知道自己的完成進度。在編寫一些複雜的方法時,利用這個工具一定能夠事半功倍。第二:我明白了Map在儲存<String,Integer>對的時候是亂序儲存的。在第一次編寫測試用例時,只是將Map中的<String,Integer>簡單的存入ArrayList中,結果測試用例沒有通過。在弄懂Map的儲存機制是將<String,Integer>儲存成一個entry物件後,將ArrayList的entry物件一value值進行排序,得到測試用例想要的期望的降序ArrayList。

單元測試PSP

日期 型別 任務 開始時間 結束時間 被打斷時間 計劃(min) 實際(min)
2016.10.12 文獻學習 查詢資料、學習 22:15 23:09 4 30 50
2016.10.13 編碼學習 編寫測試用例 14:02 15:41 5 40 94
編寫測試用例,修改錯誤 21:19 22:50 12 30 79
總結 寫部落格 23:24 23:55 7 20 14
2016.10.14 總結 接著寫部落格 09:53 10:42 2 20 49

HPPT:https://git.coding.net/YangXiaomoo/wordCountNO.1.git

SSH:git@git.coding.net:YangXiaomoo/wordCountNO.1.git

GIT:git://git.coding.net/YangXiaomoo/wordCountNO.1.git

 

 最後感謝此博主對junit的詳細講解

http://blog.csdn.net/chenleixing/article/details/44260359

 

相關文章