加入星計(jì)劃,您可以享受以下權(quán)益:

  • 創(chuàng)作內(nèi)容快速變現(xiàn)
  • 行業(yè)影響力擴(kuò)散
  • 作品版權(quán)保護(hù)
  • 300W+ 專(zhuān)業(yè)用戶(hù)
  • 1.5W+ 優(yōu)質(zhì)創(chuàng)作者
  • 5000+ 長(zhǎng)期合作伙伴
立即加入
  • 正文
    • 1 基礎(chǔ)示例
    • 2 進(jìn)階示例
    • 3 修正的條件判定覆蓋MC/DC
    • 4 總結(jié)
  • 推薦器件
  • 相關(guān)推薦
  • 電子產(chǎn)業(yè)圖譜
申請(qǐng)入駐 產(chǎn)業(yè)圖譜

嵌入式基礎(chǔ)知識(shí)-邏輯覆蓋測(cè)試用例設(shè)計(jì)

01/29 13:50
4599
閱讀需 11 分鐘
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論

上篇文章:嵌入式基礎(chǔ)知識(shí)-測(cè)試基礎(chǔ)概念,介紹了軟件測(cè)試相關(guān)的基礎(chǔ)概念,其中白盒測(cè)試中的邏輯覆蓋率知識(shí)點(diǎn)比較復(fù)雜,本篇通過(guò)實(shí)例來(lái)講解各種覆蓋率的測(cè)試用例該如何設(shè)計(jì)。

1 基礎(chǔ)示例

1.1 例題一

有如下程序,設(shè)計(jì)分別滿(mǎn)足語(yǔ)句覆蓋分支覆蓋的最有效力的測(cè)試用例。

int x = 0;
int y = 0;

if (x > 0 && y > 0)
{
    y = y/x;
}

if (x > 1 || y > 1)
{
    y = y + 1;
}

x = x + y;

分析:

語(yǔ)句覆蓋只需要所有的語(yǔ)句都被執(zhí)行過(guò)即可,針對(duì)此程序,只需要使兩個(gè)if語(yǔ)句都為true即可,例如x=2,y=0。

分支覆蓋,也叫判定覆蓋,只需要所有的判斷都能取到所有可能的值即可,針對(duì)此程序,只需要使兩個(gè)if語(yǔ)句各自都取到true和false即可,例如x=2,y=0(兩個(gè)if都是true); x=0,y=0(兩個(gè)if都是false)需要兩條用例。

1.2 例題二

有如下程序,變量i取什么值能效力最高的滿(mǎn)足判斷覆蓋?

void main()
{
    int i = 0;
    int sum = 0;
    scanf("%d", &i);
    while(i <= 10)
    {
        sum += i;
        i++;
    }
    printf("%dn", sum);
}

分析:

此程序中,while語(yǔ)句是路徑分支。效力最高的滿(mǎn)足判斷覆蓋,即在最小的循環(huán)執(zhí)行次數(shù)下,判斷可以取到true和false。因此,取i=10,滿(mǎn)足true,下一輪循環(huán)i變?yōu)榱?1,滿(mǎn)足false。

1.3 例題三

有如下程序,滿(mǎn)足判定覆蓋至少需要幾條測(cè)試用例?

 int func(int n)
 {
     if (n == 0)
     {
         return 33;
     }
     
     if (n == 1)
     {
         return 66;
     }
     
     if (n > 1)
     {
         return func(n - 1) + func(n - 2) + func(n - 3) ;
     }
     else
     {
         return 99;
     }
 }

分析:

此程序中,2個(gè)if和1個(gè)if-else組成了所有的判斷,滿(mǎn)足判定覆蓋,即需要讓所有的判定各取true和false。最簡(jiǎn)單直觀(guān)的是用4條用例n=0; n=1; n=2; n=-1即可滿(mǎn)足,注意到程序里有遞歸調(diào)用,實(shí)際上取n=2,會(huì)調(diào)用return func(1) + func(0) + func(-1) ;即可滿(mǎn)足。

2 進(jìn)階示例

有如下程序,設(shè)計(jì)各種邏輯覆蓋的測(cè)試用例:

