一、测试程序编写说明

我们做的终端设备上运行的是QT应用程序,使用自定义的键盘接口。经过测试人员长时间的人机交互测试,来确认系统的功能是否满足需求。现在需要编写一个自动化的测试程序,能够按照预设的脚本执行,比如某个按键需要连续执行10000次,或是通过连续几个按键动作执行特定的业务流程10W次。通过这样的自动测试,可以减轻测试人员的负担,还可以查看触发N次按键后,画面执行N次后的系统的稳定性,如内存使用率,cup使用率等等。

设备有4*4的键盘,包括0-9,C(Call),A,U(up),D(Down),F1,F2功能键,屏幕的不同画面上根据前述按键的动作执行相应的响应动作。

二、测试程序的结构分析

根据上述的简单要求,先分析测试程序的结构如下:

读入的脚本文件可以是TXT文件大概结构如下:

--------Script_Sample.txt------------

3

A 5

R 3 2

U 5

C 6

A 3

其中的第一行表示以下执行的5个动作,分别是按A 、U、C、A键并且每次按键后休息相应的秒数(即后面的数值),其中的R 5 1 行表示以下1行重复再重复5次。脚本文件中R可不写;若不写,表示依次顺序执行,没有循环操作。

测试程序根据这个脚本构造一个链表,链表中的节点表示相应的操作,操作序列中循环动作再列表中构成局部的单向循环列表。

三、测试程序实现主要逻辑

1、定义链表

typedef struct List

{

char operation;

int seconds;

FLAG c_flag;

int i_repeatCnt;

int i_repeatLines;

struct List *nextGp; //指针域

struct List *nextMemeber; //指针域

}List;

List *oprtData_Set;

2、上报输入事件

int reportkey(int fd, uint16_t type, uint16_t keycode, int32_t value)

{

struct input_event event;

event.type = type;

event.code = keycode;

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 *groupheader;

int i_repeatNums = 0;

int i_repeatLines = 0 ,i_repeatLines_tmp = 0;

char c_repeatID;

FLAG flag = HEADER;//flag = 1 header

char buffer[512];

char c_repeatFlag;

FILE *infile;

infile=fopen(fname,"r");

tail=L; //NULL

groupheader=tail->nextGp;//NULL

if(infile==NULL)

{

printf("\nFailed to open the file : %s \n",fname);

exit(0);

}

else

{

printf("open success! \n");

}

fgets( buffer, sizeof(buffer), infile );

sscanf( buffer,"%d",&i_stepMaxNum);

printf("i_stepMaxNum = %d \n",i_stepMaxNum);

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->nextMemeber=NULL;

tmpData->nextGp=NULL;

sscanf(buffer,"%c",&c_repeatFlag);

if(c_repeatFlag == 'R')

{

sscanf( buffer,"%c %d %d",&c_repeatID,&i_repeatNums,&i_repeatLines );

printf( "Repeat = %c , RepeatNums = %d,RepeatLines = %d \n",c_repeatID,i_repeatNums,i_repeatLines );

memset(buffer,0,sizeof(buffer));

continue;

}

else

{

sscanf( buffer,"%c %d",&(tmpData->operation),&(tmpData->seconds));

printf( "Operation = %c , seconds = %d\n",tmpData->operation,tmpData->seconds);

if(i_repeatLines > 0)

{

if(flag==HEADER)

{

groupheader=tmpData;

tmpData->c_flag=flag;

tmpData->i_repeatCnt = i_repeatNums;

flag = MEMBER;

tmpData->nextMemeber=groupheader;

tmpData->nextGp=NULL;

tail->nextGp=tmpData; // 注意连接臃绞?每个Group的头 用 nextGp 指针连接

}

else

{

tmpData->c_flag=flag;

tmpData->nextMemeber=groupheader;

tmpData->nextGp=NULL;

tail->nextMemeber=tmpData; //group中的成员用 nextMemeber 指针相连

}

tail=tmpData; //修改尾指针的位置。

i_repeatLines--;

}

else

{ //--OK!!

flag=HEADER;

groupheader = tmpData;

tmpData->c_flag = flag;

tmpData->nextMemeber=groupheader;

tmpData->nextGp=NULL;

tail->nextGp=tmpData;

tail=tmpData;

}

if(i_repeatLines==0)

{

flag=HEADER;

}

}

memset(buffer,0,sizeof(buffer));

}

