您的位置:首页 > 其它

一个自动测试程序的编写

2009-08-21 19:13 218 查看
初来乍到Foxda,刚刚熟悉了下SigmaTel的SDK,BOSS就布置任务要做一个MP3的自动测试程序。意思就是编写一个程序在开机的时候自动读取一个文件,其中这个文件当中列出了按键步骤与间隔时间(完全由你自己定义),当程序读到的时候,就自动发出一个按键消息,除了开机,无需人手,全自动依照你文件中的步骤执行。对比起以往的手工测试,这样一来省了人力和时间,二来能够在人所不能接触的极端环境下对MP3进行测试。

进一步与BOSS和师兄沟通过之后,有了大概的思路:在MP3启动的过程中,建立一个定时器,由这个定时器定时读取某个文件的内容,而根据BOSS的指示,文件的格式大概是一行定义按键,一行定义间隔时间,然后发出相应的按键消息。

现在看来似乎并不困难,于是乎便开始动手。主要分三个阶段进行:

首先便是寻找按键消息的发送的方法,还好,由于师兄之前做过相关的工作,所以经他的指点很快就可以实现了。在sigmaTel的SDK里使用的是以下两句

BUILD_NONALLOCATED_MSG(&msg, OS_MSG_UI_GROUP, MSG_UI_BTN_EVENT, BTN_EVENT_IS(BTN_FF,EVENT_CLICK)); //意思是建立“FF(快进)键单击一次”的消息
tx_queue_send(g_ptx_queue_ui,&msg, 10);

所以这个问题很快就解决了。相信在其它相关的做MP3、手机的SDK里面都会有发送按键消息的函数,例如我现在在做的DV,就是在接收到按键消息之后,发送一个handler,所以在做自动测试的时候,只需要发送handler就可以达到与案件相同的效果了。也因此,我相信各种便携式产品都可以做出自动测试的程序,这样就可以减少测试人员的工作量,提高效率,在相对短的时间内发现更多问题。

接下来要做的是文件读写的操作。由于以前只编过一次有关文件读写的程序,所以在这里花费了很多的时间。主要是因为这里只能应用SDK自带的文件处理函数(原型定义有些奇怪),不能够直接调用C语言里的文件处理函数,尽管在我查看了SDK里文件处理函数的定义后发现最终它都是要调用C语言中的文件处理函数。不过不管怎样,终归也是自己C语言不过关,特此潜心研究C语言文件处理函数,专门开贴写给大家看。这里就不详述。

最后要做的就是加上定时器。虽然知道有定时器这么一回事,但是从来都没有用过,也遇到了一些困难。建立一个timer要5个参数,直到现在我都没有弄明白其中两个参数的意义,只好照葫芦画瓢,用上了。

tx_timer_create(&testtimer,"test1",moveup,0x1234,OS_MSECS_TO_TICKS(1000),OS_MSECS_TO_TICKS(1000), TX_AUTO_ACTIVATE);
在这里出现了一个很严重的问题,也是一个很典型的错误吧,也算是自己功底不够,希望能引起大家警醒。我不知道这样说好不好,一个timer的建立就好像是多开了一个线程,只不过这个线程只是隔一段事先设定好的时间去执行一个函数,也因此它的所有参数应该是一个全局变量性质的参数。问题就是在你建立timer的这个位置是任意的,可以在主函数里,也可以在任意一个需要执行多次甚至一次的其它函数里,主函数里面可能关系不大,但是在其它函数当中的时候要注意它的参数一定不能是在这个函数里定义的局部变量(嗯,这是某菜鸟连续死了半天的机才顿悟到的...)。此外还有一个间隔时间的问题,这个好解决,每次读到间隔时间的时候加上调用一个change函数,改变定时器的间隔时间就可以了,不过要注意的是在change之前要先deactive定时器,否则不起作用。

