1. 程式人生 > >WordCount開發與測試

WordCount開發與測試

top 設計文檔 地址 erl 進行 exe c中 inter 統計

(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開發與測試