一个自动测试程序的编写
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也没要求有嵌套,时间也紧,只好这样了。在此贴出来,让大家见笑了
还有一些全局变量的定义就不贴出来了,大家大概都知道哪些是全局变量吧,代码可能还需要注释。
后来又加了一个建立timer的函数,执行一次testtimercreate之后,就固定时间调用上面的test函数,触发按键,达到自动测试的效果。
再贴上我的自动测试程序,嗯~我设计的~格式可以比较随意
至此,总算是完成了一项任务,虽然显得笨手笨脚,但还是满意的,也希望大家能够提出一些意见,谢谢~
进一步与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
至此,总算是完成了一项任务,虽然显得笨手笨脚,但还是满意的,也希望大家能够提出一些意见,谢谢~
相关文章推荐
- 编写一个能自动生成小学四则运算题目的程序。
- 编写一个能自动生成小学四则运算题目的程序
- (1)写一个程序,用于分析一个字符串中各个单词出现的频率,并将单词和它出现的频率输出显示。(单词之间用空格隔开,如“Hello World My First Unit Test”); (2)编写单元测试进行测试; (3)用ElcEmma查看代码覆盖率,要求覆盖率达到100%。
- 有一个帐号类,包含有(id、用户名和密码),编写程序使用List接口来存储多个帐号对象,注意id是自动生成(规则是为List中所有帐号中最大的id再加1)
- 编写一个使用数组类模板Array对数组进行排序、求最大值和求元素和的程序,并采用相关数据进行测试。
- 《JAVA继承与多态》改写程序清单10-6中的Course类,编写一个测试类测试所有的方法
- 编写一个函数,接受三个string参数,s,oldVal和newVal。使用迭代器及insert和erase函数将s中所有oldVal替换为newVal。测试你的程序,用他替换通用的简写形式,如,将“tho”,将“”“”
- 作业二:编写一个自动生成四则运算的程序
- 如何编写一个自动投票程序
- 作业二:个人编程项目——编写一个能自动生成小学四则运算题目的程序
- 如何编写一个自动投票程序
- 编写一个程序,用于测试标准输入文件是否能使用lseek函数来设置位移量
- 编写一个Android Linux内核驱动并用C可执行程序测试
- 编写一个jsp程序,实现用户登录,当用户输入的用户或密码错误时,将页面重定向到错误提示页,并在该页面显示30秒后 自动回到用户登录界面
- 编写一个程序对Largest函数进行测试,找出一组数据的最大值
- 如何编写一个自动投票程序
- 编写一个单文档界面应用程序,该程序可以测试在鼠标左键按下时鼠标光标的位置是否处在某规定的矩形框内,如果不在该矩形内则计算机的扬声器会发出“叮”的声音,反之则会在用户区显示光标的位置。
- 编写一个函数,返回一个int数组中存储的最大数值,并在一个简单的程序中测试这个函数。(有缺陷)
- 如何编写一个自动投票程序
- 如何编写一个自动投票程序