自动化测试C语言程序,自动化测试程序之一自定义键盘的模拟测试程序(C语言)...
一、测试程序编写说明
我们做的终端设备上运行的是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语言)...相关推荐
- c语言程序能够在不同的操作系统下运行,这说明c语言具有很好的,程序设计(C)作业一(有答案)...
程序设计(C)作业一 1.C语言程序的执行,总是起始于(). A.程序中的第一条可执行语句 B.程序中的第一个函数 C.main函数 D.包含文件中的第一个函数 2.以下叙述不正确的是(). A.一个 ...
- c语言程序能够在不同的操作系统下运行,这说明c语言具有很好的,上海交通大学继续教育学院2012春——程序设计(C)作业1(有答案)...
程序设计(C)作业一 1. C语言程序的执行,总是起始于( ). A.程序中的第一条可执行语句 B.程序中的第一个函数 C.main函数 D.包含文件中的第一个函数 2. 以下叙述不正确的是( ). ...
- c语言程序设计项目化实训教程北京邮电出版,C语言程序设计教程(北京邮电大学出版社) 第1章精选.ppt...
C语言程序设计教程(北京邮电大学出版社) 第1章精选 1.1 程序与程序设计 1.2 算法及其描述 1.3 C语言的发展及特点 二.C语言的特点 1.具有结构化语言的特点,用函数作为程序的组成单 位, ...
- 在c语言程序中 对文件进行操作首先要,《C语言程序设计》试题八及答案
版权声明:以上文章中所选用的图片及文字来源于网络以及用户投稿,由于未联系到知识产权人或未发现有关知识产权的登记,如有知识产权人并不愿意我们使用,如果有侵权请立即联系:55525090@qq.com,我 ...
- 语言程序推箱子课设报告_学完C语言,可以去哪些应用领域工作?
C语言是目前世界上流行.使用非常广泛的高级程序设计语言. 在TIOBE已公布2020年8月的编程语言排行榜.C语言依然保持排行第一! 前20名排行如下: C语言对操作系统和系统使用程序以及需要对硬件进 ...
- 常微分方程数值解的c语言程序,常微分方程的数值解法 一阶常微分方程数值解的C语言编程实现.doc...
常微分方程的数值解法 一阶常微分方程数值解的C语言编程实现 导读:就爱阅读网友为您分享以下"一阶常微分方程数值解的C语言编程实现"资讯,希望对您有所帮助,感谢您对92的支持! 一阶 ...
- lt19264a+c语言程序,可以直接显示汉字的19264液晶驱动C语言程序
19264 C语言程序资料 注:本程序是经过KEIL编译通过 ,并通过实验板测试通过的,直接按硬件电路连接好显示屏 然后将程序代码烧写入单片机 即可点亮,将显示 武汉2 字,并且 随意设置坐标,就可以 ...
- c语言程序代码应缩进几格,汉诺塔c语言程序代码
汉诺塔c语言程序代码(通过vc++6.0验证)(附讲解) 让我们先看看代码吧 #include int hj(int a,int b, int c,int i) { int t; if(i==1) p ...
- 程序设计方法主要有两种 其中C 语言程序,程序设计方法主要有两种,其中C++语言程序设计所采用的设计方法是( ) 程序设计。...
程序设计方法主要有两种,其中C++语言程序设计所采用的设计方法是( ) 程序设计. 更多相关问题 如图,向量A.B.C在一条直线上,且,则()A. B. C. D. 下列各项中,()是行政处罚的形式. ...
最新文章
- [转]oracle 存储过程的基本语法 及注意事项
- 数据挖掘关联规则挖掘改进算法DHP
- 你的sql查询为什么这么慢?
- Oracle笔记----oracle数字类型number自增
- BZOJ4373: 算术天才⑨与等差数列
- python爬虫高考成绩
- 初心大陆----python宝典(意外发生篇)
- what to improve on my case study?
- java中main函数的args参数
- 【layui】【laydate】设置可以选择相同的年份范围
- 深入浅出JavaScript (四)DHTML
- java集成Cplex:Cplex下载、IDEA环境搭建、docker部署
- 如何将视频设置为电脑动态壁纸?
- 动态壁纸安卓_高清无水印!这4款壁纸软件,让你的手机好看又独特
- IIS配置启动.net项目时报错:“/”应用程序中的服务器错误。
- 持NPDP和PMP证书,可以享受深圳、北京等多项福利!
- 图片处理-指定大小缩放
- 剖析ArrayList / 计算机程序的思维逻辑
- 【vue】vue安装卡住/报错
- [经验教程]苹果iPhone手机韩服DNF手游12+与17+不同年龄ios版本有什么区别?
热门文章
- 微信小程序发力搜索,开发者变现难,揭秘小程序行业真实现状
- AI 时代,中国技术创新如何弯道超车?
- 面对 10 亿数据量的挑战,如何对系统进行性能优化?
- 程序员拯救乐坛?OpenAI 用“逆天”GPT2.0 搞了个 AI 音乐生成器
- Python 爬取 3 万条游戏评分数据,原来程序员最爱玩的游戏竟然是......
- 为什么物联网产品迫切需要良好的 UI/UX 设计?
- PHP 危矣?Zend Engine 团队宣布脱离 Rogue Wave
- 区块链,到底是美好未来还是题材炒作?
- 字节跳动面试:java后端面试宝典
- JavaScript高级使用(一)--参数Arguments对象