https://github.com/handsomesnail/WordCountProgit
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行行,函數簡短,符合規範要求,且將功能細分爲兩個不一樣函數,簡單易懂,符合開發規範。函數
小組代碼大多代碼規範良好,可是項目總體註釋內容偏少,須要花費較多精力才能明白某一函數的功能以及某些語句的做用,模塊劃分不夠細緻。工具
小組成員認爲統計大文件能夠有效測試性能,使用較大的文件對源程序進行壓力測試,對程序的主要性能指標(即處理時長,以毫秒計算)進行測試和記錄(debug測試框架下)。
測試結果爲:4878ms
組內全部成員展開同行評審,通過討論,認爲制約程序性能的因素主要在覈心模塊對單詞存儲的數據結構以及排序算法上。
在覈心模塊中主要因素爲當前選擇的set和map容器,其內部數據結構爲紅黑樹不夠高效,次要因素則是是頻繁調用的函數應當設爲內聯函數。
小組成員將記錄分隔符表以及單詞表的set和map容器替換爲unordered_map和unordered_set,內部爲哈希表。並將有關函數改成內聯函數。
同等條件下,優化後測試結果爲:3857ms。
沒有軟件開發就沒有測試,軟件開發提供了軟件測試的服務對象。開發和測試都是軟件生命週期中的重要組成部分,是軟件過程當中的重要活動。而軟件測試則是保證軟件質量的重要手段,熟練運用各類測試方法,進行測試和優化,軟件項目的質量便能到保障並獲得必定的提高。