int test (int x, int y)
{
    int ret = 0;
    if (x > 0 && y > 0)
    {
        ret = x + y + 10; //語(yǔ)句塊1
    }
    else
    {
        ret = x + y - 10; //語(yǔ)句塊2
    }
    
    if (ret < 0)
    {
        ret = 0; //語(yǔ)句塊3
    }
    
    return ret; //語(yǔ)句塊4
}

分析:根據(jù)程序,先畫(huà)出流程圖:

2.1 語(yǔ)句覆蓋SC

設(shè)計(jì)滿(mǎn)足語(yǔ)句覆蓋(SC)的測(cè)試用例,即運(yùn)行完測(cè)試用例,能將程序中每條可執(zhí)行語(yǔ)句至少被執(zhí)行一次。

本例中,就是要把語(yǔ)句塊1~語(yǔ)句塊4都執(zhí)行一遍。

用例數(shù)據(jù) 語(yǔ)句塊1 語(yǔ)句塊2 語(yǔ)句塊3 語(yǔ)句塊4
{x=3, y=3} - abef
{x=-3, y=0} False

2.2 判定覆蓋DC

設(shè)計(jì)滿(mǎn)足判定覆蓋(DC)的測(cè)試用例,即運(yùn)行完測(cè)試用例,使得程序中每個(gè)判斷的True和False分支至少被執(zhí)行一次。

判定覆蓋,也叫分支覆蓋

用例數(shù)據(jù) P1(x>0&&y>0) P2(ret<0)
{x=3, y=3} True False
{x=-3, y=0} False True

2.3 條件覆蓋CC

設(shè)計(jì)滿(mǎn)足條件覆蓋(CC)的測(cè)試用例,即運(yùn)行完測(cè)試用例,使得程序中每個(gè)邏輯條件的可能值至少被滿(mǎn)足一次。

用例數(shù)據(jù) C1(x>0) C2(y>0) C3(ret<0) P1(x>0&&y>0) P2(ret<0)
{x=3, y=0} True False True False True
{x=-3, y=15} False True False False False

2.4 條件判定覆蓋C/DC

設(shè)計(jì)滿(mǎn)足條件判定覆蓋(C/DC)的測(cè)試用例,即運(yùn)行完測(cè)試用例,使得程序中每個(gè)判斷的True和False分支至少被執(zhí)行一次,同時(shí),使得程序中每個(gè)邏輯條件的可能值至少被滿(mǎn)足一次。

用例數(shù)據(jù) C1(x>0) C2(y>0) C3(ret<0) P1(x>0&&y>0) P2(ret<0)
{x=3, y=3} True True False True False
{x=-3, y=0} False False True False True

2.5 條件組合覆蓋MCC

設(shè)計(jì)滿(mǎn)足組合覆蓋(MCC)的測(cè)試用例,即運(yùn)行完測(cè)試用例,使得程序中每個(gè)判斷的所有可能條件取值的組合至少被滿(mǎn)足一次。

注意幾點(diǎn):

    條件組合只針對(duì)同一個(gè)判斷語(yǔ)句內(nèi)存在多個(gè)條件的情況不同的判斷語(yǔ)句內(nèi)的條件直接無(wú)需組合對(duì)于單條件的判斷語(yǔ)句,只需滿(mǎn)足自己的所有取值即可
用例數(shù)據(jù) C1(x>0) C2(y>0) C3(ret<0) P1(x>0&&y>0) P2(ret<0) 路徑
{x=-3, y=0} False False True False True acdf
{x=-3, y=2} False True True False True acdf
{x=3, y=0} True False True False True acdf
{x=3, y=3} True True False True False abef

2.6 路徑覆蓋PC

設(shè)計(jì)滿(mǎn)足路徑覆蓋(PC)的測(cè)試用例,即運(yùn)行完測(cè)試用例,使得程序中每條路徑至少被覆蓋一次。

用例數(shù)據(jù) C1(x>0) C2(y>0) C3(ret<0) P1(x>0&&y>0) P2(ret<0) 路徑
不可能路徑 - - - - - abdf
{x=0, y=2} False True True False True acdf
{x=3, y=5} True True True True True abef
{x=-10, y=30} False True False False False acef

3 修正的條件判定覆蓋MC/DC

修正的條件判定覆蓋MC/DC,這里再描述一下含義:

