分享一個(gè)自己量產(chǎn)項(xiàng)目上的集成測(cè)試軟件MTTEST
好久沒寫公眾號(hào)了,最近兩個(gè)月基本忙成狗,沒辦法,工作和家庭都要相互兼顧,有了個(gè)小寶寶以后好多時(shí)間都沒那么自由啦,2020年第一篇就來分享一個(gè)剛畢業(yè)的時(shí)候?qū)懙囊粋€(gè)量產(chǎn)測(cè)試工具吧,采用的是C語言來編寫,剛開始應(yīng)用在Linux和Android平臺(tái)上,后面通過移植也用在單片機(jī)上,使用起來非常簡(jiǎn)單,讓我們來看看怎么回事。
一、主程序源碼分析
int main(void)
{
s32 i ;
//初始化測(cè)試系統(tǒng)
INIT_TEST_SYSTEM();
//定義頭指針,初始化頭節(jié)點(diǎn)
INIT_WORK(work_node);
for(i = ZERO ; i < NR(work_Register) ; i++)
{
//實(shí)現(xiàn)工作任務(wù)的注冊(cè)
REGISTER_WORK(work_node , create_cwork(work_Register[i].work_num ,work_Register[i].work_name , work_Register[i].work_handler));
}
//調(diào)度工作任務(wù),編號(hào)從小到大排序
SCHEDULING_WORK(work_node,Positive,NR(work_Register));
while(True)
{
;
}
DESTROY_WORK(work_node,work_Register);
return SUCCESS ;
}
這段程序的核心框架由四部分組成:
INIT_WORK
REGISTER_WORK
SCHEDULING_WORK
DESTROY_WORK
如果你不去追,你可能以為這是四個(gè)定義好的函數(shù),別被它的表面欺騙了,其實(shí)它們是宏,宏的下面一級(jí)才是函數(shù)的實(shí)現(xiàn):
#define __INIT_WORK(_work) \
do{ \
_work =Init_cwork(_work); \
}while(0)
#define INIT_WORK(work_node) \
_work work_node = NULL ; \
__INIT_WORK(work_node);
#define REGISTER_WORK(__work,new_work) \
Register_work_fuc(__work,new_work);
#define SCHEDULING_WORK(work_node,direction,array_size) \
Run_Priority_work(work_node,direction,array_size);
#define DESTROY_WORK(work_node,array) \
work_node =Destroy_work(work_node ,array);
各個(gè)子函數(shù)的實(shí)現(xiàn):
//初始化一個(gè)子任務(wù)
_work Init_cwork();
//創(chuàng)建一個(gè)子任務(wù)
_work create_cwork(s32 work_num,pchar work_name ,work_fun work_fuc);
//注冊(cè)子任務(wù)
No_returnRegister_work_fuc(_work __work,_work new_work);
//查找子任務(wù)的編號(hào)
s32 Find_Work_Num(_work headler,s32 work_num);
//查找子任務(wù)的名稱
pchar Find_Work_Name(_work headler,pchar work_name);
//執(zhí)行子任務(wù)----根據(jù)任務(wù)名稱來執(zhí)行
s32 Run_work_for_work_name(_work headler,pchar work_name);
//銷毀一個(gè)子任務(wù)
s32 Destroy_cwork(_work headler,pchar work_name);
//銷毀全部任務(wù)
_work Destroy_work(_work headler,_work array);
//工作優(yōu)先級(jí)調(diào)度執(zhí)行--->工作編號(hào)小的優(yōu)先級(jí)高,依次類推
s32 Run_Priority_work(_work handler,s32 direction,const s32 work_array_size);
通過宏調(diào)用各個(gè)子函數(shù)完成任務(wù)的初始化,注冊(cè)、執(zhí)行、銷毀,這個(gè)過程是由一個(gè)鏈表來實(shí)現(xiàn)的:
typedefstruct __Work
{
//任務(wù)編號(hào)
//根據(jù)任務(wù)編號(hào)決定工作任務(wù)的優(yōu)先級(jí)
//編號(hào)越小,優(yōu)先級(jí)越高
s32 work_num ;
//任務(wù)名稱
pchar work_name ;
//根據(jù)相應(yīng)的任務(wù)名稱,處理相應(yīng)的任務(wù)
void(*work_handler)(int);
struct __Work *next;
}work;
typedef work * _work ;
由于這是一個(gè)集成測(cè)試工具,所以存在著任務(wù)的并行執(zhí)行,所以當(dāng)執(zhí)行一個(gè)任務(wù)的時(shí)候其實(shí)就創(chuàng)建了一條線程,這個(gè)過程是在Run_Priority_work里實(shí)現(xiàn)的。
s32 Run_Priority_work(_work handler,s32 direction,const s32 work_array_size)
{
s32 count = 0 ;
s32 i ;
assert(handler != NULL);
_work temp = handler->next ;
s32 Curent_node_Array[work_array_size];
while(temp != NULL){
Curent_node_Array[count] = temp->work_num ;
temp = temp->next ;
if(count < work_array_size)
count++ ;
}
Sort_work_num(Curent_node_Array,NR(Curent_node_Array),direction) ;
for(i = 0 ; i < NR(Curent_node_Array) ; i++)
Run_work_for_work_num(handler,Curent_node_Array[i]);
return SUCCESS ;
}
核心的部分也就這些了,接下來講講怎么用吧。
二、使用MTTEST實(shí)現(xiàn)并行測(cè)試項(xiàng)
main.c的代碼一句都不用動(dòng),如果你要添加一個(gè)并行的測(cè)試項(xiàng)目,只需要在結(jié)構(gòu)體數(shù)組里聲明好,定義好測(cè)試任務(wù)函數(shù)就可以了,具體使用方法如下:
//按鍵測(cè)試
intTpad_Key_Test(int work_num);
//Gsensor測(cè)試
intTpad_Gsensor_Test(int work_num);
//時(shí)鐘測(cè)試
int RTC_Test(int work_num);
//電池電量測(cè)試
intBattery_Capacity_Test(int work_num);
//電池狀態(tài)測(cè)試
intBattery_Status_Test(int work_num);
//內(nèi)存測(cè)試
int DDR_Test(int work_num);
//EMMC測(cè)試
int EMMC_Test(int work_num);
//SD卡測(cè)試
int SD_Test(int work_num);
//WIFI MAC地址讀取測(cè)試
int NVRAM_WIFI_MAC_ADDRESS_READ_TEST(int work_num);
//WIFI ssid獲取測(cè)試
int WIFI_SSID_Test(int work_num);
//LCD RGB測(cè)試
int LCD_Test(int work_num);
//初始化測(cè)試系統(tǒng)
int INIT_TEST_SYSTEM();
//Camera旋轉(zhuǎn)按鍵測(cè)試
int camera_rotate_test(int work_num);
//結(jié)構(gòu)體數(shù)組描述:
/*
ep:
{1,"LCD_Test",LCD_Test},
1表示任務(wù)編號(hào),同時(shí)也表示在LCD的哪一行進(jìn)行顯示
"LCD_Test"表示任務(wù)名稱
LCD_Test表示任務(wù)執(zhí)行函數(shù)
*/
work work_Register[]=
{
{1,"Tpad_Key_Test",Tpad_Key_Test},
{2,"Tpad_Gsensor_Test",Tpad_Gsensor_Test},
{3,"RTC_Test",RTC_Test},
{4,"Battery_Capacity_Test",Battery_Capacity_Test},
{5,"Battery_Status_Test",Battery_Status_Test},
{6,"DDR_Test",DDR_Test},
{7,"EMMC_Test",EMMC_Test},
{8,"SD_Test",SD_Test},
{9,"NVRAM_WIFI_MAC_ADDRESS_READ_TEST",NVRAM_WIFI_MAC_ADDRESS_READ_TEST},
{10,"WIFI_SSID_Test",WIFI_SSID_Test},
#ifndef __PLAN_A
{11,"camera_rotate_test",camera_rotate_test},
#endif
{12,"LCD_Test",LCD_Test},
};
預(yù)知詳情,請(qǐng)?jiān)敿?xì)看看我分享的項(xiàng)目代碼,注釋很詳細(xì)。
三、分享鏈接
鏈接:https://pan.baidu.com/s/1rPjS2r1-JgmzhF1nFhc0Kg
提取碼:dlv3
往期分享
分享一個(gè)非常有用且簡(jiǎn)單C語言測(cè)試框架
C語言strstr函數(shù)解析自定義協(xié)議參數(shù)
深入淺出剖析C語言函數(shù)指針與回調(diào)函數(shù)
C語言數(shù)組結(jié)合位運(yùn)算實(shí)戰(zhàn)-位移與查表
我的創(chuàng)業(yè)故事
2019年和同學(xué)一起注冊(cè)了一家公司—深圳云之手科技有限公司,主要是物聯(lián)網(wǎng)相關(guān)產(chǎn)品的開發(fā),目前任副總經(jīng)理職位,我主要負(fù)責(zé)的是企業(yè)的經(jīng)營和管理,由于人員還沒有那么多,所以偶爾也會(huì)兼任產(chǎn)品的研發(fā)管理,如果各位有客戶需要開發(fā)相關(guān)產(chǎn)品可以通過以下名片聯(lián)系我,推薦成功的朋友有現(xiàn)金提成,絕對(duì)不低!
企業(yè)介紹
免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。文章僅代表作者個(gè)人觀點(diǎn),不代表本平臺(tái)立場(chǎng),如有問題,請(qǐng)聯(lián)系我們,謝謝!