軟件質量與測試 第4周個人作業
一、項目地址
https://github.com/changjiang666/WcPro
二、PSP
三、設計思路
我負責main函數的編寫和print輸出模塊的編寫。
1.main函數
int main(/*int argc, char **argv*/) { char *textBuf = readfile("test.txt"); // 讀取輸入文件 WcPro wcpro(textBuf);// 將輸入文件放入緩沖區 wcpro.processText();// 分析文本,各種統計功能的實現 wcpro.print();// 打印輸出統計結果 return0; }
main函數由於是高度封裝的函數的集合,因此特別簡短,邏輯十分清晰。readfile函數由楊松(17166)同學編寫,WcPro類以及wcpro函數,還有processText函數都由組長劉長江(17167)編寫和實現,我(17171)負責了print函數的實現,將這些排列起來就構成了完整的main函數,整個程序的功能就在這些函數中實現。
2.print函數
void WcPro::print() { freopen("result.txt", "w", stdout);// 輸出重定向到result.txt文件 for(int i = 0; i != this->word_count_vec.size() && i < OUTPUT_SIZE; ++i) cout << word_count_vec[i].first << " " << word_count_vec[i].second << endl; }
print函數遍歷分析的結果數據,再逐一打印輸出,將輸出流重定向到result.txt。
四、測試設計過程
由於main函數已被高度封裝,因此程序主要是對自定義函數模塊的測試。對於print函數,它所完成任務的關鍵步驟是實現輸出的重定向——即將本應打印在控制臺的輸出流打印到result.txt文件中。因此測試這一函數的思路應該是比較正常的cmd窗口輸出和重定向後result.txt文件內容是否一致。
為了還原成原先的cmd控制臺輸出,修改print函數,註釋其重定向語句:
void WcPro::print() { //freopen("result.txt", "w", stdout); for(int i = 0; i != this->word_count_vec.size() && i < OUTPUT_SIZE; ++i) cout << word_count_vec[i].first << " " << word_count_vec[i].second << endl; }
再次編譯產生用於比較的WcProCMD.exe。
除了要比較窗口輸出和文件輸出是否一致外,還要比較對於各種字符,包括各種不常見字符,函數是否能正確輸出。因此測試用例主要針對輸入文本,改變其中會被統計的單詞,要能覆蓋所有需求中提到的字符。
測試用例舉例: 1.文本中全部是常見字符;
2.文本中全部是常見字符和非常見字符;
3.文本中是常見字符和少量英文字母;
4.文本中全部是數字;
5.文本中是數字和少量英文字母;
6.文本中包含Let‘s和Let‘‘s;
······
五、測試運行和評價
對比CMD輸出和result.txt輸出,完全一致:
並且向已有的result.txt寫入新結果時,之前的舊數據會被覆蓋,符合使用場景。
評價:采用黑盒測試的方法,但由於print函數沒有判定節點和分支,所以也能達到白盒測試的要求。
五、擴展任務
通過閱讀《C++ Primer》,並且和組內同學交流,了解了一些代碼規範,大有收獲:
* 縮進:4空格
* 行寬:100字符
* 括號:表明邏輯優先級
* 斷行與空白{}行:程序模塊{}分割,{}各占單行
* 分行:一句一行,變量定義各自成行
* 命名:“匈牙利命名法”,從命名中可以直接理解該命名的含義
* 下劃線:作用域_名稱
* 書寫:所有的類型/類/函數名都用Pascal形式,所有的變量都用Camel形式。
*類/類型/變量:名詞或組合名詞,如Member、ProductInfo等。
*函數則用動詞或動賓組合詞來表示,如get/set; RenderPage()。
* 註釋:註釋代碼都采用ASCII碼,不要使用中文等,提高可移植性
註明做什麽,為什麽,不需要解釋怎麽做
程序開頭註明變量含義
設置字體風格
采用了Visual Studio自帶的cppcheck靜態測試工具對詞頻計數模塊進行了代碼的靜態測試:
問題1:(style) Class ‘WcPro‘ has a constructor with 1 argument that is not explicit.
風格警告 :風格有關問題的代碼清理(未使用的函數、冗余代碼、常量性等等)
該問題是說構造函數參數不明確。這是代碼中構造函數沒有設置默認輸入所導致的,在參數列表加入默認值即可。
問題2:(information) Cppcheck cannot find all the include files (use --check-config for details)
信息消息 :配置問題,建議在配置期間僅啟用這些。
該問題表示沒有找到所有的include文件。經小組討論認為是cppcheck自己的配置問題。
整體小組代碼質量比較滿意,雖然只有三人但我們明確分工,積極學習,最後也能完成其他四人組的工作。
六、高級任務
最後組長(17167)把3個人的代碼做了集成,拿5M的英語名著做了性能測試,包括I/O時間,總共花了不到3s。 周末全組做了評審,組長講了代碼的主幹,我們對一些可能出錯的部分提出了質疑, 組長針對我們的疑問做了解釋。組長對代碼的規範性提前做了要求,比如變量的命名,函數書寫的格式,函數名的規範, 最後大家的代碼格式基本一致,就像是一個人寫的,說明了磨刀不誤砍柴工。
這次小組作業讓我覺得團隊合作的重要性,學會怎麽凝聚大家的力量。還有代碼開發與軟件測試並行,確保每一個模塊沒有錯誤的時候再往下面進行。在寫代碼的時候,一定要多註釋,這樣不管自己維護還是別人閱讀,都會減少不少麻煩。
根據組內協商,我個人的小組貢獻為30%。
軟件質量與測試 第4周個人作業