WordCount開發與測試
(1)GitHub項目地址
https://github.com/AnotherLZ/SoftwareTesting/tree/master
(2)PSP表格
PSP2.1 | PSP階段 | 預估耗時(分鐘) | 實際耗時(分鐘) |
---|---|---|---|
Planing | 計劃 | 30 | 30 |
·Estimate | ·估計這個任務需要多少時間 | 30 | 30 |
Development | 開發 | 600 | 850 |
·Analysis | ·需求分析(包括學習新技術) | 40 | 60 |
·Design Spec | ·生成設計文檔 | 20 | 20 |
· Design Review | 設計復審 (和同事審核設計文檔 | 15 | 15 |
· Coding Standard | ·代碼規範 (為目前的開發制定合適的規範) | 15 | 15 |
·Design | ·具體設計 | 30 | 30 |
·Coding | ·具體編碼 | 300 | 500 |
·Code Review | ·代碼復審 | 60 | 60 |
·Test | ·測試(自我測試,修改代碼,提交修改) | 120 | 150 |
Reporting | 報告 | 150 | 210 |
·Test Report | ·測試報告 | 60 | 120 |
·Size Measurement | · 計算工作量 | 30 | 30 |
· Postmortem & Process Improvement Plan | · 事後總結, 並提出過程改進計劃 | 60 | 60 |
合計 | 780 | 1090 |
(3)解題思路
這次的題目分為基礎功能、拓展功能和高級功能幾部分。對題目進行簡略的分析後,我覺得可以先著手解決基礎功能,後面兩部分的要求可以在此基礎上繼續進行實現。基礎功能要求對一個文件進行字符統計,單詞統計和行數統計,以及將結果輸出到指定目錄。這實現起來其實並不難,用BufferedReader這個類讀文件,然後逐個字符進行分析就可以了。
對於拓展功能,要在前面的基礎上加上遞歸處理目錄文件、統計單詞時忽略指定stopList.txt中的單詞進行計數和對行進行分類——代碼行/空行/註釋行這樣的處理。忽略停用詞表這個只要在前面的基礎上,先獲取 停用詞,再統計單詞,統計過程中有屬於停用詞的單詞不計數。行分類只要逐行進行分析即可。但是對於遞歸處理文件這個功能,我編碼調試了很久,仍然是有bug。跟同學討論後發現其實我的思路也是正確的,可能在實現的編碼方式上有問題,總是拋出NullPointerException這類的錯誤。調試了許久之後我,,,,放棄了這一個功能的實現,可能是前面的功能實現代碼太亂了,我自己也不懂怎麽整理了.......
最後,高級功能,因為時間和精力還有能力等各方面原因,也沒有實現。
(4)程序設計實現過程
主要是對統計字符、統計單詞、統計行數這三個功能的實現,分別對應characterCount()、wordCount()和lineCount()函數。其余的對此加以調用或修改即可。
(5)代碼說明
基礎功能中統計字符的函數countCharacte():
public int countCharacter(String fileName){ //統計字符數); File file=new File(fileName); if(!file.exists()){ return 0; } int count=0; InputStream inputStream=null; try{ inputStream=new FileInputStream(file); int temp=0; while((temp=inputStream.read())!=-1){ if(temp!=13 && temp!=10) //把回車和換行符排除掉 count++; } inputStream.close(); }catch(IOException e){ e.printStackTrace(); } characterCount=count; //System.out.println(fileName+",字符數:"+characterCount); writeC(fileName, resultFile); return characterCount; }
統計單詞的函數wordCount():
public int countWord(String fileName){ //統計單詞數
File file=new File(fileName);
if(!file.exists()){
return 0;
}
int count=0;
BufferedReader reader=null;
try{
reader=new BufferedReader(new FileReader(file));
int pre=10;
int temp=0;
while((temp=reader.read())!=-1){
if(temp==44 || temp==32 || temp==10 || temp==13){ //如果遇到空格或者逗號
if(pre!=10 && pre!=13 && pre!=44 && pre!=32){ //判斷前一個字符是不是空格、回車、換行、逗號
count++;
}
}
pre=temp;
}
}catch(IOException e){
e.printStackTrace();
}
wordCount=count;
System.out.println(fileName+",單詞數:"+wordCount);
writeW(fileName, resultFile);
return wordCount;
}
統計行數的函數lineCount():
public int countLine(String fileName){ //統計行數
File file=new File(fileName);
if(!file.exists()){
return 0;
}
int count=0;
BufferedReader reader=null;
try{
reader=new BufferedReader(new FileReader(file));
while(reader.readLine()!=null){
count++;
}
reader.close();
}catch(IOException e){
e.printStackTrace();
}
lineCount=count;
//System.out.println(fileName+",行數:"+lineCount);
writeL(fileName, resultFile);
return lineCount;
}
主流程處理函數,傳入的參數commanList是來自命令行的參數
public void doWork(ArrayList<String> commandList){
if(commandList.contains("-s")){ //這個是遞歸處理文件。。。。。還沒寫好
commandList.remove("-s");
sFlag=true;
}
if(commandList.contains("-e")){ //如果包含-e,獲取停用詞表
eFlag=true;
int index=commandList.indexOf("-e");
stopList=commandList.get(index+1);
commandList.remove(index); //刪除 -e
commandList.remove(index); //刪除 stoplist.txt
}
if(commandList.contains("-o")){ //包含-o則指定輸出文件
oFlag=true;
int index=commandList.indexOf("-o");
output=commandList.get(index+1);
commandList.remove(index);
commandList.remove(index);
}
if(commandList.size()==0){
System.err.println("errer");
System.exit(0);
}
if( batchFlag )
file_name=commandList.get(commandList.size()-1); //如果不是批量處理就獲取文件名
if(sFlag && batchFlag){ //如果要進行批量處理
batchFlag=false;
batchProcessing(file_name, "", commandList);
}
else{
if(commandList.contains("-c")){ //統計字符並寫到result.txt
cFlag=true;
countCharacter(file_name);
}
if(commandList.contains("-w")){ //統計單詞數
wFlag=true;
//System.out.println("wwwwww");
countWord(file_name);
}
if(eFlag){ //忽略停用表統計單詞
countWordWithS(file_name, stopList);
}
if(commandList.contains("-l")){ //統計行數
lFlag=true;
countLine(file_name);
}
if(commandList.contains("-a")){ //行分三類
aFlag=true;
differentLine(file_name);
putLine(resultFile);
}
if(oFlag){ //如果指定了輸出文件
if(cFlag)
writeC(file_name, output);
if(wFlag || eFlag)
writeW(file_name, output);
if(lFlag)
writeL(file_name, output);
if(aFlag)
putLine(output);
//writeFile(file_name, output);
}
}
}
其余詳細完整的代碼可前往GitHub查看
(6)測試設計流程
測試用例如下:
用例 | 說明 | 路徑 |
---|---|---|
wc.exe -c file.c | 統計file.c中的字符數 | 1-2-4-6 |
wc.exe -c -w -l file.c | 同時統計file.c中的字符數、單詞數和行數 | 1-2-4-6 |
wc.exe -w -l file.c -o outputFile.txt | 統計file.c中的單詞數和行數,並將結果輸出到outputFile.txt中 | 1-2-5-6 |
wc.exe -a file.c -e stopList.txt -o outputFile.txt | 統計file.c中的代碼行/空行/註釋行,統計file.c中除stopList.txt中的單詞外的單詞數,最後將結果輸出到outputFile.c中 | 1-3-5-6 |
wc.exe -s -w -c -l *.c -o outputFile.txt | 批量處理當前目錄及子目錄中所有的.c文件,並將結果輸出到outputFile.txt中 **此功能並未實現 | 1-2-5-7 |
(7)參考文獻
[1]http://www.cnblogs.com/math/p/se-tools-001.html
[2]https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000
WordCount開發與測試