WordCountPro

基本任務:代碼編寫+單元測試

GitHub項目地址

https://github.com/handsomesnail/WordCountProgit

PSP表格

PSP PSP階段 預估耗時(分鐘) 實際耗時(分鐘)
Planning 計劃 30 30
·Estimate 估計這個任務須要多少時間 30 30
Development 開發 250 270
·Analysis 需求分析 (包括學習新技術) 30 20
·Design Spec 生成設計文檔 20 20
·Design Review 設計複審 (和同事審覈設計文檔) 20 10
·Coding Standard 代碼規範 (爲目前的開發制定合適的規範) 10 10
·Design 具體設計 30 30
·Coding 具體編碼 60 70
·Code Review 代碼複審 20 30
·Test 測試(自我測試,修改代碼,提交修改) 60 80
Reporting 報告 70 80
·Test Report 測試報告 30 40
·Size Measurement 計算工做量 10 10
·Postmortem & Process Improvement Plan 過後總結, 並提出過程改進計劃 30 30
合計 350 380

接口設計

主要負責了處理圖形界面和判斷模塊github

  • bool IsSplitSymbol(char c):
    返回當前字符是否爲分隔符算法

  • OpenAFile()
    圖形界面數組

//返回是不是分隔符
inline bool IsSplitSymbol(char c) {
    return splitSymbolsSet.find(c) != splitSymbolsSet.end();
}

string OpenAFile() {
    OPENFILENAME ofn;
    TCHAR szFile[MAX_PATH];
    ZeroMemory(&ofn, sizeof(OPENFILENAME));
    ofn.lStructSize = sizeof(OPENFILENAME);
    ofn.hwndOwner = NULL;
    ofn.lpstrFile = szFile;
    ofn.lpstrFile[0] = '\0';
    ofn.nMaxFile = sizeof(szFile);
    ofn.lpstrFilter = _T("Txt(*.txt)\0*.txt\0\0");
    ofn.nFilterIndex = 1;
    ofn.lpstrFileTitle = NULL;
    ofn.nMaxFileTitle = 0;
    ofn.lpstrInitialDir = NULL;
    ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
    // 顯示打開選擇文件對話框。
    if (GetOpenFileName(&ofn)) {
        //路徑轉化爲string
        int iLen = WideCharToMultiByte(CP_ACP, 0, szFile, -1, NULL, 0, NULL, NULL);
        char* chRtn = new char[iLen * sizeof(char)];
        WideCharToMultiByte(CP_ACP, 0, szFile, -1, chRtn, iLen, NULL, NULL);
        string str(chRtn);
        delete[] chRtn;
        return str;
    }
    else {
        return "";
    }
}

測試用例設計

Test Case ID 測試用例編號 Test Item 測試項(即功能模塊或函數) Test Case Title 測試用例標題 Test Criticality重要級別實際耗時(分鐘) Pre-condition預置條件 Input 輸入 Procedure 操做步驟 Output 預期結果 Result實際結果 Status是否經過計劃 Remark 備註(在此描述使用的測試方法)
3_1 OpenAFile 圖形界面測試 H 正確打開圖形界面 成功打開圖形界面 黑盒測試
3_2 IsSplitSymbol 判斷分隔符 M c T T 白盒測試
3_3 IsSplitSymbol 判斷分隔符 M c T T 白盒測試
3_4 IsSplitSymbol 判斷分隔符 M c T T 白盒測試
3_5 IsSplitSymbol 判斷分隔符 M c T T 白盒測試
3_6 IsSplitSymbol 判斷分隔符 M c T T 白盒測試
3_7 IsSplitSymbol 判斷分隔符 M c T T 白盒測試
3_8 IsSplitSymbol 判斷分隔符 M c T T 白盒測試
3_9 IsSplitSymbol 判斷分隔符 M c T T 白盒測試
3_10 IsSplitSymbol 判斷分隔符 M c T T 白盒測試
3_11 IsSplitSymbol 判斷分隔符 M c T T 白盒測試
3_12 IsSplitSymbol 判斷分隔符 M c T T 白盒測試
3_13 IsSplitSymbol 判斷分隔符 M c T T 白盒測試
3_14 IsSplitSymbol 判斷分隔符 M c T T 白盒測試
3_15 IsSplitSymbol 判斷分隔符 M c T T 白盒測試
3_16 IsSplitSymbol 判斷分隔符 M c T T 白盒測試
3_17 IsSplitSymbol 判斷分隔符 M c T T 白盒測試
3_18 IsSplitSymbol 判斷分隔符 M c T T 白盒測試
3_19 IsSplitSymbol 判斷分隔符 M c T T 白盒測試
3_20 IsSplitSymbol 判斷分隔符 M c T T 白盒測試

設計思路
基於兩個大模塊,對於圖形界面模塊和分隔符判斷模塊可否正確運行進行設計性能優化

質量評測

設計的測試用例均經過了測試,且測試用例運行時間短,效率符合要求。測試用例覆蓋了可能出現的輸入狀況,並覆蓋了該模塊的全部分支,單元測試結果符合預期。數據結構

小組貢獻率

通過小組內部討論,貢獻率約爲0.3框架

擴展任務:靜態測試

開發規範

選用了Google的《C++風格指南》中的規範:「果函數超過 40 行, 能夠思索一下能不能在不影響程序結構的前提下對其進行分割。」在編寫函數時要考慮到函數體的長度,若是該函數要實現複雜的功能,可能會形成函數過長,這樣會使得代碼難以閱讀。ide

代碼分析

根據規範分析組員中學號爲17095的提交代碼,該同窗負責的模塊函數體長度約30行行,函數簡短,符合規範要求,且將功能細分爲兩個不一樣函數,簡單易懂,符合開發規範。函數

靜態代碼工具:

  • 掃描工具:Cppcheck
  • 下載地址:http://cppcheck.net/
  • 掃描結果:
  • 結果分析:掃描發現源文件WordCountPro.cpp中第117行處的指針chRtn釋放內存不匹配致使了內存泄漏, chRtn爲字符數組, 改用使用delete[] chRtn;釋放其內存,替換原代碼中的delete chRtn;

組內評價

小組代碼大多代碼規範良好,可是項目總體註釋內容偏少,須要花費較多精力才能明白某一函數的功能以及某些語句的做用,模塊劃分不夠細緻。工具

高級任務:性能測試和優化

壓力測試

小組成員認爲統計大文件能夠有效測試性能,使用較大的文件對源程序進行壓力測試,對程序的主要性能指標(即處理時長,以毫秒計算)進行測試和記錄(debug測試框架下)。
測試結果爲:4878ms

同行評審

組內全部成員展開同行評審,通過討論,認爲制約程序性能的因素主要在覈心模塊對單詞存儲的數據結構以及排序算法上。
在覈心模塊中主要因素爲當前選擇的set和map容器,其內部數據結構爲紅黑樹不夠高效,次要因素則是是頻繁調用的函數應當設爲內聯函數。

性能優化

小組成員將記錄分隔符表以及單詞表的set和map容器替換爲unordered_map和unordered_set,內部爲哈希表。並將有關函數改成內聯函數。
同等條件下,優化後測試結果爲:3857ms。

做業小結

沒有軟件開發就沒有測試,軟件開發提供了軟件測試的服務對象。開發和測試都是軟件生命週期中的重要組成部分,是軟件過程當中的重要活動。而軟件測試則是保證軟件質量的重要手段,熟練運用各類測試方法,進行測試和優化,軟件項目的質量便能到保障並獲得必定的提高。

相關文章
相關標籤/搜索