覆蓋率

覆蓋率

徠覆蓋率是度量測試完整性的一個手段,是測試有效性的一個度量。通過已執行代碼表示,用於可靠性、穩定性以及性能的評測。

測試覆蓋是對測試完全程度的評測。測試覆蓋是由測試需求和測試用例的覆蓋或已執行代碼的覆蓋表示的。建立在對測試結果的評估和對測試過程中確定的變更請求(缺陷)的分析的基礎上。

評測方法


測試覆蓋是對測試完全程度的評測。測試覆蓋是由測試需求和測試用例的覆蓋或已執行代碼的覆蓋表示的。
質量是對測試對象(系統或測試的應用程序)的可靠性、穩定性以及性能的評測。質量建立在對測試結果的評估和對測試過程中確定的變更請求(缺陷)的分析的基礎上。

覆蓋評測


兩種評測

覆蓋指標提供了"測試的完全程度如何"這一問題的答案,最常用的覆蓋評測是基於需求的測試覆蓋和基於代碼的測試覆蓋。簡而言之,測試覆蓋是就需求(基於需求的)或代碼的設計/實施標準(基於代碼的)而言的完全程度的任意評測,如用例的核實(基於需求的)或所有代碼行的執行(基於代碼的)。
系統的測試活動建立在至少一個測試覆蓋策略基礎上。覆蓋策略陳述測試的一般目的,指導測試用例的設計。覆蓋策略的陳述可以簡單到只說明核實所有性能。
如果需求已經完全分類,則基於需求的覆蓋策略可能足以生成測試完全程度的可計量評測。例如,如果已經確定了所有性能測試需求,則可以引用測試結果來得到評測,如已經核實了75%的性能測試需求。
如果應用基於代碼的覆蓋,則測試策略是根據測試已經執行的源代碼的多少來表示的。這種測試覆蓋策略類型對於安全至上的系統來說非常重要。

兩種評測方法

兩種評測都可以手工得到(公式如下所示)或通過測試自動化工具計算得到。
基於需求的測試覆蓋
基於需求的測試覆蓋在測試生命周期中要評測多次,並在測試生命周期的里程碑處提供測試覆蓋的標識(如已計劃的、已實施的、已執行的和成功的測試覆蓋)。
在執行測試活動中,使用兩個測試覆蓋評測,一個確定通過執行測試獲得的測試覆蓋,另一個確定成功的測試覆蓋(即執行時未出現失敗的測試,如沒有出現缺陷或意外結果的測試)。
基於代碼的測試覆蓋
基於代碼的測試覆蓋評測測試過程中已經執行的代碼的多少,與之相對的是要執行的剩餘代碼的多少。代碼覆蓋可以建立在控制流(語句、分支或路徑)或數據流的基礎上。控制流覆蓋的目的是測試代碼行、分支條件、代碼中的路徑或軟體控制流的其他元素。數據流覆蓋的目的是通過軟體操作測試數據狀態是否有效,例如,數據元素在使用之前是否已作定義。
覆蓋率等於覆蓋面積/總面積

覆蓋率準則