至此,所有的关键性的问题都解决了,于是也有了我第一版的函数,给BOSS演示了之后,BOSS又说希望我能再加一个循环,毕竟测试的时候有时候是需要重复做某些动作的。我想了想,初步感觉大概就是记录一下循环开始时候的文件指针吧,然后不断读这一段程序...虽然是有点笨,用了一次goto,但也算是一种方法,BOSS也没要求有嵌套,时间也紧,只好这样了。在此贴出来,让大家见笑了
void autotest(ULONG inputParam)
{
begin:
int i,j,k1=1,k2=1;
second=0;

rubbish=Fgetc(file);
while((rubbish==' ')||(rubbish=='/n')||(rubbish=='/r'))
{
rubbish=Fgetc(file);
}
if(rubbish=='}')
{
if(loopnumber>0)
{
Fseek(file,-numberofbytes,SEEK_CUR);
loopnumber--;
rubbish=Fgetc(file);
while((rubbish==' ')||(rubbish=='/n')||(rubbish=='/r'))
{
rubbish=Fgetc(file);
}

}
else
{
rubbish=Fgetc(file);
while((rubbish==' ')||(rubbish=='/n')||(rubbish=='/r'))
{
rubbish=Fgetc(file);
}
}
}

Fseek(file,-1L,SEEK_CUR);
Fread(file,test,5);

if(strncmp((char*)test,"#OVER",5)==0)
{
tx_timer_deactivate(&testtimer);
tx_timer_delete(&testtimer);
Fclose(file);
return;
}

for(i=0;i<7;i++)
{
if(strncmp((char*)test,str[i],4)==0)
{
switch(i)
{
case 0:
BUILD_NONALLOCATED_MSG(&msg, OS_MSG_UI_GROUP, MSG_UI_BTN_EVENT, BTN_EVENT_IS(BTN_FF, EVENT_CLICK));
tx_queue_send(g_ptx_queue_ui,&msg, 10);
break;
case 1:
BUILD_NONALLOCATED_MSG(&msg, OS_MSG_UI_GROUP, MSG_UI_BTN_EVENT, BTN_EVENT_IS(BTN_RW, EVENT_CLICK));
tx_queue_send(g_ptx_queue_ui,&msg, 10);
break;
case 2:
BUILD_NONALLOCATED_MSG(&msg, OS_MSG_UI_GROUP, MSG_UI_BTN_EVENT, BTN_EVENT_IS(BTN_PLAY, EVENT_CLICK));
tx_queue_send(g_ptx_queue_ui,&msg, 10);
break;
case 3:
BUILD_NONALLOCATED_MSG(&msg, OS_MSG_UI_GROUP, MSG_UI_BTN_EVENT, BTN_EVENT_IS(BTN_VOLUP, EVENT_CLICK));
tx_queue_send(g_ptx_queue_ui,&msg, 10);
break;
case 4:
BUILD_NONALLOCATED_MSG(&msg, OS_MSG_UI_GROUP, MSG_UI_BTN_EVENT, BTN_EVENT_IS(BTN_VOLDN, EVENT_CLICK));
tx_queue_send(g_ptx_queue_ui,&msg, 10);
break;
case 5:
BUILD_NONALLOCATED_MSG(&msg, OS_MSG_UI_GROUP, MSG_UI_BTN_EVENT, BTN_EVENT_IS(BTN_MENU, EVENT_CLICK));
tx_queue_send(g_ptx_queue_ui,&msg, 10);
break;
case 6:
rubbish=Fgetc(file);
while((rubbish==' ')||(rubbish=='/n')||(rubbish=='/r'))
{
rubbish=Fgetc(file);
}

millisecond[0]=rubbish;
i=0;
while((millisecond[i]!=' ')&&(millisecond[i]!='/n')&&(millisecond[i]!='/r'))
{
i++;
millisecond[i]=Fgetc(file);
}
loopnumber=0;
for(j=1;j<=i;j++)
{
loopnumber+=k1*(millisecond[i-j]&0xFF-'0');//1000*(millisecond[0]&0xFF-'0')+100*(millisecond[1]&0xFF-'0')+10*(millisecond[2]&0xFF-'0')+(millisecond[3]&0xFF-'0');
k1*=10;
}

rubbish=Fgetc(file);
while(rubbish!='{')
{
rubbish=Fgetc(file);
}
numberofbytes=0;
while(rubbish!='}')
{
rubbish=Fgetc(file);
numberofbytes++;
}
Fseek(file,-numberofbytes,SEEK_CUR);
loopnumber--;
goto begin;
//return;
default:
break;
}
}
}
rubbish=Fgetc(file);
while((rubbish==' ')||(rubbish=='/n')||(rubbish=='/r'))
{
rubbish=Fgetc(file);
}

millisecond[0]=rubbish;
i=0;
while((millisecond[i]!=' ')&&(millisecond[i]!='/n')&&(millisecond[i]!='/r'))
{
i++;
millisecond[i]=Fgetc(file);
}
for(j=1;j<=i;j++)
{
second+=k2*(millisecond[i-j]&0xFF-'0');//1000*(millisecond[0]&0xFF-'0')+100*(millisecond[1]&0xFF-'0')+10*(millisecond[2]&0xFF-'0')+(millisecond[3]&0xFF-'0');
k2*=10;
}

tx_timer_deactivate(&testtimer);
tx_timer_change(&testtimer,OS_MSECS_TO_TICKS(second),OS_MSECS_TO_TICKS(3000));
tx_timer_activate(&testtimer);

}


还有一些全局变量的定义就不贴出来了,大家大概都知道哪些是全局变量吧,代码可能还需要注释。

后来又加了一个建立timer的函数,执行一次testtimercreate之后,就固定时间调用上面的test函数,触发按键,达到自动测试的效果。

void testtimercreate(void)
{
rubbish=Fgetc(file);
while(rubbish!='#')
{
rubbish=Fgetc(file);
}
Fread(file,test,5);
if(strncmp((char*)test,"BEGIN",4)==0)
{
tx_timer_create(&testtimer,"test1",moveup,0x1234,OS_MSECS_TO_TICKS(1000),OS_MSECS_TO_TICKS(1000), TX_AUTO_ACTIVATE);
}
else
{
Fclose(file);
}
}


再贴上我的自动测试程序,嗯~我设计的~格式可以比较随意

BEGIN之前是注释 最后要用OVER结尾 其中间隔时间不建议小于50 太小会造成死机!!

#BEGIN

MENU 1000

FOR  30
{
RIGHT    100
}

FOR   5
{
LEFT   100

}

PLAY  300

FOR   40
{

LEFT
50

}

FOR   40
{
RIGHT
50
}

#OVER


至此,总算是完成了一项任务,虽然显得笨手笨脚,但还是满意的,也希望大家能够提出一些意见,谢谢~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