線性程式碼順序及跳轉
来自维基百科,自由的百科全书
線性程式碼順序及跳轉(Linear code sequence and jump)簡稱LCSAJ,是軟體測試相關的術語。其廣義的定義是一種程式分析方式,可以識別出要測試程式碼中的結構單元。其主要用途是用在動態軟體分析中,來確認「測試到什麼程度才算是足夠?」[1]。動態軟體分析用來衡量軟體測試資料的品質以及有效性,而其量化數據是由要測試程式碼中的結構單元數量來確認。動態分析若是用來量化測試資料中的結構單元數量,此分析也會稱為是結結構覆蓋率分析。
線性程式碼順序及跳轉也有狹義的定義,是程式碼中明確定義的一段連續程式碼,此定義下的LCSAJ也稱為跳躍—跳躍路徑(JJ-path)。
歷史
LCSAJ分析法是由Michael Hennell教授提出,目的是為了評估原子核物理學用到的數學函式庫的品質[2][3]。Hennell教授後來成立了LDRA公司,將為計劃開發的測試平台商品化販售,也就是後來的LDRA Testbed。
LCSAJ程式區塊的定義及特點
LCSAJ是程式路徑中的一部份,包括一段線性(連續)程式碼,後面有條件流程跳躍指令,並且包括以下三部份的程式碼 [6]:
- 線性程式碼的啟始
- 線性程式碼的結束
- 線性程式碼結束後,依控制流程會跳躍到的目的程式。
LCSAJ和(最大的)基礎區塊不同,LCSAJ可以彼此重疊,因為可能在LCSAJ程式碼中間會出現跳躍到其他程式的跳躍指令,而基礎區塊程式碼中間不允許有跳躍指令。而且,條件式跳躍就會產生互相重疊的LCSAJ,條件成立時會執行程式碼A,條件不成立時會執行程式碼B,這就產生二段重疊的LCSAJ。因此,每一個基礎區塊都是LCSAJ,但LCSAJ可能會包括一個到多個基礎區塊。根據1986年的一篇文章指出,LCSAJ的大小多半是基礎區塊的四倍[7]。
以下是用到基礎區塊的正式LCSAJ定義[8]:
一個到多個連續編號p, (p+1), ..., q基礎區塊程式單元的序列,之後有一個控制流程的跳躍,可能是跳出此程式碼單元,或是到編號為r的基礎區塊,r≠(q+1)。有關編號p,可能p=1,或者有其他的基礎區塊會跳到編號為p的基礎區塊(在LCSAJ的跳躍指令中,會說明要跳躍到的基礎區塊)
根據Jorgensen 2013年版的教科書,在英國以外,且不是ISTQB以外的文獻中,會將此敘述稱為是決策到決策路徑(DD-path)[9]。
有效測試的比率
覆蓋率分析度量可以確認測試進行的程度如何。最基本的度量是有執行到敘述,相對於所有敘述的比例,有效測試比率1(TER1)[10]:
也有較高階的覆蓋率分析度量,例如考慮執行到控制流跳躍的比例,或是執行到LCSAJ的比例[11]:
上述的度量有階層的關係,若TER3 = 100%,表示TER2 = 100%,且TER1 = 100%。
TER1和TER2的度量約在1970年代初期出現,TER3則是在1970年代末期。在DO-178標準剛開始時,有要求TER1 = 100%,後來在1992年加上MC/DC(修改條件判斷覆蓋)的額外要求[12]。許多專案會強制要求更高階的 TER3 = 100%,例如航太、通訊以及銀行[來源請求]。在使用TER3時,有一個實務上的問題,是許多LCSAJ有包括互相矛盾的條件,因此無法執行到。
例子
考慮以下的C語言程式:
#include <stdlib.h>
#include <string.h>
#include <math.h>
#define MAXCOLUMNS 26
#define MAXROW 20
#define MAXCOUNT 90
#define ITERATIONS 750
int main (void)
{
int count = 0, totals[MAXCOLUMNS], val = 0;
memset (totals, 0, MAXCOLUMNS * sizeof(int));
count = 0;
while ( count < ITERATIONS )
{
val = abs(rand()) % MAXCOLUMNS;
totals[val] += 1;
if ( totals[val] > MAXCOUNT )
{
totals[val] = MAXCOUNT;
}
count++;
}
return (0);
}
這段程式中對應的LCSAJ程式啟始、結束及跳轉目標列表如下:
LCSAJ編號 | 啟始行 | 結束行 | 跳轉目標行 |
---|---|---|---|
1 | 10 | 17 | 28 |
2 | 10 | 21 | 25 |
3 | 10 | 26 | 17 |
4 | 17 | 17 | 28 |
5 | 17 | 21 | 25 |
6 | 17 | 26 | 17 |
7 | 25 | 26 | 17 |
8 | 28 | 28 | −1 |
從這段程式可以看出LCSAJ識別到的程式碼可能會包括決策點,表示有經過決策判斷,判斷後的結果是繼續執行後面的程式。例如例子中的LCSAJ 2就包括了while
指令,而當時的情形是(count < ITERATIONS)
條件成立。
每一行程式都會劃分在一個或是多個LCSAJ範圍內,因此有每一行的LCSAJ密度,例如第17行出現在6個LCSAJ範圍內,因此其LCSAJ密度為6。在評估程式的可維護性時很有幫助,每一行的LCSAJ密度也反映了修改那一行會影響的LCSAJ數量。
若測試資料可以使所有的LCSAJ都至少執行一次,就滿足TER3 = 100%的覆蓋率等級。
參考資料
Wikiwand - on
Seamless Wikipedia browsing. On steroids.