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

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

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

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

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

1 基礎(chǔ)示例

1.1 例題一

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

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;

分析:

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

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

1.2 例題二

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

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

分析:

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

1.3 例題三

有如下程序,滿足判定覆蓋至少需要幾條測試用例?

 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組成了所有的判斷,滿足判定覆蓋,即需要讓所有的判定各取true和false。最簡單直觀的是用4條用例n=0; n=1; n=2; n=-1即可滿足,注意到程序里有遞歸調(diào)用,實(shí)際上取n=2,會調(diào)用return func(1) + func(0) + func(-1) ;即可滿足。

2 進(jìn)階示例

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

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

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

2.1 語句覆蓋SC

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

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

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

2.2 判定覆蓋DC

設(shè)計(jì)滿足判定覆蓋(DC)的測試用例,即運(yùn)行完測試用例,使得程序中每個(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ì)滿足條件覆蓋(CC)的測試用例,即運(yùn)行完測試用例,使得程序中每個(gè)邏輯條件的可能值至少被滿足一次。

用例數(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ì)滿足條件判定覆蓋(C/DC)的測試用例,即運(yùn)行完測試用例,使得程序中每個(gè)判斷的True和False分支至少被執(zhí)行一次,同時(shí),使得程序中每個(gè)邏輯條件的可能值至少被滿足一次。

用例數(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ì)滿足組合覆蓋(MCC)的測試用例,即運(yùn)行完測試用例,使得程序中每個(gè)判斷的所有可能條件取值的組合至少被滿足一次。

注意幾點(diǎn):

    條件組合只針對同一個(gè)判斷語句內(nèi)存在多個(gè)條件的情況不同的判斷語句內(nèi)的條件直接無需組合對于單條件的判斷語句,只需滿足自己的所有取值即可
用例數(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ì)滿足路徑覆蓋(PC)的測試用例,即運(yùn)行完測試用例,使得程序中每條路徑至少被覆蓋一次。

用例數(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ù)量的測試用例,滿足以下條件:

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

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

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

先畫出流程圖,這里給出兩種畫法:

對于修正的條件判定覆蓋:

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

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

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

觀察表格:

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

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

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

即最少需要4條用例才能滿足MC/DC。

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

再來分析一次:

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

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

4 總結(jié)

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

推薦器件

更多器件
器件型號 數(shù)量 器件廠商 器件描述 數(shù)據(jù)手冊 ECAD模型 風(fēng)險(xiǎn)等級 參考價(jià)格 更多信息
SN65HVD230DR 1 Texas Instruments 3.3 V CAN Transceiver with Standby Mode 8-SOIC -40 to 85

ECAD模型

下載ECAD模型
$2.94 查看
AT27C256R-70JU 1 Microchip Technology Inc IC OTP 256KBIT 70NS 32PLCC

ECAD模型

下載ECAD模型
$4.08 查看
HFBR-1524Z 1 Broadcom Limited Transmitter, 1Mbps, DIP, Through Hole Mount, ROHS COMPLIANT PACKAGE

ECAD模型

下載ECAD模型
$14.54 查看

相關(guān)推薦

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

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