覆蓋率 - 測試有效性的一個(gè)度量
覆蓋率是度量測試完整性的一個(gè)手段,是測試有效性的一個(gè)度量。通過已執(zhí)行代碼表示,用于可靠性、穩(wěn)定性以及性能的評測。測試覆蓋是對測試完全程度的評測。測試覆蓋是由測試需求和測試用例的覆蓋或已執(zhí)行代碼的覆蓋表示的。建立在對測試結(jié)果的評估和對測試過程中確定的變更請求(缺陷)的分析的基礎(chǔ)上。
評測方法
測試覆蓋是對測試完全程度的評測。測試覆蓋是由測試需求和測試用例的覆蓋或已執(zhí)行代碼的覆蓋表示的。
質(zhì)量是對測試對象(系統(tǒng)或測試的應(yīng)用程序)的可靠性、穩(wěn)定性以及性能的評測。質(zhì)量建立在對測試結(jié)果的評估和對測試過程中確定的變更請求(缺陷)的分析的基礎(chǔ)上。
覆蓋評測
兩種評測
覆蓋指標(biāo)提供了"測試的完全程度如何"這一問題的答案,最常用的覆蓋評測是基于需求的測試覆蓋和基于代碼的測試覆蓋。簡而言之,測試覆蓋是就需求(基于需求的)或代碼的設(shè)計(jì)/實(shí)施標(biāo)準(zhǔn)(基于代碼的)而言的完全程度的任意評測,如用例的核實(shí)(基于需求的)或所有代碼行的執(zhí)行(基于代碼的)。
系統(tǒng)的測試活動(dòng)建立在至少一個(gè)測試覆蓋策略基礎(chǔ)上。覆蓋策略陳述測試的一般目的,指導(dǎo)測試用例的設(shè)計(jì)。覆蓋策略的陳述可以簡單到只說明核實(shí)所有性能。
如果需求已經(jīng)完全分類,則基于需求的覆蓋策略可能足以生成測試完全程度的可計(jì)量評測。例如,如果已經(jīng)確定了所有性能測試需求,則可以引用測試結(jié)果來得到評測,如已經(jīng)核實(shí)了75%的性能測試需求。
如果應(yīng)用基于代碼的覆蓋,則測試策略是根據(jù)測試已經(jīng)執(zhí)行的源代碼的多少來表示的。這種測試覆蓋策略類型對于安全至上的系統(tǒng)來說非常重要。
兩種評測方法
兩種評測都可以手工得到(公式如下所示)或通過測試自動(dòng)化工具計(jì)算得到。
基于需求的測試覆蓋:
基于需求的測試覆蓋在測試生命周期中要評測多次,并在測試生命周期的里程碑處提供測試覆蓋的標(biāo)識(如已計(jì)劃的、已實(shí)施的、已執(zhí)行的和成功的測試覆蓋)。
在執(zhí)行測試活動(dòng)中,使用兩個(gè)測試覆蓋評測,一個(gè)確定通過執(zhí)行測試獲得的測試覆蓋,另一個(gè)確定成功的測試覆蓋(即執(zhí)行時(shí)未出現(xiàn)失敗的測試,如沒有出現(xiàn)缺陷或意外結(jié)果的測試)。
基于代碼的測試覆蓋:
基于代碼的測試覆蓋評測測試過程中已經(jīng)執(zhí)行的代碼的多少,與之相對的是要執(zhí)行的剩余代碼的多少。代碼覆蓋可以建立在控制流(語句、分支或路徑)或數(shù)據(jù)流的基礎(chǔ)上??刂屏鞲采w的目的是測試代碼行、分支條件、代碼中的路徑或軟件控制流的其他元素。數(shù)據(jù)流覆蓋的目的是通過軟件操作測試數(shù)據(jù)狀態(tài)是否有效,例如,數(shù)據(jù)元素在使用之前是否已作定義。
覆蓋率等于覆蓋面積/總面積。
覆蓋率準(zhǔn)則
為了量測測試套件測試軟件的程度,會(huì)用一種或多種不同的覆蓋率準(zhǔn)則。
基本的覆蓋率準(zhǔn)則
以下列出一些基本的覆蓋率準(zhǔn)則:
函式覆蓋率(Function coverage):有呼叫到程式中的每一個(gè)函式(或副程式)嗎?
指令覆蓋率(Statement coverage):若用控制流圖(英語:control flow graph)表示程式,有執(zhí)行到控制流圖中的每一個(gè)節(jié)點(diǎn)嗎?
判斷覆蓋率(Decision coverage):(和分支復(fù)蓋率不同)若用控制流圖表示程式,有執(zhí)行到控制流圖中的每一個(gè)邊嗎?例如控制結(jié)構(gòu)中所有IF指令都有執(zhí)行到邏輯運(yùn)算式成立及不成立的情形嗎?
條件覆蓋率(Condition coverage):也稱為謂詞復(fù)蓋(predicate coverage),每一個(gè)邏輯運(yùn)算式中的每一個(gè)條件(無法再分解的邏輯運(yùn)算式)是否都有執(zhí)行到成立及不成立的情形嗎?條件復(fù)蓋率成立不表示判斷復(fù)蓋率一定成立。
條件/判斷復(fù)蓋率(Condition/decision coverage):需同時(shí)滿足判斷復(fù)蓋率和條件復(fù)蓋率。
考慮以下的C++函式:
intfoo - intx,inty{intz=0;if - - x>0&& - y>0{z=x;}returnz;}
假設(shè)此函式是一個(gè)大型程式的一部份,且某測試用例執(zhí)行到此函式:
函式復(fù)蓋率:只要函式foo有執(zhí)行過一次,即滿足函式復(fù)蓋率100%的條件。
指令復(fù)蓋率:若有呼叫過foo - 1,1,函式中每一行(包括z=x;)都執(zhí)行一次,滿足指令復(fù)蓋率100%的條件。
判斷復(fù)蓋率:若有呼叫過foo - 1,1及foo - 0,1,前者會(huì)使if的條件成立,因此z=x;會(huì)執(zhí)行,后者會(huì)使if的邏輯運(yùn)算式( - x>0&& - y>0;)不成立,因此滿足判斷復(fù)蓋率100%的條件。
條件復(fù)蓋率:若有呼叫過foo - 1,1、foo - 1,0及foo - 0,0,前二個(gè)會(huì)使 - x>0的條件成立,而第三個(gè)會(huì)使該條件不成立,而第一個(gè)會(huì)使 - y>0的條件成立,而后面二個(gè)會(huì)使該條件不成立,所有條件都有出現(xiàn)成立及不成立的情形,因此滿足條件復(fù)蓋率100%的條件。
考慮以下的程式:
ifaandbthen
以下二個(gè)測試可以得到100%的條件復(fù)蓋率:
a=true,b=false
a=false,b=true
但上述的測試條件都不會(huì)使if的邏輯運(yùn)算式成立,因此不符合判斷復(fù)蓋的條件。
有時(shí)會(huì)需要用錯(cuò)誤插入(英語:Fault injection)的方式來確保所有條件及異常處理程式都有一定的復(fù)蓋率。
修改條件/判斷覆蓋
在一些安全關(guān)鍵應(yīng)用(例如飛航用的軟件)中,一般會(huì)需要滿足修改條件/判斷復(fù)蓋(modified condition/decision coverage,簡稱MC/DC)的準(zhǔn)則。此準(zhǔn)則是條件/判斷復(fù)蓋的延伸,而且每個(gè)條件都要可以獨(dú)立影響判斷結(jié)果的成立或不成立。例如考慮以下的程式:
if - aorbandcthen
以下的測試可滿足條件/判斷復(fù)蓋:
a=true,b=true,c=true
a=false,b=false,c=false
不過,若第一項(xiàng)測試中b的值改為false,不影響判斷結(jié)果,第二項(xiàng)測試中c的值改為true,不影響判斷結(jié)果,因此需要用以下的測試才能滿足修改條件/判斷復(fù)蓋:
a=false,b=false,c=true
a=true,b=false,c=true
a=false,b=true,c=true
a=true,b=true,c=false
其中粗體的條件表示是會(huì)影響判斷結(jié)果的條件,在影響判斷結(jié)果的條件中,每個(gè)變量都出現(xiàn)至少二次,其中至少一次其值為真,至少一次其值為假。
多重條件覆蓋
此覆蓋率準(zhǔn)則要求要測試邏輯運(yùn)算式中的所有組合,例如上述程式的多重條件覆蓋需要有以下的8個(gè)測試:
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
其他覆蓋率準(zhǔn)則
以下也是一些可能會(huì)用到的覆蓋率準(zhǔn)則:
JCSAJ覆蓋率:是否執(zhí)行過每一個(gè)JCSAJ(線性代碼序列和跳轉(zhuǎn))?
JJ路徑覆蓋率(JJ-Path coverage):是否執(zhí)行過每一個(gè)JJ路徑(從跳轉(zhuǎn)到跳轉(zhuǎn)之間的路徑,也就是JCSAJ)?
路徑覆蓋率(Path coverage):是否執(zhí)行過程式中所有可能的路徑?
進(jìn)入點(diǎn)/結(jié)束點(diǎn)覆蓋率(Entry/exit coverage):是否執(zhí)行過函式中所有可能的進(jìn)入點(diǎn)及結(jié)束點(diǎn)?
循環(huán)覆蓋率(Loop coverage):所有循環(huán)是否都有執(zhí)行過零次、一次及一次以上的測試?
參數(shù)值覆蓋率(Parameter Value Coverage):對于一個(gè)方法的所有參數(shù),是否有執(zhí)行過其中最常見的數(shù)值?
安全關(guān)鍵應(yīng)用一般會(huì)要求某種特定的覆蓋率要到達(dá)100%。
有些覆蓋之間有相關(guān)性:例如路徑覆蓋就包括了判斷覆蓋、指令覆蓋及進(jìn)入點(diǎn)/結(jié)束點(diǎn)覆蓋,而判斷覆蓋也包括了指令覆蓋。
完整的路徑覆蓋測試多半難以實(shí)現(xiàn)甚至不可能實(shí)現(xiàn)。有個(gè)判斷的程式就會(huì)有種完整路徑,循環(huán)結(jié)構(gòu)可能會(huì)產(chǎn)生無窮種完整路徑。程式中的許多路徑也許是不可行的,因?yàn)橐苍S沒有受測系統(tǒng)的輸入,使系統(tǒng)完整依某特定路徑執(zhí)行。而且已證實(shí)沒有識別不可行路徑的通用算法(若有,此算法就可以求解停機(jī)問題)。實(shí)務(wù)上路徑復(fù)蓋測試的軟件只會(huì)試圖找出隨著循環(huán)執(zhí)行次數(shù)不同時(shí),有變動(dòng)的路徑,設(shè)法找到“基本路徑”,并要求對基本路徑需達(dá)到路徑復(fù)蓋的要求。為了量測測試套件測試軟件的程度,會(huì)用一種或多種不同的覆蓋率準(zhǔn)則。
基本的覆蓋率準(zhǔn)則
以下列出一些基本的覆蓋率準(zhǔn)則:
函式覆蓋率(Function?coverage):有呼叫到程式中的每一個(gè)函式(或副程式)嗎?
指令覆蓋率(Statement?coverage):若用控制流圖(英語:control?flow?graph)表示程式,有執(zhí)行到控制流圖中的每一個(gè)節(jié)點(diǎn)嗎?
判斷覆蓋率(Decision?coverage):(和分支覆蓋率不同)若用控制流圖表示程式,有執(zhí)行到控制流圖中的每一個(gè)邊嗎?例如控制結(jié)構(gòu)中所有IF指令都有執(zhí)行到邏輯運(yùn)算式成立及不成立的情形嗎?
條件覆蓋率(Condition?coverage):也稱為謂詞覆蓋(predicate?coverage),每一個(gè)邏輯運(yùn)算式中的每一個(gè)條件(無法再分解的邏輯運(yùn)算式)是否都有執(zhí)行到成立及不成立的情形嗎?條件覆蓋率成立不表示判斷覆蓋率一定成立。
條件/判斷覆蓋率(Condition/decision?coverage):需同時(shí)滿足判斷覆蓋率和條件覆蓋率。
考慮以下的C++函式:
intfoo - intx,inty{intz=0;if - - x>0&& - y>0{z=x;}returnz;}
假設(shè)此函式是一個(gè)大型程式的一部份,且某測試用例執(zhí)行到此函式:
函式覆蓋率:只要函式foo有執(zhí)行過一次,即滿足函式覆蓋率100%的條件。
指令覆蓋率:若有呼叫過foo - 1,1,函式中每一行(包括z=x;)都執(zhí)行一次,滿足指令覆蓋率100%的條件。
判斷覆蓋率:若有呼叫過foo - 1,1及foo - 0,1,前者會(huì)使if的條件成立,因此z=x;會(huì)執(zhí)行,后者會(huì)使if的邏輯運(yùn)算式( - x>0&& - y>0;)不成立,因此滿足判斷覆蓋率100%的條件。
條件覆蓋率:若有呼叫過foo - 1,1、foo - 1,0及foo - 0,0,前二個(gè)會(huì)使 - x>0的條件成立,而第三個(gè)會(huì)使該條件不成立,而第一個(gè)會(huì)使 - y>0的條件成立,而后面二個(gè)會(huì)使該條件不成立,所有條件都有出現(xiàn)成立及不成立的情形,因此滿足條件覆蓋率100%的條件。
考慮以下的程式:
ifaandbthen
以下二個(gè)測試可以得到100%的條件覆蓋率:
a=true,b=false
a=false,b=true
但上述的測試條件都不會(huì)使if的邏輯運(yùn)算式成立,因此不符合判斷覆蓋的條件。
有時(shí)會(huì)需要用錯(cuò)誤插入(英語:Fault?injection)的方式來確保所有條件及異常處理程式都有一定的覆蓋率。
修改條件/判斷覆蓋
在一些安全關(guān)鍵應(yīng)用(例如飛航用的軟件)中,一般會(huì)需要滿足修改條件/判斷覆蓋(modified?condition/decision?coverage,簡稱MC/DC)的準(zhǔn)則。此準(zhǔn)則是條件/判斷覆蓋的延伸,而且每個(gè)條件都要可以獨(dú)立影響判斷結(jié)果的成立或不成立。例如考慮以下的程式:
if - aorbandcthen
以下的測試可滿足條件/判斷覆蓋:
a=true,b=true,c=true
a=false,b=false,c=false
不過,若第一項(xiàng)測試中b的值改為false,不影響判斷結(jié)果,第二項(xiàng)測試中c的值改為true,不影響判斷結(jié)果,因此需要用以下的測試才能滿足修改條件/判斷覆蓋:
a=false,b=false,c=true
a=true,b=false,c=true
a=false,b=true,c=true
a=true,b=true,c=false
其中粗體的條件表示是會(huì)影響判斷結(jié)果的條件,在影響判斷結(jié)果的條件中,每個(gè)變量都出現(xiàn)至少二次,其中至少一次其值為真,至少一次其值為假。
多重條件覆蓋
此覆蓋率準(zhǔn)則要求要測試邏輯運(yùn)算式中的所有組合,例如上述程式的多重條件覆蓋需要有以下的8個(gè)測試:
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
其他覆蓋率準(zhǔn)則
以下也是一些可能會(huì)用到的覆蓋率準(zhǔn)則:
JCSAJ覆蓋率:是否執(zhí)行過每一個(gè)JCSAJ(線性代碼序列和跳轉(zhuǎn))?
JJ路徑覆蓋率(JJ-Path?coverage):是否執(zhí)行過每一個(gè)JJ路徑(從跳轉(zhuǎn)到跳轉(zhuǎn)之間的路徑,也就是JCSAJ)?
路徑覆蓋率(Path?coverage):是否執(zhí)行過程式中所有可能的路徑?
進(jìn)入點(diǎn)/結(jié)束點(diǎn)覆蓋率(Entry/exit?coverage):是否執(zhí)行過函式中所有可能的進(jìn)入點(diǎn)及結(jié)束點(diǎn)?
循環(huán)覆蓋率(Loop?coverage):所有循環(huán)是否都有執(zhí)行過零次、一次及一次以上的測試?
參數(shù)值覆蓋率(Parameter?Value?Coverage):對于一個(gè)方法的所有參數(shù),是否有執(zhí)行過其中最常見的數(shù)值?
安全關(guān)鍵應(yīng)用一般會(huì)要求某種特定的覆蓋率要到達(dá)100%。
有些覆蓋之間有相關(guān)性:例如路徑覆蓋就包括了判斷覆蓋、指令覆蓋及進(jìn)入點(diǎn)/結(jié)束點(diǎn)覆蓋,而判斷覆蓋也包括了指令覆蓋。
完整的路徑覆蓋測試多半難以實(shí)現(xiàn)甚至不可能實(shí)現(xiàn)。有個(gè)判斷的程式就會(huì)有種完整路徑,循環(huán)結(jié)構(gòu)可能會(huì)產(chǎn)生無窮種完整路徑。程式中的許多路徑也許是不可行的,因?yàn)橐苍S沒有受測系統(tǒng)的輸入,使系統(tǒng)完整依某特定路徑執(zhí)行。而且已證實(shí)沒有識別不可行路徑的通用算法(若有,此算法就可以求解停機(jī)問題)。實(shí)務(wù)上路徑覆蓋測試的軟件只會(huì)試圖找出隨著循環(huán)執(zhí)行次數(shù)不同時(shí),有變動(dòng)的路徑,設(shè)法找到“基本路徑”,并要求對基本路徑需達(dá)到路徑覆蓋的要求。
應(yīng)用
我國森林覆蓋率
森林是陸地上最大的碳儲庫,減少森林損毀、增加森林資源是應(yīng)對氣候變化的有效途徑。森林可持續(xù)經(jīng)營是實(shí)現(xiàn)林業(yè)可持續(xù)發(fā)展的必然選擇,是推動(dòng)經(jīng)濟(jì)社會(huì)可持續(xù)發(fā)展的重要措施。
中國還將完善林業(yè)扶持政策,健全林業(yè)財(cái)政補(bǔ)貼制度,完善森林生態(tài)效益補(bǔ)償制度,落實(shí)林業(yè)金融稅收扶持政策。加強(qiáng)林業(yè)科學(xué)研究,建立科技支撐體系。
多年來,我國投入巨額資金,加強(qiáng)森林生態(tài)系統(tǒng)、濕地生態(tài)系統(tǒng)、荒漠生態(tài)系統(tǒng)建設(shè)和生物多樣性保護(hù),全面實(shí)施退耕還林、天然林保護(hù)等重點(diǎn)生態(tài)工程,持續(xù)開展全民義務(wù)植樹,大力發(fā)展林產(chǎn)工業(yè),實(shí)現(xiàn)了森林資源和林業(yè)產(chǎn)業(yè)協(xié)調(diào)發(fā)展,森林覆蓋率增加到20.36%。
為實(shí)現(xiàn)2015年森林覆蓋率達(dá)到21.66%的目標(biāo),中國將加快造林綠化步伐,增加森林資源總量,繼續(xù)實(shí)施天然林保護(hù)、退耕還林、“三北”防護(hù)林體系建設(shè)和防沙治沙等重點(diǎn)生態(tài)工程,深入開展全民義務(wù)植樹運(yùn)動(dòng),加速培育森林資源。
同時(shí),加強(qiáng)森林撫育經(jīng)營,提高森林資源質(zhì)量。強(qiáng)化森林資源保護(hù),提升林業(yè)執(zhí)法能力,嚴(yán)厲打擊破壞森林資源行為,做好林業(yè)有害生物防治和森林防火工作,確保森林資源持續(xù)增長。
