自动化测试程序之一自定义键盘的模拟测试程序(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() [email protected] \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");

            }

    }  

}

四、参考源码程序

http://download.csdn.net/detail/flyeagle022/8799555

时间: 2024-10-28 23:16:37

自动化测试程序之一自定义键盘的模拟测试程序(C语言)的相关文章

android 自定义键盘 KeyboardView的key 文字颜色发虚模糊

开发中自定义键盘是否遇到文字发虚吗??如下图: 解决办法: 1. 在key的xml中设置key文字不用keyLabel ,而用keyIcon,即用图片来代替文本,但是这种方法比较笨 2.最简单的是在keyboardview中设置两个属性即可: android:shadowColor="@color/c_white" android:shadowRadius="0.0" shadowColor 设置跟你按键的背景色一致即可!!! 这样按键的文字就会显示的很清晰了啊!!

iOS自定义键盘和系统键盘切换且文本输入框一直获得焦点

UITextView用来进行文本输入.方法becomeFirstResponder和resignFirstResponder可以用来进行弹出系统键盘和收下系统键盘. 弹出系统键盘,文本输入框获得焦点.收下系统键盘,文本输入框失去焦点.那么,问题来了. 某个条件下,如点击界面上的某个按钮,展示自定义键盘.再次点击,切换到系统键盘.先收下系统键盘,再展示自定义键盘.比如移动自定义键盘View的Frame.Y.但这时因为收下系统键盘,本文输入框失去焦点.虽然展示了自定义键盘.但用户体验很不好.光标没有

android 自定义键盘,代码实现自定义属性(自定义键盘背景,各个键的背景等)

由于工作需要,所以接触了自定义键盘.但是发现自己写的键盘太过丑陋了一些.废话不多说,先上图     第一张是修改后的.第二张是修改钱的.这基本上就是 OK.接下来就是重点了. android的keyboardview的属性中是有keybackground 的,但是在使用的时候,却发现没有生效.仔细看了下源码才发现.下面的这句话,把属性集合给设置成了空.所以就键盘的属性就一直无法生效. KeyboardView mKeyboardView = new KeyboardView(this, null

Snail—UI学习之自定义键盘及键盘收起(待完善)

在viewController.h中加入代理 #import <UIKit/UIKit.h> @interface WJJRootViewController : UIViewController <span style="color:#FF0000;"><UITextFieldDelegate></span> @end viewController.m中代码展示 #import "WJJRootViewController.h

自定义键盘~新手看

写这日志以及前面的一些简单的东西就是 纯粹的重温一下 记录下自己的点点滴滴  从runtime runloop 到 函数底层 可能是年纪大了 想回顾一下 从入行到现在本人学了java Python PHP Scala C# JS等等一系列的语言  并学以致用 希望以后能有更好的风景~~ 这篇日志很适合新手看 大神勿喷 自定义键盘 应用场景 密码输入 创建 CustomTextField 继承于UITextField KeyBoardView 继承于UIView CustomTextField.h

android自定义键盘(解决弹出提示的字体颜色问题)

最近准备要做一个项目,需要用到自定义小键盘来确保安全,而且还需要精确获得用户点击键盘时的落点位置.力度.指尖接触屏幕的面积等参数. 在写自定义键盘的时候,用到了国内网上的一些代码,出处是 http://blog.csdn.net/hfsu0419/article/details/7924673 向先人致敬! 然后发现down下来的代码用到我的项目时,出现了各种问题: 1.首先,是一打开应用,就会出现弹出的是系统的输入法键盘,而是不自定义键盘,这个问题是由于EditText会在应用打开的使用获得焦

iOS IM开发建议(三)添加一个自定义键盘

各类的主流IM,都有自己定义的键盘:有表情键盘,选图片的键盘.其实都是一个inputView. 首先,我们要确定,我们的键盘是输入框调用的.也就是,我们可以设置的是某一个textView的inputView. // 让键盘进入编辑状态,替换输入源为自定义的fv // fv 是一个自定义的UIView - (void)callFaceKeyBoard:(UIButton *)button { [ktextView becomeFirstResponder]; ktextView.inputView

vue教程2-08 自定义键盘信息、监听数据变化vm.$watch

vue教程2-08 自定义键盘信息 @keydown.up @keydown.enter @keydown.a/b/c.... 自定义键盘信息: Vue.directive('on').keyCodes.ctrl=17; Vue.directive('on').keyCodes.myenter=13; @keydown.a/b/c.... <input type="text" @keydown.c="show"> 自定义键盘信息: Vue.directi

关于WinIO.DLL的键盘输入模拟

关于WinIO.DLL的键盘输入模拟 最近在找键盘模拟的方式,最后在网上找到了一个WinIO.DLL的IO键盘模拟按键的方式.但是居然那个方法是有问题的.我造了全局的hook监视键盘信息,发现它只是有keyDown和keyPress的消息,keyUp的信息是up了一个zoom的键. 搞了2天终于找到了正确的方式,以下是代码(使用需要winIo.dll,winIo.vxd,winIo.sys):     public class WinIOLab    {        private const