自己主动化測试程序之中的一个自己定义键盘的模拟測试程序(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语言)的更多相关文章
- VC 实现程序只运行一个实例,并激活已运行的程序
转载:http://blog.sina.com.cn/s/blog_4b44e1c00100bh69.html 进程的互斥运行:CreateMutex函数实现只运行一个程序实例 正常情况下,一个进程的 ...
- Selenium2 Python 自己主动化測试实战学习笔记(五)
7.1 自己主动化測试用例 无论是功能測试.性能測试和自己主动化測试时都须要编写測试用例,測试用例的好坏能准确的体现了測试人员的经验.能力以及对项目的深度理解. 7.1.1 手工測试用例与自己主动化測 ...
- 【金阳光測试】大话Android自己主动化測试--Android自己主动化系列(1)--金阳光于2013年4月份
Android自己主动化測试框架和工具在四年多的发展日趋成熟. 从五年前的第一代自己主动化架构演进到眼下第四代(本系列讲座第7篇后将具体剖析第三代和第四代自己主动化框架)从曾经最早谷歌推崇的monke ...
- QTP,自己主动化測试学习笔记,六月九号
測试自己主动化实现的两个难点设计--功能分解 实现--对象的识别 測试自己主动化实现的两个难点-功能分解 清晰画出业务流程图 依据业务流程分解业务功能.能够被复用的功能也要被分解出来. 依照路径覆盖的 ...
- SWTBOK測试实践系列(5) -- 项目中使用手动和自己主动化的策略
手动測试和自己主动化測试永远是一个非常热门的话题.自己主动化也一直被人们捧上神坛.自己主动化測试和手动測试从技术上来说本质事实上都是測试用例设计.仅仅只是终于形式一个是人工运行,一个是代码运行罢了.这 ...
- Python实战之自己主动化评论
Python实战之自己主动化评论 玩csdn博客一个多月了,渐渐发现了一些有意思的事,常常会有人用相同的评论到处刷.不知道是为了加没什么用的积分,还是纯粹为了表达楼主好人.那么问题来了,这种无聊的事情 ...
- Android自己主动化測试解决方式
如今,已经有大量的Android自己主动化測试架构或工具可供我们使用,当中包含:Activity Instrumentation, MonkeyRunner, Robotium, 以及Robolect ...
- Mock+Proxy在SDK项目的自己主动化測试实战
项目背景 广告SDK项目是为应用程序APP开发者提供移动广告平台接入的API程序集合,其形态就是一个植入宿主APP的jar包.提供的功能主要有以下几点: - 为APP请求广告内容 - 用户行为打点 - ...
- 【金阳光測试】基于控件核心技术探讨---Android自己主动化系列(2)---2013年5月
第一讲分享了下安卓自己主动化一些概况和一些自己主动化框架现状和技术可以解决什么样的问题. 这次课就深入到android世界里面.遨游.翱翔.深入了解自己主动化測试核心技术. 搞过编程开发的同学听到in ...
随机推荐
- uva 10003 Cutting Sticks 【区间dp】
题目:uva 10003 Cutting Sticks 题意:给出一根长度 l 的木棍,要截断从某些点,然后截断的花费是当前木棍的长度,求总的最小花费? 分析:典型的区间dp,事实上和石子归并是一样的 ...
- 路由器一键桥接Android实现
開始之前,首先说一下什么叫一键桥接,所谓一键桥接,就是点击一下.就能够对所连接的路由器进行网络中继设置.以实现路由器能够通过已有的无线路由器进行网络訪问. 那么实现这个功能有几种方法呢?能够说有非常多 ...
- Android-自己定义标题栏
Android-自己定义标题栏 2014年4月25日 分享知识点 最近也比較多事情,想发发博客就是心有余而力不足,本篇博文主要教大家怎样实现自己定义标题栏,非常easy.那么聪明的你一下就看懂. 有兴 ...
- python 并发编程入门
多进程 在Unix/Linux下,为我们提供了类似c中<unistd.h>头文件里的的fork()函数的接口,这个函数位于os模块中,相同与c中类似,对于父进程fork()调用返回子进程I ...
- 深入浅出CChart 每日一课——快乐高四第九课 于无声处,CChart内置功能介绍之数据存取篇
笨笨长期以来一直使用Origin软件画图和处理数据,但Origin软件没有编程语言的接口.笨笨开发CChart的一个潜在的目标.是想实现Origin软件的功能.当然这是一个不可能达到的目标.Origi ...
- [Phonegap+Sencha Touch] 移动开发19 某些安卓手机上弹出消息框 点击后不消失的解决的方法
Ext.Msg.alert等弹出框在某些安卓手机上,点击确定后不消失. 原因是: 消息框点击确定后有一段css3 transform动画,动画完毕后才会隐藏(display:none). 有些奇葩手机 ...
- python 从bulkblacklist信誉查询网站提交查询
import urllib import urllib2 #import webbrowser import re import socket def is_domain_in_black_list( ...
- 一种比较高级的方法也可以修改windows为默认启动系统
运行: sudo mv /etc/grub.d/30_os-prober /etc/grub.d/06_os-probersudo update-grub
- EF Code First 使用(一)
第一步:创建MVC5项目,添加数据库实体,建立上下文对象. 第二步:创建数据库和添加数据
- SQL like查询条件中的通配符处理
1. SQL like对时间查询的处理方法 SQL数据表中有savetime(smalldatetime类型)字段,表中有两条记录,savetime值为:2005-3-8 12:12:00和2005- ...