分享一個(gè)自己量產(chǎn)項(xiàng)目上的集成測(cè)試軟件MTTEST
好久沒(méi)寫(xiě)公眾號(hào)了,最近兩個(gè)月基本忙成狗,沒(méi)辦法,工作和家庭都要相互兼顧,有了個(gè)小寶寶以后好多時(shí)間都沒(méi)那么自由啦,2020年第一篇就來(lái)分享一個(gè)剛畢業(yè)的時(shí)候?qū)懙囊粋€(gè)量產(chǎn)測(cè)試工具吧,采用的是C語(yǔ)言來(lái)編寫(xiě),剛開(kāi)始應(yīng)用在Linux和Android平臺(tái)上,后面通過(guò)移植也用在單片機(jī)上,使用起來(lái)非常簡(jiǎn)單,讓我們來(lái)看看怎么回事。
一、主程序源碼分析
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ù)的名稱(chēng)
pchar Find_Work_Name(_work headler,pchar work_name);
//執(zhí)行子任務(wù)----根據(jù)任務(wù)名稱(chēng)來(lái)執(zhí)行
s32 Run_work_for_work_name(_work headler,pchar work_name);
//銷(xiāo)毀一個(gè)子任務(wù)
s32 Destroy_cwork(_work headler,pchar work_name);
//銷(xiāo)毀全部任務(wù)
_work Destroy_work(_work headler,_work array);
//工作優(yōu)先級(jí)調(diào)度執(zhí)行--->工作編號(hào)小的優(yōu)先級(jí)高,依次類(lèi)推
s32 Run_Priority_work(_work handler,s32 direction,const s32 work_array_size);
通過(guò)宏調(diào)用各個(gè)子函數(shù)完成任務(wù)的初始化,注冊(cè)、執(zhí)行、銷(xiāo)毀,這個(gè)過(guò)程是由一個(gè)鏈表來(lái)實(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ù)名稱(chēng)
pchar work_name ;
//根據(jù)相應(yīng)的任務(wù)名稱(chēng),處理相應(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)建了一條線(xiàn)程,這個(gè)過(guò)程是在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 ;}
核心的部分也就這些了,接下來(lái)講講怎么用吧。
二、使用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ù)名稱(chēng)
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語(yǔ)言測(cè)試框架
C語(yǔ)言strstr函數(shù)解析自定義協(xié)議參數(shù)
深入淺出剖析C語(yǔ)言函數(shù)指針與回調(diào)函數(shù)
C語(yǔ)言數(shù)組結(jié)合位運(yùn)算實(shí)戰(zhàn)-位移與查表
我的創(chuàng)業(yè)故事
2019年和同學(xué)一起注冊(cè)了一家公司—深圳云之手科技有限公司,主要是物聯(lián)網(wǎng)相關(guān)產(chǎn)品的開(kāi)發(fā),目前任副總經(jīng)理職位,我主要負(fù)責(zé)的是企業(yè)的經(jīng)營(yíng)和管理,由于人員還沒(méi)有那么多,所以偶爾也會(huì)兼任產(chǎn)品的研發(fā)管理,如果各位有客戶(hù)需要開(kāi)發(fā)相關(guān)產(chǎn)品可以通過(guò)以下名片聯(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),如有問(wèn)題,請(qǐng)聯(lián)系我們,謝謝!





