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

  • 創(chuàng)作內(nèi)容快速變現(xiàn)
  • 行業(yè)影響力擴(kuò)散
  • 作品版權(quán)保護(hù)
  • 300W+ 專業(yè)用戶
  • 1.5W+ 優(yōu)質(zhì)創(chuàng)作者
  • 5000+ 長期合作伙伴
立即加入
  • 正文
  • 推薦器件
  • 相關(guān)推薦
  • 電子產(chǎn)業(yè)圖譜
申請入駐 產(chǎn)業(yè)圖譜

嵌入式,可測試性軟件設(shè)計(jì)!

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

大家好,我是雜燴君。

本次我們來介紹嵌入式可測試軟件設(shè)計(jì)。

什么是可測試性?就是你這個(gè)軟件模塊/函數(shù)接口寫完之后,可以較為方便、較為全面地進(jìn)行自測?。

舉個(gè)簡單的例子來認(rèn)識(shí)可測試性軟件。

有一個(gè)計(jì)算函數(shù)cal_func,其計(jì)算依賴于存在flash里的數(shù)據(jù)a,與一個(gè)外部輸入的數(shù)據(jù)b。

此時(shí),有如下兩種實(shí)現(xiàn)方法:

方法一:

int?get_a_from_flash(void)
{
?int?a?=?0;
?flash_read(&a,?sizeof(int));
?
?return?a;
}

int?cal_func(int?b)
{
?int?res?=?0;
?int?a?=?get_a_from_flash();
?
?res?=?a?+?b;
?
?return?res;
}

//?調(diào)用
cal_func(5);

方法二:

int?get_a_from_flash(void)
{
?int?a?=?0;
?flash_read(&a,?sizeof(int));
?
?return?a;
}

int?cal_func(int?a,?int?b)
{
?int?res?=?0;
?
?res?=?a?+?b;
?
?return?res;
}

//?調(diào)用
cal_func(get_a_from_flash(),?5);

這種類似場景,實(shí)際開發(fā)中應(yīng)該有不少,大家平時(shí)都是按照方式一寫代碼還是方式二寫代碼呢?

從可測試性的角度來看, 方法二的實(shí)現(xiàn),更具備可測試性 。

方式一,因?yàn)橛幸粋€(gè)數(shù)據(jù)是在函數(shù)內(nèi)部從flash中讀取的,所以這個(gè)數(shù)據(jù)我們不太方便進(jìn)行控制,而能控制的只有參數(shù)b。那么,這樣子,我們在調(diào)用測試時(shí),測得就不是很全,也不能靈活地控制測試路徑。

方式二,計(jì)算所依賴的數(shù)據(jù)都通過函數(shù)參數(shù)留出來了,我們可以很方便地對函數(shù)進(jìn)行測試,可以很方便地輸入不同的數(shù)據(jù)組合。

并且,一般地,我們會(huì)引入一些 單元測試框架 ,用來統(tǒng)一管理我們的測試?yán)印?/p>

嵌入式中,常用的測試框架:

    Unity:https://github.com/ThrowTheSwitch/Unity/releasescutest:https://sourceforge.net/projects/cutest/embunit :https://sourceforge.net/projects/embunitgoogletest:https://github.com/google/googletest/releases

使用測試框架之后,針對cal_func函數(shù)設(shè)計(jì)的測試代碼如:

int?ut_cal_func(int?argc,?char?*argv[])
{
????if?(argc?!=?3)
????{
????????printf("Param?num?errn");
????????return?USAGE;
????}

????//?預(yù)期結(jié)果
????int?expected_res?=?atoi(argv[2]);?
????//?實(shí)際結(jié)果??????????????????
?int?res?=?cal_func(atoi(argv[0]),?atoi(argv[1]));???

????if?(expected_res?==?res)
????{
????????printf("input?%d,?%d,?test?pass!n",?atoi(argv[0]),?atoi(argv[1]));
????}
????else
????{
????????printf("input?%d,?%d,?test?failed!n",?atoi(argv[0]),?atoi(argv[1]));
????}

?return?0;
}

我們封裝成串口測試指令:

//?測試路徑1
ut?app?ut_cal_func?1?2?3
????
//?測試路徑2
ut?app?ut_cal_func?2?3?5
????
//?...

輸出:

input?1,?2,?test?pass!
input?2,?3,?test?pass!

這就是一個(gè)可測試性軟件設(shè)計(jì)的一個(gè)小例子,通過這個(gè)小例子大家應(yīng)該認(rèn)識(shí)到可測試性軟件的好處了吧?

所以,之后寫代碼,寫之前,有必要先想清楚,這個(gè)模塊最后要怎么進(jìn)行自測?要測哪些地方?

設(shè)計(jì)的軟件可測試性強(qiáng),我們就能在開發(fā)階段進(jìn)行充分地測試,在開發(fā)階段盡可能多地解決一些邏輯上的問題,從而保證更高質(zhì)量地軟件交付。

以上就是本次的分享,歡迎收藏、轉(zhuǎn)發(fā)!

推薦器件

更多器件
器件型號(hào) 數(shù)量 器件廠商 器件描述 數(shù)據(jù)手冊 ECAD模型 風(fēng)險(xiǎn)等級(jí) 參考價(jià)格 更多信息
LTC6993CS6-2#TRMPBF 1 Analog Devices Inc LTC6993CS6-2#TRMPBF

ECAD模型

下載ECAD模型
$3.63 查看
CC3100MODR11MAMOBT 1 Texas Instruments SimpleLink™ Wi-Fi CERTIFIED™ network processor module for Internet-of-Things with 2 TLS/SSL 63-QFM -20 to 70
$17.55 查看
S29AL016J70TFI020 1 Cypress Semiconductor Flash, 1MX16, 70ns, PDSO48, TSOP-48
$10.3 查看

相關(guān)推薦

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

本公眾號(hào)專注于嵌入式技術(shù),包括但不限于C/C++、嵌入式、物聯(lián)網(wǎng)、Linux等編程學(xué)習(xí)筆記,同時(shí),公眾號(hào)內(nèi)包含大量的學(xué)習(xí)資源。歡迎關(guān)注,一同交流學(xué)習(xí),共同進(jìn)步!