自动化测试程序之二模拟触摸屏点击事件和滑动事件(C语言)

一、测试程序编写说明 终端设备上运行的是LINUX+QT应用程序,使用触摸屏进行人机交互。经过测试人员长时间的人机交互测试,来确认系统的功能是否满足需求后。现在需要编写一个自动化的测试程序模拟触摸屏点击事件和滑动,并能够按照测试人员预设的脚本执行,比如在屏幕的某个位置需要点击某个按钮,或是屏幕或是列表需要滑动,并且这一个或几个动作需要连续执行10000次或更多。通过这样的自动测试,可以减轻测试人员的负担,还可以查看画面按钮触发N次后,画面执行N次后的系统的稳定性,如内存使用率(内存是否泄漏),cup使用率(负载是否很高)等等。

二、测试程序的结构分析

根据上述的简单要求,先分析测试程序的基本逻辑结构是程序通过读脚本中动作以及坐标来执行。 脚本文件以TXT文本形式记录, P表示点击操作,P x y 3000:点击(x,y)点后等待3000毫秒做下一个动作 S表示滑动操作,S x1 y1 x2 y2 2000:从(x1,y1)点滑动到(x2,y2)点,等待2000毫秒做下一个动作 当前只支持垂直或是水平匀速滑动。(屏幕任意两点的滑动暂时不支持) R表示重复,R Rounds Ln:表示以下Ln行重复Rounds次,该指令是可选的,如果不写顺序执行脚本。 脚本文本文件示例如下: ——–Sample1.txt————–

R 15000 2P 973 545 1000 goButtonP 630 750 1000 BackButton

表示点击两个按钮,这两个点击按钮动作循环执行15000次,每次点击指定的坐标后,等待1000毫秒。

——–Sample2.txt————–

R 10000 2S 200 300 801 300 5000 SlidingLeftToRightS 800 100 202 100 5000 SlidingRightToLeft

表示在当前页面左右滑动,先由点(200,300)水平向右滑动到点(801,300),sleep 5秒,再由点(800,100)水平向左滑动懂点(202,100),sleep 5秒。

三、测试程序实现主要逻辑 1、定义链表结构

