評測方法
測試覆蓋是對測試完全程度的評測。測試覆蓋是由測試需求和
測試用例的覆蓋或已執行代碼的覆蓋表示的。
質量是對測試對象(系統或測試的應用程式)的可靠性、穩定性以及性能的評測。質量建立在對測試結果的評估和對測試過程中確定的變更請求(缺陷)的分析的基礎上。
覆蓋評測
兩種評測
覆蓋指標提供了"測試的完全程度如何"這一問題的答案,最常用的覆蓋評測是基於需求的測試覆蓋和基於代碼的測試覆蓋。簡而言之,測試覆蓋是就需求(基於需求的)或代碼的設計/實施標準(基於代碼的)而言的完全程度的任意評測,如
用例的核實(基於需求的)或所有代碼行的執行(基於代碼的)。
系統的測試活動建立在至少一個測試覆蓋策略基礎上。覆蓋策略陳述測試的一般目的,指導測試用例的設計。覆蓋策略的陳述可以簡單到只說明核實所有性能。
如果需求已經完全分類,則基於需求的覆蓋策略可能足以生成測試完全程度的可計量評測。例如,如果已經確定了所有性能測試需求,則可以引用測試結果來得到評測,如已經核實了 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%的條件。
考慮以下的程式:
ifaandbthen
以下二個測試可以得到100%的條件覆蓋率:
a=true,b=false
a=false,b=true
但上述的測試條件都不會使if的邏輯運算式成立,因此不符合判斷覆蓋的條件。
有時會需要用錯誤插入(英語:Fault injection)的方式來確保所有條件及
異常處理程式都有一定的覆蓋率。
修改條件/判斷覆蓋
在一些安全關鍵套用(例如飛航用的軟體)中,一般會需要滿足修改條件/判斷覆蓋(modified condition/decision coverage,簡稱MC/DC)的準則。此準則是條件/判斷覆蓋的延伸,而且每個條件都要可以獨立影響判斷結果的成立或不成立。例如考慮以下的程式:
if(aorb)andcthen
以下的測試可滿足條件/判斷覆蓋:
不過,若第一項測試中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個測試:
其他覆蓋率準則
以下也是一些可能會用到的覆蓋率準則:
JCSAJ覆蓋率:是否執行過每一個JCSAJ(線性代碼序列和跳轉)?
JJ路徑覆蓋率(JJ-Path coverage):是否執行過每一個JJ路徑(從跳轉到跳轉之間的路徑,也就是JCSAJ)?
路徑覆蓋率(Path coverage):是否執行過程式中所有可能的路徑?
進入點/結束點覆蓋率(Entry/exit coverage):是否執行過函式中所有可能的進入點及結束點?
循環覆蓋率(Loop coverage):所有循環是否都有執行過零次、一次及一次以上的測試?
參數值覆蓋率(Parameter Value Coverage):對於一個方法的所有參數,是否有執行過其中最常見的數值?
安全關鍵套用一般會要求某種特定的覆蓋率要到達100%。
有些覆蓋之間有相關性:例如路徑覆蓋就包括了判斷覆蓋、指令覆蓋及進入點/結束點覆蓋,而判斷覆蓋也包括了指令覆蓋。
完整的路徑覆蓋測試多半難以實現甚至不可能實現。有個判斷的程式就會有種完整路徑,循環結構可能會產生無窮種完整路徑。程式中的許多路徑也許是不可行的,因為也許沒有受測系統的輸入,使系統完整依某特定路徑執行。而且已證實沒有識別不可行路徑的通用算法(若有,此算法就可以求解
停機問題)。實務上路徑覆蓋測試的軟體只會試圖找出隨著循環執行次數不同時,有變動的路徑,設法找到“基本路徑”,並要求對基本路徑需達到路徑覆蓋的要求。
套用
我國森林覆蓋率
森林是陸地上最大的碳儲庫,減少森林損毀、增加森林資源是應對氣候變化的有效途徑。森林可持續經營是實現林業可持續發展的必然選擇,是推動經濟社會可持續發展的重要措施。中國還將完善林業扶持政策,健全林業財政補貼制度,完善森林生態效益補償制度,落實林業金融稅收扶持政策。加強林業科學研究,建立科技支撐體系。
多年來,我國投入巨額資金,加強森林生態系統、濕地生態系統、荒漠生態系統建設和生物多樣性保護,全面實施退耕還林、天然林保護等重點生態工程,持續開展全民義務植樹,大力發展林產工業,實現了森林資源和林業產業協調發展,森林覆蓋率增加到20.36%。
為實現2015年森林覆蓋率達到21.66%的目標,中國將加快造林綠化步伐,增加森林資源總量,繼續實施天然林保護、退耕還林、“三北”防護林體系建設和防沙治沙等重點生態工程,深入開展全民義務植樹運動,加速培育森林資源。同時,加強森林撫育經營,提高森林資源質量。強化森林資源保護,提升林業執法能力,嚴厲打擊破壞森林資源行為,做好林業有害生物防治和森林防火工作,確保森林資源持續增長。