tail->nextGp=NULL;

//tail->nextMemeber=NULL;

fclose(infile);

return ;

}

4、构造键盘事件,包括按下和抬起

void PressKeyEvent(char operation, int seconds)

{

uint16_t keycode;

printf("Key-%c ,%3d Sec |",operation,seconds);

keycode = KeyToVal(operation);

reportkey(KB_Fd, EV_KEY, keycode, KEYDOWN);

reportkey(KB_Fd, EV_KEY, keycode, KEYUP);

sleep(seconds);

}

5、按照链表中的数据逐条发送按键事件

void EmitEvent_Test(List *L)

{

List *p=L->nextGp;

int loop=0;

CYCLE_MODE mode_flag = FirstCycle;

printf("-------EmitEvent_Test-------\n");

while(p!=NULL)

{

//printf ("[** %d **,%c,%d,%d] ",p->c_flag, p->operation,p->seconds,p->i_repeatCnt);

PressKeyEvent(p->operation,p->seconds);

if(p->nextMemeber->c_flag != HEADER) //

{

p = p->nextMemeber;

}

else

{

/*

printf("p->nextMemeber Node is [** %d **,%c,%d,%d ]",

p->nextMemeber->c_flag,

p->nextMemeber->operation,

p->nextMemeber->seconds,

p->nextMemeber->i_repeatCnt);

*/

if(mode_flag == FirstCycle && p->nextMemeber->i_repeatCnt >0)

{

loop = p->nextMemeber->i_repeatCnt;

mode_flag = OtherCycle;

p = p->nextMemeber;

loop--;

printf("\n----------------\n");

continue;

}

if( loop > 0 && mode_flag == OtherCycle )//未重复完

{

p = p->nextMemeber;

loop--;

printf("\n----------------\n");

continue;

}

mode_flag = FirstCycle;//恢复默认值

p = p->nextGp;

printf("\n\n");

}

}

}

四、参考源码程序

