自動化テストプログラムの1つキーボードをカスタマイズするアナログテストプログラム(C言語)


一、テストプログラムの作成説明私たちが作った端末装置で実行しているのはQTアプリケーションで、カスタムキーボードインタフェースを使用しています.テスト担当者の長時間のヒューマンマシンインタラクティブテストを経て、システムの機能がニーズを満たしているかどうかを確認します.既存のスクリプトに従って実行できる自動化されたテストプログラムを作成する必要があります.たとえば、あるキーは10000回連続して実行する必要があるか、またはいくつかのキー動作を連続して特定のビジネスプロセスを10 W回実行する必要があります.このような自動テストにより、テスト担当者の負担を軽減し、N回のボタンをトリガーした後、メモリ使用率、cup使用率など、画面がN回実行された後のシステムの安定性を確認することもできる.
デバイスには4*4のキーボードがあり、0-9、C(Call)、A、U(up)、D(Down)、F 1、F 2の機能キーを含み、画面の異なる画面で前述のキーの動作に応じて対応する応答動作を実行する.
二、テストプログラムの構造分析
上記の簡単な要求に基づいて、まずテストプログラムの構造を分析するのは以下の通りである.
読み込まれたスクリプトファイルは、TXTファイルであり、以下のように構成されています.
   --------Script_Sample.txt------------
3
A 5
R 3 2
U 5
C 6
A 3

このうち、1行目は、A、U、C、Aキーを押して、1回のボタンを押すごとに秒数(すなわち、後の数値)を休憩する5つの動作を示し、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!
"
); 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("
Failed to open the file : %s
"
,fname); exit(0); } else { printf("open success!
"
); } fgets( buffer, sizeof(buffer), infile ); sscanf( buffer,"%d",&i_stepMaxNum); printf("i_stepMaxNum = %d
"
,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
"
); 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
"
,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
"
,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-------
"
); 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("
----------------
"
); continue; } if( loop > 0 && mode_flag == OtherCycle )// { p = p->nextMemeber; loop--; printf("
----------------
"
); continue; } mode_flag = FirstCycle;// p = p->nextGp; printf("

"
); } } }

四、参照ソースプログラム
http://download.csdn.net/detail/flyeagle022/8799555