通過兩種手段結合來保證代碼的正確性,Program Proofs和Testing。
1.Program Proofs
說白了就是代碼注釋。C#中函數的注釋分為三部分<summary><param><returns>。好的注釋需要指明調用函數的pre-condition,post-condition並且assert函數輸出是正確的。例如判斷素數的函數IsPrime(int n)。它的注釋應該這樣寫:<summary>Determine whether the input value is prime</summary><param>n is greater than or equal to 2</param><returns>true if n is prime, false otherwise</returns>
2.Testing
對於一個函數,至少確保每一行都運行一次。還需要測試的內容有:Right-BICEP Right-正確(結果是否正確?)通過一系列輸入資料測試,測試資料可以放在資料檔案中。測試資料應該包括BICEP。 Boundary-邊界條件(邊界條件都正確嗎?) Inverse-反向關聯(能測試反向關聯嗎?)通過反向邏輯來驗證結果。例如檢查某條記錄是否成功插入了資料庫,可通過查詢這條記錄來驗證。 Cross-交叉檢查(能交叉檢查結果嗎?)可以用實現相同功能的其他函數來交叉檢測當前結果。 Exception-錯誤條件(能強制錯誤條件發生嗎?)測試可能的無效參數和環境因素。如果參數非法會發生什嗎?網線斷了?印表機出錯?斷電了?磁碟用滿?... Performance-效能(是否滿足效能要求?)系統使用者數量?10個使用者系統回應時間?100個使用者?1000個使用者?使用者能接受的回應時間?(在user requirement的quality of service中描述)
3.Boundary測試 需要測試的邊界條件有:CORRECT C-Conformance 輸入資料一致性。例如期望使用者名稱是email@前的地址,如果沒有@標誌代碼該怎麼處理?是否拋出一個異常? O-Ordering 順序性。例如一個定餐系統,如果菜單反序輸入呢?如果隨機輸入呢? R-Range 區間性。如果輸入一個索引是負數?索引的問題都需要測試-開始的索引等於結束的索引?開始的索引小於結束的索引?索引是負數?索引大於允許的值?... R-Referrence 引用。在一個函數中引用其他函數,需要滿足引用函數的pre-condition。如果在pre-condition不能滿足時,確保程式的行為時正確的。 E-Existence 存在性。考慮如果輸入的資料是null?0?Null 字元串? C-Counting 基數性。遵循“0-1-N"原則。例如報表顯示top 10記錄,如果是0條記錄系統的行為?1條記錄呢?10條記錄呢? T-Time 時間性。相對時間:網路訪問逾時了該怎麼辦?絕對時間:不同的client間時間同步嗎?(避免這樣的笑話,汽車經過兩個收費站,從兩張發票的時間上看,車速竟超過了1000KM/H)並發訪問問題?
4.無效參數在哪控制? 遵循"別讓野蠻人進門”的原則。軟體系統中任何面向外部的部分,例如UI和系統介面,負責檢查輸入資料的有效性,都要進行無效資料處理。這樣就保證了系統各層次間資料一致,也避免了重複資料偵測資料。