自动化测试C语言程序,自动化测试程序之一自定义键盘的模拟测试程序(C语言)...相关推荐

  1. c语言程序能够在不同的操作系统下运行,这说明c语言具有很好的,程序设计(C)作业一(有答案)...

    程序设计(C)作业一 1.C语言程序的执行,总是起始于(). A.程序中的第一条可执行语句 B.程序中的第一个函数 C.main函数 D.包含文件中的第一个函数 2.以下叙述不正确的是(). A.一个 ...

  2. c语言程序能够在不同的操作系统下运行,这说明c语言具有很好的,上海交通大学继续教育学院2012春——程序设计(C)作业1(有答案)...

    程序设计(C)作业一 1. C语言程序的执行,总是起始于( ). A.程序中的第一条可执行语句 B.程序中的第一个函数 C.main函数 D.包含文件中的第一个函数 2. 以下叙述不正确的是( ). ...

  3. c语言程序设计项目化实训教程北京邮电出版,C语言程序设计教程(北京邮电大学出版社) 第1章精选.ppt...

    C语言程序设计教程(北京邮电大学出版社) 第1章精选 1.1 程序与程序设计 1.2 算法及其描述 1.3 C语言的发展及特点 二.C语言的特点 1.具有结构化语言的特点,用函数作为程序的组成单 位, ...

  4. 在c语言程序中 对文件进行操作首先要,《C语言程序设计》试题八及答案

    版权声明:以上文章中所选用的图片及文字来源于网络以及用户投稿,由于未联系到知识产权人或未发现有关知识产权的登记,如有知识产权人并不愿意我们使用,如果有侵权请立即联系:55525090@qq.com,我 ...

  5. 语言程序推箱子课设报告_学完C语言,可以去哪些应用领域工作?

    C语言是目前世界上流行.使用非常广泛的高级程序设计语言. 在TIOBE已公布2020年8月的编程语言排行榜.C语言依然保持排行第一! 前20名排行如下: C语言对操作系统和系统使用程序以及需要对硬件进 ...

  6. 常微分方程数值解的c语言程序,常微分方程的数值解法 一阶常微分方程数值解的C语言编程实现.doc...

    常微分方程的数值解法 一阶常微分方程数值解的C语言编程实现 导读:就爱阅读网友为您分享以下"一阶常微分方程数值解的C语言编程实现"资讯,希望对您有所帮助,感谢您对92的支持! 一阶 ...

  7. lt19264a+c语言程序,可以直接显示汉字的19264液晶驱动C语言程序

    19264 C语言程序资料 注:本程序是经过KEIL编译通过 ,并通过实验板测试通过的,直接按硬件电路连接好显示屏 然后将程序代码烧写入单片机 即可点亮,将显示 武汉2 字,并且 随意设置坐标,就可以 ...

  8. c语言程序代码应缩进几格,汉诺塔c语言程序代码

    汉诺塔c语言程序代码(通过vc++6.0验证)(附讲解) 让我们先看看代码吧 #include int hj(int a,int b, int c,int i) { int t; if(i==1) p ...

  9. 程序设计方法主要有两种 其中C 语言程序,程序设计方法主要有两种,其中C++语言程序设计所采用的设计方法是( ) 程序设计。...

    程序设计方法主要有两种,其中C++语言程序设计所采用的设计方法是( ) 程序设计. 更多相关问题 如图,向量A.B.C在一条直线上,且,则()A. B. C. D. 下列各项中,()是行政处罚的形式. ...

最新文章

  1. [转]oracle 存储过程的基本语法 及注意事项
  2. 数据挖掘关联规则挖掘改进算法DHP
  3. 你的sql查询为什么这么慢?
  4. Oracle笔记----oracle数字类型number自增
  5. BZOJ4373: 算术天才⑨与等差数列
  6. python爬虫高考成绩
  7. 初心大陆----python宝典(意外发生篇)
  8. what to improve on my case study?
  9. java中main函数的args参数
  10. 【layui】【laydate】设置可以选择相同的年份范围
  11. 深入浅出JavaScript (四)DHTML
  12. java集成Cplex:Cplex下载、IDEA环境搭建、docker部署
  13. 如何将视频设置为电脑动态壁纸?
  14. 动态壁纸安卓_高清无水印!这4款壁纸软件,让你的手机好看又独特
  15. IIS配置启动.net项目时报错:“/”应用程序中的服务器错误。
  16. 持NPDP和PMP证书,可以享受深圳、北京等多项福利!
  17. 图片处理-指定大小缩放
  18. 剖析ArrayList / 计算机程序的思维逻辑
  19. 【vue】vue安装卡住/报错
  20. [经验教程]苹果iPhone手机韩服DNF手游12+与17+不同年龄ios版本有什么区别?

热门文章

  1. 微信小程序发力搜索,开发者变现难,揭秘小程序行业真实现状
  2. AI 时代,中国技术创新如何弯道超车?
  3. 面对 10 亿数据量的挑战,如何对系统进行性能优化?
  4. 程序员拯救乐坛?OpenAI 用“逆天”GPT2.0 搞了个 AI 音乐生成器
  5. Python 爬取 3 万条游戏评分数据,原来程序员最爱玩的游戏竟然是......
  6. 为什么物联网产品迫切需要良好的 UI/UX 设计?
  7. PHP 危矣?Zend Engine 团队宣布脱离 Rogue Wave
  8. 区块链,到底是美好未来还是题材炒作?
  9. 字节跳动面试:java后端面试宝典
  10. JavaScript高级使用(一)--参数Arguments对象