這個過程是在程式設計完成之後對程式進行的一系列檢查,其中validation是在使用者的角度,從産品的外部進行檢查,系統是否可靠,是否對使用者有價值。而verification是從産品的内部檢查其内部的結構是否輸出正确預想的值。前者的對象是stakeholder而後面的對象是designer。
我們進行V&V過程的目的是為了減少defect,之前有講過fault和failure的概念,這裡defect就是這兩者的總稱。在開發過程中越是在靠後的過程檢查defect所需要花費的成本就會越高。這裡給出fault和failure的概念:
fault——The feature of software that causes a failure
failure——An execution event where the software behaves in an unexpected way
defect和這兩者的關系是一個泛化的關系。
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAzNfRHLGZkRGZkRfJ3bs92YsYTMfVmepNHL90zdOlXRU1UMrRUYqB3MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnLykjNyUDNyQDM0ATNwAjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
V&V技術主要包括兩類,一類是靜态,這一類不需要運作,僅僅是對代碼的分析和糾錯,按我的了解來講應該算是文法編譯一類的技術;另一類就是動态,這一類需要運作程式,通過程式運作的結果來檢查程式的可用性,即為testing。其一般是需要excecutable unit或者system,然後寫一些test case輸入然後觀察輸出結果是否有不同。test的流程主要分為三個階段:write tests->run test->record results。
這三個階段中最重要的步驟就是write test了,這個階段需要閱讀需求檔案和設計檔案并且寫出各種情況下的test case。這個檔案中需要表明的東西有test case的事件名,輸入,以及期望對應的輸出。一系列的test case就組成了test suite,然後運作的結果記錄到一個log中。
運作test case拆開,其過程如下所示:
其中值得注意的是Oracle這個階段,這個玩意一般來說是一幫測試員。他們計算出的結果和運作test case的結果相對比,最後得出測試結果。
一般而言在開發過程中流程整個研發過程有以下三種情況:
scenario1:
開發組把所有的事給做了,這樣做比較适合比較小的團隊。
scenario2:
從開發組中分離出一個專業的測試組,專門寫test case對系統進行測試,然後進行開發-測試過程疊代,這也是開發中用得最多的一種模式。
scenario3:
這種情況是用多個測試組來進行多次測試疊代
在測試過程中test case的編寫是一個很重要的步驟。如果将所有的test case都一一列出來這也是一種方法,成為exhaustive test但是這個方法并不實用,因為有些東西實在是有太多情況需要考慮了,而且那麼多情況運作所需要的時間也很長,是以需要找到一些比較關鍵系統中的點來進行測試。判斷test case的關鍵原則是其reliability和validity。
Valid Criterion: C is valid if and only if whenever P is incorrect C selects at least one test set T which is not successful for P
Reliable Criterion: C is reliable if and only if either every test selected by C is successful or no test selected is successful.
testing也可以分為好幾個層級:Unit tests,Integration tests,System tests
對于最底層的unit test一般測試方法有兩種:黑盒測試 (外部輸入和輸出的關系)和白盒測試(關心Unit内部的結構問題)
對于黑盒測試而言選取test case的方法有:
- 随機選取
-
Equivalence class partitioning
step1:define a critiria(這個條件是和定義分組相關的)
step2:define predicates for each critiria(在這些條件下的滿足條件和不滿足條件,以及各種不同情況的區間判斷條件,這個定義得可以很詳細,取決于測試員自己)
step3:write test cases(盡量每一個predicates都寫一個test case)
- Boundary conditions