MC/DC要求設(shè)計(jì)適當(dāng)數(shù)量的測(cè)試用例,滿(mǎn)足以下條件:

    保證在一個(gè)程序中每一種輸入輸出至少出現(xiàn)一次在程序中的每一個(gè)條件必須產(chǎn)生所有可能的輸出結(jié)果至少一次并且每個(gè)判斷中的每個(gè)條件必須能獨(dú)立影響一個(gè)判斷的輸出(即在其它條件不變的前提下,僅改變這個(gè)條件的值,而使判斷結(jié)果改變)

有如下程序,若要滿(mǎn)足修正的條件判定覆蓋,最少的測(cè)試用例需要幾條:

bool func(bool x, bool y, bool z)
{
    if (x && (y || z))
    {
        return true;
    }
    
    return false;
}

先畫(huà)出流程圖,這里給出兩種畫(huà)法:

對(duì)于修正的條件判定覆蓋:

    首先需要先進(jìn)行條件組合,本例中P1判定內(nèi)包含3個(gè)布爾值的條件x、y、z,對(duì)其組合有8種情況然后再分別對(duì)每個(gè)條件的用例進(jìn)行計(jì)算,規(guī)則為:

    • 條件Cx所在的判定內(nèi)(本例即P1),除條件Cx外,其它條件的取值完全相同(例如對(duì)于C1,就是找到與x的值相反,y和z相同的用例 )判定的結(jié)果與之相反(例如對(duì)于C1,用例2和用例6的判定結(jié)果就是相反的)

按照以上規(guī)則,可以得到如下表:

觀(guān)察表格:

    對(duì)于條件z,需要選用用例5和6對(duì)于條件y,需要選用用例5和7對(duì)于條件x,需要選用用例2和6,或用例3和7,或用例2和8

為了實(shí)現(xiàn)最少的用例能滿(mǎn)足MC/DC,可選的用例組合為:

    組合1:用例2、用例5、用例6、用例7組合2:用例3、用例5、用例6、用例7

即最少需要4條用例才能滿(mǎn)足MC/DC。

例如選擇組合1,將冗余的用例去除,得到如下表:

再來(lái)分析一次:

    對(duì)于條件x,使用用例2和6來(lái)測(cè)試,y和z的值相同(y=0,z=1),P1判定結(jié)果剛好是不同值(0和1)對(duì)于條件y,使用用例5和7來(lái)測(cè)試,x和z的值相同(x=1,z=0),P1判定結(jié)果剛好是不同值(0和1)對(duì)于條件z,使用用例5和6來(lái)測(cè)試,x和y的值相同(x=1,y=0),P1判定結(jié)果剛好是不同值(0和1)

最后,再來(lái)通過(guò)在流程圖上標(biāo)注來(lái)對(duì)比看下,加深理解:

4 總結(jié)

本篇介紹了軟件測(cè)試中,白盒測(cè)試中邏輯覆蓋的各種實(shí)例情況,包括語(yǔ)句覆蓋SC、判定覆蓋DC、條件覆蓋CC、條件判定覆蓋C/DC、條件組合覆蓋MCC、路徑覆蓋PC、修正的條件判定覆蓋MC/DC的實(shí)例。

推薦器件

更多器件
器件型號(hào) 數(shù)量 器件廠(chǎng)商 器件描述 數(shù)據(jù)手冊(cè) ECAD模型 風(fēng)險(xiǎn)等級(jí) 參考價(jià)格 更多信息
SN74LV244APW 1 Texas Instruments Eight-channel 2-V to 5.5-V buffers with tri-state outputs 20-TSSOP -40 to 125

ECAD模型

下載ECAD模型
$0.83 查看
HFBR-1414PZ 1 Avago Technologies FIBER OPTIC TRANSMITTER, 792-865nm, THROUGH HOLE MOUNT, ST CONNECTOR, ROHS COMPLIANT, PLASTIC, PACKAGE-8
$24.06 查看
570BAB000118DG 1 Silicon Laboratories Inc LVDS Output Clock Oscillator, 10MHz Min, 810MHz Max, 810MHz Nom, ROHS COMPLIANT PACKAGE-8

ECAD模型

下載ECAD模型
$22.24 查看

相關(guān)推薦

電子產(chǎn)業(yè)圖譜

控制科學(xué)與工程碩士,日常分享單片機(jī)、嵌入式、C/C++、Linux等學(xué)習(xí)經(jīng)驗(yàn)干貨~