成為一名合格的軟件工程師
2.1 單元測試
2.1.1 為什么要寫
團隊合作里晦炊,每個工程師都有自己負責(zé)的模塊出革,我們不希望調(diào)用別人的模塊出現(xiàn)問題乏沸,同理別人在使用我們開發(fā)的功能也不希望出現(xiàn)問題作瞄。那么某弦,要證明自己的模塊是正確而穩(wěn)定的途凫,就必須使用單元測試垢夹。
2.1.2 怎么寫
在最基本的功能參數(shù)上驗證程序的正確性
測試系統(tǒng)中最基本的功能點,測試api中的每一個方法及每一個參數(shù)维费。必須由最熟悉代碼人來寫
那么果元,最好由作者本人來寫。最好在模塊設(shè)計之初就寫好單元測試掩完。單元測試過后噪漾,機器狀態(tài)保持不變
如果每次運行單元測試,都會改變狀態(tài)且蓬,例如創(chuàng)建了臨時文件或者目錄或者改動了數(shù)據(jù)庫欣硼,就會產(chǎn)生很多麻煩。所以單元測試產(chǎn)生的變動最好還是能恢復(fù)原樣恶阴。這樣就可以隨時運行許多次單元測試了诈胜。單元測試要快
軟件中經(jīng)常有幾十個基本模塊要測試,每個模塊又會有要測試的方法冯事,一個類的測試最好能在幾秒鐘內(nèi)完成焦匈。如果軟件有獨立的層次,那么分成可以單獨測試的層次昵仅。例如數(shù)據(jù)庫層次缓熟,網(wǎng)絡(luò)通信層次,客戶邏輯層次摔笤,用戶界面層次够滑。這樣就可以在修改了某一層次的代碼時,只用測試某一層就行了吕世。單元測試應(yīng)該產(chǎn)生可重復(fù)一致的結(jié)果
這個很好理解彰触,因為如果測試完之后某個錯誤不可復(fù)現(xiàn),那測試沒啥意義了命辖。所以應(yīng)該避免使用隨機數(shù)况毅。不依賴別的測試分蓖,人為構(gòu)造結(jié)果
例如在請求網(wǎng)絡(luò)時,可以手動構(gòu)造數(shù)據(jù)尔许。覆蓋所有代碼路徑
不要嫌棄麻煩么鹤,應(yīng)該堅持覆蓋所有的可能。但有時覆蓋率100%也不一定全對母债。例如
if(a&b&c) {} else {}
當(dāng)你固定b和c為true時午磁,只測試a為true或false時尝抖,覆蓋率也是100%毡们,但是明顯沒有考慮所有的可能。集成自動測試框架
隨時隨地運行測試昧辽,及時發(fā)現(xiàn)錯誤衙熔。和產(chǎn)品代碼一起維護
如果改動了產(chǎn)品沒有相應(yīng)的修改測試,會越來越難維護搅荞。
2.1.3 回歸測試(Regression Test)
假如上一個版本中所有的單元測試都通過了红氯,在新版本中某個測試未通過,我們就說發(fā)生了“倒退”咕痛。所以是為了驗證新的代碼沒有破壞模塊的現(xiàn)有功能痢甘。
2.2 效能分析工具
Performance Tools 有兩種方法,抽樣(Sampling)和代碼注入(Instrumentation)茉贡。前者基于統(tǒng)計塞栅,不太準確但是不會影響原有程序的運行。后者注入代碼統(tǒng)計準確但是會影響原有程序的運行腔丧。
2.3 個人開發(fā)流程
一個工程師在接到任務(wù)時應(yīng)該細細考慮上述表中列出的每一項放椰。程序員不應(yīng)該僅僅是敲代碼。表中就是PSP2.1模型(Personal Software Process)愉粤。
2.4 實踐
2.4.1 做一份有實際意義的大作業(yè)
我們在課堂上布置的大作業(yè)類似于“成績管理系統(tǒng)”砾医、“圖書館管理系統(tǒng)”都是沒有實際意義的。因為實際中的任務(wù)都是有不斷變化的需求衣厘,而上述這兩個“系統(tǒng)”都是沒有變化的因素在里面如蚜,學(xué)生在完成這些任務(wù)時很容易把所有的功能都冗雜在一個類里面,下面介紹兩個非常重要的設(shè)計原則影暴。
單一職責(zé)原則(Single Responsibility Principle, SRP)
一個模塊應(yīng)該只有一個導(dǎo)致它變化的原因错邦,一個模塊應(yīng)該完全對某個功能負責(zé)。開放封閉原則(Open-Close Principle, OCP)
允許擴展(Open for extension):當(dāng)應(yīng)用的需求發(fā)生改變時坤检,可以對模塊進行擴展兴猩,從而改變模塊的功能。
不允許修改(Closed for modification):對模塊進行擴展時早歇,不必改變模塊本身倾芝。(這里好抽象讨勤,不太懂)
2.4.2 項目:WC
實現(xiàn)一個命令行工具,它能統(tǒng)計文本文件的字符數(shù)晨另、單詞數(shù)和行數(shù)潭千。程序處理用戶需求的模式為:
wc.exe [parameter][file_name]
擴展功能:
-s 遞歸處理目錄下符合條件的文件。
-a 返回高級選項(代碼行/空行/注釋行)
羅馬不是一天建成的借尿。同樣刨晴,一個功能完備的程序也不是一蹴而就的。因此路翻,要先完成把大任務(wù)劃分為可操作的小任務(wù)狈癞,安排任務(wù)的次序等工作。
總結(jié)
要成為一名合格的軟件工程師茂契,要認真對待這些不起眼的工作蝶桶,如單元測試、回歸測試掉冶、效能分析真竖,拿到任務(wù)后要按照任務(wù)清單來分解任務(wù)。永遠記住厌小,代碼實現(xiàn)部分只是開發(fā)軟件的一小部分恢共。
我們是在開發(fā)一個軟件,而不僅僅是在寫一段程序璧亚。