關于測試覆蓋率,我個人的感覺是說的多,用的少。最近在網絡上看到一篇文章,討論一個問題“測試需要100%的覆蓋率嗎?”被轉載了很多次,有興趣的同行可以找來看看。的確,一想到測試覆蓋率,立馬就有完美主義者跳出來說100%。100%的測試覆蓋率有什么好處呢?
1、100%的覆蓋率表示我們的測試覆蓋到了所有語句,分支,條件
2、100%的覆蓋率表示我們測試考慮的很完全,我們可以回去睡大覺了~~
測試仿佛在這里變得不那么可怖了,但是我們至少遺漏了兩個重要的地方:怎么達到100%的測試覆蓋率或者說是否能夠達到100%的測試覆蓋率,另外一個就是100%的測試覆蓋率到底能告訴我們什么信息。
首先來講,我們是否可以達到100%的測試覆蓋率?如果我們簡單的將測試覆蓋率理解為需求覆蓋率,代碼覆蓋率,那么我想這是可以達到的,只要擁有足夠的時間,我們的測試覆蓋到每一個需求點,我們的測試覆蓋到每一條語句,每一個條件,每一個分支,看起來的確沒有問題。但是我們還要考慮另外一個問題,是否由我們未曾列入到需求分析中的需求呢,這種情況是存在的,如果我們計算需求覆蓋率是根據Feature Spec來的(實際上如果我們需要計算的話,一般就是這樣計算得來的),那么當我們有需求沒有被寫入Feature Spec并且我們也沒有在測試中考慮相關的測試,那么我們實際的“需求覆蓋率”就不是100%了。在實際開發過程中,是不可能在Feature Spec中將需求全部列出來的,所以我們得到的100%的需求覆蓋率是存在水分的。
另外,對于一個應用程序(除了一些極其簡單的程序)來講,要覆蓋到所有的語句。條件,分支是極其困難的,甚至可以說是不可能的。筆者在經歷的一個項目中花了一整天寫一個模塊的單元測試,當我忙完一天并運行了所有的用例之后,我發現我的代碼覆蓋率僅僅增加了2%,而且是從35%到37%,不要說100%,連80%我當時都覺得是奢望。
對于第二個問題,100%的測試覆蓋率能代表什么?我在上面講到,100%的測試覆蓋率表示覆蓋到了所有的語句,分支和條件,但是這又說明什么呢?這是否說明了我們做到了完全測試一個軟件呢?很抱歉,答案是否定的。給出下面這一段代碼:
private int add(int a,int b)
{
return a+b;
}
夠簡單的一段代碼了吧,我們可以很輕松的達到100%的覆蓋率,比如我們使用用例 add(3,4)就可以覆蓋所有的語句,分支,條件(當然這里面是不存在分支和條件的,所以只需要覆蓋語句就可以達到代碼覆蓋率100%了),但是聰明的你一定會發現我們的測試遠遠不夠:如果輸入的是add(2147483647,2),這個應用程序是會出現問題的,如果我們僅僅滿足于100%的代碼覆蓋率,是不能保證我們的軟件的質量的。
文章來源于領測軟件測試網 http://www.kjueaiud.com/