評測方法
測試復蓋是對測試完全程度的評測。測試復蓋是由測試需求和測試用例的復蓋或已執行代碼的復蓋表示的。
質量是對測試對象(系統或測試的應用程式)的可靠性、穩定性以及性能的評測。質量建立在對測試結果的評估和對測試過程中確定的變更請求(缺陷)的分析的基礎上。
復蓋評測
兩種評測
復蓋指標提供了"測試的完全程度如何"這一問題的答案,最常用的復蓋評測是基於需求的測試復蓋和基於代碼的測試復蓋。簡而言之,測試復蓋是就需求(基於需求的)或代碼的設計/實施標準(基於代碼的)而言的完全程度的任意評測,如用例的核實(基於需求的)或所有代碼行的執行(基於代碼的)。
系統的測試活動建立在至少一個測試復蓋策略基礎上。復蓋策略陳述測試的一般目的,指導測試用例的設計。復蓋策略的陳述可以簡單到只說明核實所有性能。
如果需求已經完全分類,則基於需求的復蓋策略可能足以生成測試完全程度的可計量評測。例如,如果已經確定了所有性能測試需求,則可以引用測試結果來得到評測,如已經核實了 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
以下的測試可滿足條件/判斷復蓋:
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%的目標,中國將加快造林綠化步伐,增加森林資源總量,繼續實施天然林保護、退耕還林、“三北”防護林體系建設和防沙治沙等重點生態工程,深入開展全民義務植樹運動,加速培育森林資源。同時,加強森林撫育經營,提高森林資源質量。強化森林資源保護,提升林業執法能力,嚴厲打擊破壞森林資源行為,做好林業有害生物防治和森林防火工作,確保森林資源持續增長。