大家好,我是雜燴君。
什么是可測試性?就是你這個(gè)軟件模塊/函數(shù)接口寫完之后,可以較為方便、較為全面地進(jìn)行自測?。
舉個(gè)簡單的例子來認(rèn)識可測試性軟件。
有一個(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ù)組合。
并且,一般地,我們會引入一些 單元測試框架
,用來統(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)識到可測試性軟件的好處了吧?
所以,之后寫代碼,寫之前,有必要先想清楚,這個(gè)模塊最后要怎么進(jìn)行自測?要測哪些地方?
設(shè)計(jì)的軟件可測試性強(qiáng),我們就能在開發(fā)階段進(jìn)行充分地測試,在開發(fā)階段盡可能多地解決一些邏輯上的問題,從而保證更高質(zhì)量地軟件交付。
以上就是本次的分享,歡迎收藏、轉(zhuǎn)發(fā)!