typedef struct List {int operIndex;char operation;i_StartY; i_EndY;i_repeatLine;//以下动作重复的行数FLAG c_flag;List *nextGp; //指针域 struct List *repeatStart;//设定重复的头的位置}List; List *oprtData_Set;

2、上报输入事件(input_event)

int reportkey(int fd, uint16_t type, uint16_t code, int32_t value) {struct input_event event;event.type = type;event.code = code;event.value = value;gettimeofday(&event.time, 0);if (write(fd, &event, sizeof(struct input_event)) < 0) {printf(“report key error!\n”);return -1;}return 0; }

3、尾插法构造动作序列的链表

void TailCreatList(List *L,char * fname) //尾插法建立链表 {List *tmpData;List *tail ;List *pRepeatHeader;int i_repeatCnt = 0;int i_repeatLines = 0;char c_repeatID;REPEAT flag = NoRepeatPos; //char buffer[512];char c_Oper_temp;FILE *infile;infile=fopen(fname,”r”);int index=0;tail=L; //NULLpRepeatHeader=tail->nextGp;//NULLif(infile==NULL){printf(“\nFailed to open the file : %s \n”,fname);exit(0);}else{printf(“open success! \n”);}memset(buffer,0,sizeof(buffer));while ( fgets(buffer, sizeof(buffer), infile)){tmpData=(struct List*)malloc(sizeof(struct List));if(!tmpData){printf(“malloc() error@TailCreatList \n”);exit(0);}memset(tmpData,0,sizeof(struct List));tmpData->nextGp=NULL;tmpData->repeatStart=NULL;sscanf(buffer,”%c”,&c_Oper_temp);if(c_Oper_temp == ‘p’ || c_Oper_temp == ‘P’ ) // 点击事件{index++;sscanf( buffer,”%c %d %d %d %s”,&(tmpData->operation),&(tmpData->i_StartX),&(tmpData->i_StartY),&(tmpData->microseconds),&(tmpData->str_note));tmpData->operIndex=index;tmpData->nextGp=NULL;tmpData->repeatStart=NULL; //初始化结构体if(flag == RepeatPos ) //设定头指针{tmpData->i_repeatCnt=i_repeatCnt;tmpData->i_repeatLine=i_repeatLines; //处于循环位置的第一个节点,设置循环次数和循环的行数pRepeatHeader = tmpData;tmpData->repeatStart = pRepeatHeader;flag = NoRepeatPos;i_repeatLines–;//行数减一tail->nextGp=tmpData; //移动指针 未插入链表tail=tmpData;memset(buffer,0,sizeof(buffer));continue; //继续循环}if(pRepeatHeader!=NULL && i_repeatLines>0) //未循环完了,并且存在头直指{i_repeatLines–;tmpData->repeatStart = pRepeatHeader;tail->repeatStart = NULL;tail->nextGp=tmpData; //移动指针 尾部插入链表tail=tmpData;memset(buffer,0,sizeof(buffer));continue; //继续循环}if(i_repeatLines = 0) //循环完了 (循环完了 或是根本没有循环){pRepeatHeader =NULL; //复位循环头的指针,使之为空。flag = NoRepeatPos;//标志位复位}tail->nextGp=tmpData; //移动指针 尾部插入链表tail=tmpData;}else if (c_Oper_temp == ‘s’ || c_Oper_temp == ‘S’ ) //滑动事件{index++;//构造滑动动作sscanf( buffer,”%c %d %d %d %d %d %s”,&(tmpData->operation),&(tmpData->i_StartX),&(tmpData->i_StartY),&(tmpData->i_EndX),&(tmpData->i_EndY),&(tmpData->microseconds),&(tmpData->str_note));tmpData->operIndex=index;tmpData->nextGp=NULL;tmpData->repeatStart=NULL; //初始化结构体if(flag == RepeatPos ) //设定头指针{tmpData->i_repeatCnt=i_repeatCnt;tmpData->i_repeatLine=i_repeatLines; //处于循环位置的第一个节点,设置循环次数和循环的行数pRepeatHeader = tmpData;tmpData->repeatStart = pRepeatHeader;flag = NoRepeatPos;i_repeatLines–;//行数减一tail->nextGp=tmpData; //移动指针 未插入链表tail=tmpData;memset(buffer,0,sizeof(buffer));continue; //继续循环}if(pRepeatHeader!=NULL && i_repeatLines>0) //未循环完了,,并且存在头直指{i_repeatLines–;tmpData->repeatStart = pRepeatHeader;tail->repeatStart = NULL;tail->nextGp=tmpData; //移动指针 尾部插入链表tail=tmpData;memset(buffer,0,sizeof(buffer));continue; //继续循环}if(i_repeatLines = 0) //循环完了 (循环完了 或是根本没有循环){pRepeatHeader =NULL; //复位循环头的指针,使之为空。flag = NoRepeatPos;//标志位复位}tail->nextGp=tmpData; //移动指针 尾部插入链表tail=tmpData;}else if (c_Oper_temp == ‘R’ || c_Oper_temp == ‘r’ ) //滑动事件{sscanf( buffer,”%c %d %d”,&c_repeatID,&i_repeatCnt,&i_repeatLines );printf( “Repeat = %c , i_repeatCnt = %d,RepeatLines = %d \n”,c_repeatID,i_repeatCnt,i_repeatLines );memset(buffer,0,sizeof(buffer));flag = RepeatPos;}memset(buffer,0,sizeof(buffer));}tail->nextGp=NULL;fclose(infile);return ;}

4、构造点击事件

明天的希望,让我们忘了今天的痛苦

自动化测试程序之二模拟触摸屏点击事件和滑动事件(C语言)

相关文章:

你感兴趣的文章:

标签云: