農林漁牧網

您現在的位置是:首頁 > 農業

程式碼覆蓋率的務統計指標有哪些?如何合理設定?

2022-09-25由 道普雲 發表于 農業

路徑覆蓋屬於邏輯覆蓋嗎

程式碼覆蓋率的務統計指標有哪些?如何合理設定?

接下來我們看一下程式碼覆蓋率裡面的指標,一開始我們就講到了,程式碼覆蓋率的含義就是哪些程式碼被跑到了,哪些程式碼沒有被跑到,實際上沒有那麼簡單,它分成了幾個維度去考慮程式碼的覆蓋情況,我們先來看第一個緯度,語句的覆蓋。

語句覆蓋

(StatementCoverage)又稱行覆蓋(LineCoverage),就是度量被測程式碼中每個可執行語句是否被執行到了。這裡說的是“可執行語句”,不會包括標頭檔案宣告,程式碼註釋,空行,等等,非常好理解。只統計能夠執行的程式碼被執行了多少行。簡單來說,就是這行程式碼只要被覆蓋到了就是1,沒有被覆蓋到就是2。

程式碼覆蓋率的務統計指標有哪些?如何合理設定?

我們先來看上面這段程式碼,這裡有價值的語句一共有

3條語句:判斷語句是一條,return 0是一條,return 1是一條。很多程式碼覆蓋率會認定else不算,因為它就是一個關鍵字,實際上沒有什麼語句的價值。

如果每一行都執行到了,行覆蓋率就是

1,總共3行,3行都執行到了,行覆蓋率就是100%。

稍微有點程式碼常識的人看到這裡就能看出問題了,如果這個

if語句我確實執行到了,但是它明顯地有判斷條件。

如果我第一個判斷條件執行了,我就能判斷出這個語句的真假,後面的判斷條件不執行了,我就繼續往下走。這個語句確實叫執行了,

true false 都沒有完全覆蓋到而已,所以我們說行覆蓋是最弱的程式碼覆蓋。

語句覆蓋常常被人指責為

“最弱的覆蓋”,它只管覆蓋程式碼中的執行語句,卻不考慮各種分支的組合等等。

除了行覆蓋、語句覆蓋之外,第二種覆蓋叫做判定覆蓋,後面我們有詳細的例子,什麼叫判定覆蓋?

判定覆蓋也叫分支覆蓋

(BranchCoverage),度量程式中每一個判定的分支是否都被測試到了。

這個很好理解,比如我們剛才的例子裡有一個

if語句,行覆蓋就是一行行往下走,判定覆蓋是指有分支的語句,每一個語句是否都被走到了。我們再來一起看一下這個例子。

程式碼覆蓋率的務統計指標有哪些?如何合理設定?

有的同學會說你的這個例子完整地有

if有 else,所以說行一旦覆蓋成功了,三句都走完了,那麼你的分支覆蓋肯定也是百分之百走完,也是成功的,因為我的if走了,else也走了。

我們試想一下,如果把下面的

else蓋住的話,沒有這個else,只有if,如果你的語句覆蓋裡面的if走到了,return走到了,你的行覆蓋率是百分之百,這個時候你並沒有去測else分支,這個時候行覆蓋率是100%,但是else的條件你並沒有測到,這個時候只覆蓋到了if為true的情況,沒有覆蓋到else分支,雖然else分支裡面沒有程式碼。

這個例子就說明判定覆蓋和行覆蓋還是有本質區別的。

條件覆蓋

(ConditionCoverage)

它度量判定中的每個子表示式結果

true和false是否被測試到了。為了說明判定覆蓋和條件覆蓋的區別,我們來舉一個例子,假如我們的被測程式碼如下:

在剛才的例子裡,如果

if、else都走到了,那麼你的分支覆蓋肯定也是百分之百,但是條件覆蓋不一定是百分之百。

什麼意思呢,

if整體為true,我確實走到了,if整體為false,也就是else,我確實也走到了,對於if判斷語句來說,兩個分支確實都走到了。

但這裡面還有一個問題,

if後面它是有兩個判定條件的,咱們稍微有點程式碼常識的朋友都知道,不管什麼語言,都有邏輯判斷短路的問題。兩個and判斷,如果有一個and判斷為false了,後面就不會判斷了,所以說那個就不走了,不管走不走,你並沒有覆蓋到兩個並列條件,兩個子條件都為true或都為false的情況你並沒有走到。

整體的判斷語句你走到了,但是裡面兩個具體的分支判斷條件分別的

true、false你沒有走到。這個時候你的分支覆蓋率是百分之百了,但是你的條件覆蓋率並不是百分之百。

路徑覆蓋

(PathCoverage)它度量了是否函式的每一個分支都被執行了。有多個分支巢狀時,需要對多個分支進行排列組合。

因為現在只有一個

if條件,所以不好看路徑,我給大家舉個例子,比如說兩個判定條件,兩個if,你只覆蓋了第一個if判定條件的true和false以及第二個判定條件的true和false,但是兩個並沒有分別來走。

比如說第一個是

true,第二個是false,或者第一個是false,第二個是true的這種交叉情況。也就是說沒有把包含所有的if、else條件的整體當成一個完整的路徑去處理,這個路徑就有多種組合了。這就是第四個,叫路徑覆蓋。

所以說最粗略的覆蓋是行覆蓋,然後是判定覆蓋,也叫分支覆蓋,第三個是每個分支裡面的小條件都被覆蓋了叫條件覆蓋,第四個是所有程式碼裡面可能會出現的路徑組合,判斷分支的組合,叫做路徑覆蓋,由粗到細四個程度。

當然再往下劃分還有一個圈複雜度,這個就不在咱們今天分享的範圍內了。

下面我們再透過一個小例子去詳細解說一下。

程式碼覆蓋率的務統計指標有哪些?如何合理設定?

上面是一個

java的語句,一個foo函式,有a、b兩個整型,有一個if條件,這個if條件裡面有兩個小的條件。接下來有一個else分支語句,最後有一個return語句。有一組判斷,兩個分支,三個語句(不算定義的話)。

TestCaes1: a=5

b=任意數字

a=5的時候,a<10這個條件成立,對於邏輯或來說,前面的條件為真,後面的條件就不用判斷了,必然是為真的。

所以說我給出的第一組測試用例,當

a=5

b=任意數字時,它都會走到分支一

我們再給一個值。

TestCaes2: a = 15,b = 15

a=15時,a<10不成立,進而去判斷第二個條件,當b=15,b<10也不成立的時候,會走到else這裡,這樣也覆蓋了分支二。

語句覆蓋

100%,分支覆蓋也是100%,但是裡面小條件的true和false並沒有很完整地被覆蓋。a<10為true、為false和b<10為true、為false的情況沒有分別覆蓋,因為邏輯短路的原因,所以你不能讓它短路。

完全的條件覆蓋:

TestCase1: a = 5,b = 任意數字

ture X

TestCase2: a = 15, b = 5 false, true

TestCase2: a = 15, b = 15

false, false

第一條,我先讓

a=5,b=任意數字,這個時候a<10這個條件為true的情況已經被覆蓋。接下來透過a = 15, b = 5和a = 15, b = 15 這兩組資料,讓a<10這個條件為false時,b<10這個條件的true和false,都覆蓋到了。

在這個邏輯或的條件中,每個分支的

true和false都覆蓋到了,這個時候才完成了我們所說的第3類覆蓋,就是我們剛才所說的條件覆蓋。對於這一個例子來說,上面所說的幾種覆蓋率就全部都覆蓋到了。

下面我們再一起來看一個例子。