為了量測測試套件測試軟體的程度,會用一種或多種不同的覆蓋率準則。
基本的覆蓋率準則
以下列出一些基本的覆蓋率準則:
•函式覆蓋率(Function coverage):有呼叫到程式中的每一個函式(或副程式)嗎?
•指令覆蓋率(Statement coverage):若用控制流圖(英語:control flow graph)表示程式,有執行到控制流圖中的每一個節點嗎?
•判斷覆蓋率(Decision coverage):(和分支覆蓋率不同)若用控制流圖表示程式,有執行到控制流圖中的每一個邊嗎?例如控制結構中所有IF指令都有執行到邏輯運算式成立及不成立的情形嗎?
•條件覆蓋率(Condition coverage):也稱為謂詞覆蓋(predicate coverage),每一個邏輯運算式中的每一個條件(無法再分解的邏輯運算式)是否都有執行到成立及不成立的情形嗎?條件覆蓋率成立不表示判斷覆蓋率一定成立。
•條件/判斷覆蓋率(Condition/decision coverage):需同時滿足判斷覆蓋率和條件覆蓋率。
考慮以下的C++函式:
intfoo(intx,inty){intz=0;if((x>0)&&(y>0)){z=x;}returnz;}
假設此函式是一個大型程式的一部份,且某測試用例執行到此函式:
•函式覆蓋率:只要函式foo有執行過一次,即滿足函式覆蓋率100%的條件。
•指令覆蓋率:若有呼叫過foo(1,1),函式中每一行(包括z=x;)都執行一次,滿足指令覆蓋率100%的條件。
•判斷覆蓋率:若有呼叫過foo(1,1)及foo(0,1),前者會使if的條件成立,因此z=x;會執行,後者會使if的邏輯運算式((x>0)&&(y>0);)不成立,因此滿足判斷覆蓋率100%的條件。
•條件覆蓋率:若有呼叫過foo(1,1)、foo(1,0)及foo(0,0),前二個會使(x>0)的條件成立,而第三個會使該條件不成立,而第一個會使(y>0)的條件成立,而後面二個會使該條件不成立,所有條件都有出現成立及不成立的情形,因此滿足條件覆蓋率100%的條件。
考慮以下的程式:
ifaandb then
以下二個測試可以得到100%的條件覆蓋率:
•a=true,b=false
•a=false,b=true
但上述的測試條件都不會使if的邏輯運算式成立,因此不符合判斷覆蓋的條件。
有時會需要用錯誤插入(英語:Fault injection)的方式來確保所有條件及異常處理程式都有一定的覆蓋率。
修改條件/判斷覆蓋
在一些安全關鍵應用(例如飛航用的軟體)中,一般會需要滿足修改條件/判斷覆蓋(modified condition/decision coverage,簡稱MC/DC)的準則。此準則是條件/判斷覆蓋的延伸,而且每個條件都要可以獨立影響判斷結果的成立或不成立。例如考慮以下的程式:
if(a orb)andc then
以下的測試可滿足條件/判斷覆蓋:
•a=true,b=true,c=true
•a=false,b=false,c=false
不過,若第一項測試中b的值改為false,不影響判斷結果,第二項測試中c的值改為true,不影響判斷結果,因此需要用以下的測試才能滿足修改條件/判斷覆蓋:
•a=false,b=false,c=true
•a=true,b=false,c=true
•a=false,b=true,c=true
•a=true,b=true,c=false
其中粗體的條件表示是會影響判斷結果的條件,在影響判斷結果的條件中,每個變數都出現至少二次,其中至少一次其值為真,至少一次其值為假。
多重條件覆蓋
此覆蓋率準則要求要測試邏輯運算式中的所有組合,例如上述程式的多重條件覆蓋需要有以下的8個測試:
•a=false,b=false,c=false
•a徠=false,b=false,c=true
•a=false,b=true,c=false
•a=false,b=true,c=true
•a=true,b=false,c=false
•a=true,b=false,c=true
•a=true,b=true,c=false
•a=true,b=true,c=true
其他覆蓋率準則
以下也是一些可能會用到的覆蓋率準則:
•JCSAJ覆蓋率:是否執行過每一個JCSAJ(線性代碼序列和跳轉)?
•JJ路徑覆蓋率(JJ-Path coverage):是否執行過每一個JJ路徑(從跳轉到跳轉之間的路徑,也就是JCSAJ)?
•路徑覆蓋率(Path coverage):是否執行過程式中所有可能的路徑?
•進入點/結束點覆蓋率(Entry/exit coverage):是否執行過函式中所有可能的進入點及結束點?
•循環覆蓋率(Loop coverage):所有循環是否都有執行過零次、一次及一次以上的測試?
•參數值覆蓋率(Parameter Value Coverage):對於一個方法的所有參數,是否有執行過其中最常見的數值?
安全關鍵應用一般會要求某種特定的覆蓋率要到達100%。
有些覆蓋之間有相關性:例如路徑覆蓋就包括了判斷覆蓋、指令覆蓋及進入點/結束點覆蓋,而判斷覆蓋也包括了指令覆蓋。
完整的路徑覆蓋測試多半難以實現甚至不可能實現。有個判斷的程式就會有種完整路徑,循環結構可能會產生無窮種完整路徑。程式中的許多路徑也許是不可行的,因為也許沒有受測系統的輸入,使系統完整依某特定路徑執行。而且已證實沒有識別不可行路徑的通用演演算法(若有,此演演算法就可以求解停機問題)。實務上路徑覆蓋測試的軟體只會試圖找出隨著循環執行次數不同時,有變動的路徑,設法找到“基本路徑”,並要求對基本路徑需達到路徑覆蓋的要求。

應用


我國森林覆蓋率
森林是陸地上最大的碳儲庫,減少森林損毀、增加森林資源是應對氣候變化的有效途徑。森林可持續經營是實現林業可持續發展的必然選擇,是推動經濟社會可持續發展的重要措施。中國還將完善林業扶持政策,健全林業財政補貼制度,完善森林生態效益補償制度,落實林業金融稅收扶持政策。加強林業科學研究,建立科技支撐體系。
多年來,我國投入巨額資金,加強森林生態系統、濕地生態系統、荒漠生態系統建設和生物多樣性保護,全面實施退耕還林、天然林保護等重點生態工程,持續開展全民義務植樹,大力發展林產工業,實現了森林資源和林業產業協調發展,森林覆蓋率增加到20.36%。
為實現2015年森林覆蓋率達到21.66%的目標,中國將加快造林綠化步伐,增加森林資源總量,繼續實施天然林保護、退耕還林、“三北”防護林體系建設和防沙治沙等重點生態工程,深入開展全民義務植樹運動,加速培育森林資源。同時,加強森林撫育經營,提高森林資源質量。強化森林資源保護,提升林業執法能力,嚴厲打擊破壞森林資源行為,做好林業有害生物防治和森林防火工作,確保森林資源持續增長。