嵌入式單元測試實踐介紹 - 0

背景:      

       實踐單元測試一段時間了,感覺十分有用,具體單元測試的好處,這邊不描述,單元測試的基本概念,這裏也不描述了。本文章是介紹單元測試在嵌入式開發的應用。

        我這邊使用的單元測試框架是:Unity,一個輕量級的單元測試框架,C語言編寫,方便移植和裁剪。

        Unity的相關資料源碼可以從Github上下載,開源的。單元測試的優點也可以從CSDN其它博客中找到。

        本文會以TDD爲指導原則,先寫測試用例定義被測函數的功能,再在被測函數中實現這個功能,全部用C語言實現。

簡介

代碼架構介紹

        講解下添加單元測試後的代碼結構:

         1. 代碼比較簡單:

         2. 系統存在多個子系統或者模塊的

 

單元測試的運行:

  1. IDE

  2. 目標硬件上運行

  3. Linux下運行

開始

        我eMMC協議的CMD6處理爲例子,建立單元測試的相關測試用例,爲什麼要用CMD6處理函數爲被測試對象呢,因爲我正在寫測試用例覆蓋這個模塊。.如果不瞭解eMMC協議的,沒有關係,邏輯其實不復雜,下面會以簡單的說明去介紹。

首個測試用例

根據協議描述,如果CMD6操作了EXTCSD192 - 255區域,device應該不做任何修改,並且設置“SWITCH_ERROR”狀態。

The Index field can contain any value from 0–255, but only values 0–191 are valid values. If the Index value is in 192-255 range the Device does not perform any modification and the SWITCH_ERROR status bit is set.

 測試用例簡介,

         CMD6操作偏移設置爲192進行訪問,argument是CMD6的參數,4BYTE,每個byte代表不同的含義,其中[16:23]指存取的index。

         其中emmc_initial_status()爲初始化device status爲正常,emmc_get_status()是獲取device當前的狀態。

static void tst_cmd6_access_invalid_index(void)
{
       BYTE ret;
       BYTE command_set = 0;
       BYTE value = 0;
       BYTE index = 0;
       BYTE access_mode = 0;
       UINT argument;
       EXT_CSD extcsd;
       
       emmc_initial_status();                // 初始化device status爲normal status

       index = 192;
       argument = ((UINT)access_mode << 24) | ((UINT)index << 16) | ((UINT)value  << 8) | command_set;

       ret = emmc_cmd6(argument, &extcsd);

       TEST_ASSERT_EQUAL_INT8(FALSE, ret);    // 被測函數檢測到異常,返回false
       TEST_ASSERT_EQUAL_INT8(SWITCH_ERROR, emmc_get_status());
}

 被測函數如下:

BYTE emmc_cmd6(UINT argument, EXT_CSD *pextcsd)
{
    return TRUE;       
}

把測試用例添加到測試套件中:

int tstSuite_cmd6(void)
{
       UNIT_regSetupFunc(Setup);
       UNIT_regTeardownFunc(TearDown);
       UnityBegin(__FILE__);

       RUN_TEST(tst_cmd6_access_invalid_index);

       UNIT_regSetupFunc(NULL);
       UNIT_regTeardownFunc(NULL);
       return UnityEnd();
}

運行測試,並且輸出結果:

>>>>
..\unittest\ts_cmd6\tsuite_cmd6.c:87:tst_cmd6_access_invalid_index:FAIL: Expected 0 Was 1


-----------------------
1 Tests 1 Failures 0 Ignored
FAIL

OK,結果肯定是fail的。我們修改被測代碼以讓測試可以pass,修改內容:在檢測到異常時返回FALSE,並且在index >= 192時設置device status爲SWITCH_ERROR”,修改過程略...修改後如下

BYTE emmc_cmd6(UINT argument, EXT_CSD *pextcsd)
{
       BYTE index = (BYTE)(argument >> 16);

       if (index >= 192)
       {
              emmc_set_status(SWITCH_ERROR);
              return FALSE;
       }

       return TRUE;
}

測試通過,輸出界面如下:

>>>>
..\..\..\unitTest\ts_cmd6\tSuite_cmd6.c:126:tst_cmd6_access_invalid_index:PASS


-----------------------
1 Tests 0 Failures 0 Ignored
OK

總結:

1. 今天簡單介紹了單元測試,實現了一個測試用例,並且讓測試通過。下次我們再介紹更多的應用。3Q!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章