背景:
實踐單元測試一段時間了,感覺十分有用,具體單元測試的好處,這邊不描述,單元測試的基本概念,這裏也不描述了。本文章是介紹單元測試在嵌入式開發的應用。
我這邊使用的單元測試框架是:Unity,一個輕量級的單元測試框架,C語言編寫,方便移植和裁剪。
Unity的相關資料源碼可以從Github上下載,開源的。單元測試的優點也可以從CSDN其它博客中找到。
本文會以TDD爲指導原則,先寫測試用例定義被測函數的功能,再在被測函數中實現這個功能,全部用C語言實現。
簡介
代碼架構介紹
講解下添加單元測試後的代碼結構:
1. 代碼比較簡單:
2. 系統存在多個子系統或者模塊的
單元測試的運行:
-
IDE
-
目標硬件上運行
-
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!