1. 程式人生 > >啟動時間測試Robot Framework用例一則

啟動時間測試Robot Framework用例一則

[Setup]    配置網路IP    ${local_ip}

    SERIAL通過串列埠傳送字元    "mount;echo RESULT:$?\\r\\n"

    ${data}    SERIAL等待字串    RESULT:0

    Should Contain    ${data}    /dev/mmcblk3p5 on /home/apps type ext4 (rw,relatime,data=ordered)

    SERIAL執行sh命令    tftp -gr ltp.sq.tar.bz2 ${tftp_server}    3000    100ms @1

    SERIAL執行sh

命令    tar -xjf ltp.sq.tar.bz2 -C /home/apps/    3000    100ms

    SERIAL通過串列埠傳送字元    "cd /home/apps/;echo RESULT:$?\\r\\n"

    SERIAL等待字串    RESULT:0

    SERIAL通過串列埠傳送字元    "tftp -gr app.sh 192.168.1.1;echo RESULT:$?\\r\\n" @2

    SERIAL等待字串    RESULT:0

    SERIAL通過串列埠傳送字元    "chmod +x app.sh;echo RESULT:$?\\r\\n"

    SERIAL等待字串    

RESULT:0

    SERIAL通過串列埠傳送字元    "sed -i '/usr\\/bin\\/bcm8953xspiutil/i\/home/apps/app.sh' /etc/zstart;echo RESULT:$?\\r\\n" @3

    SERIAL等待字串    RESULT:0

    SERIAL通過串列埠傳送字元    "sync;echo RESULT:$?\\r\\n"

    SERIAL等待字串    RESULT:0

    SERIAL斷開串列埠

    SSH登入    127.0.0.1    root    ${nfs_passwd}

    ${zserial_ret}    SSH執行命令    

/var/lib/tftpboot/zserial_reboot "/dev/ttyUSB0" 115200 "console_init" "app start" @4

    ${time_line}    Get Lines Containing String    ${zserial_ret}    the boot take time total

    ${boot_time}    Split String    ${time_line}

    ${ret}    SSH執行命令    /var/lib/tftpboot/cmpLittle.sh ${boot_time[5]} 3 @5

    Should Contain    ${ret}    YES

    SERIAL初始化串列埠    ${port}    ${baudrate}

    SERIAL通過串列埠傳送字元    "\\r\\n"

    SERIAL等待字串    saic_imx6d_fota login:

    SERIAL通過串列埠傳送字元    "root\\r\\n"

    SERIAL等待字串    [email protected]_imx6d_fota:

    SERIAL通過串列埠傳送字元    "sed -i '/\\/home\\/apps\\/app.sh/d' /etc/zstart;echo RESULT:$?\\r\\n" @6

    SERIAL等待字串    RESULT:0

    SERIAL通過串列埠傳送字元    "rm /home/apps/app.sh;echo RESULT:$?\\r\\n"

    SERIAL等待字串    RESULT:0

    SERIAL通過串列埠傳送字元    "rm ltp.sq.tar.bz2;echo RESULT:$?\\r\\n"

    SERIAL等待字串    RESULT:0

    SERIAL通過串列埠傳送字元    "rm -rf home/apps/ltp.sq/;echo RESULT:$?\\r\\n"

    SERIAL等待字串    RESULT:0

SSH斷開連線
備註:不用關注細節的封裝(如SERIAL通過串列埠傳送字元、SSH登入),只看流程。

@1:傳入ltp壓縮包並不是要做LTP測試,只是為了增加mmc使用率,來延長啟動時間。

@2app.sh為簡單的列印字串,方便利用工具抓取來測試啟動時間;

cat app.sh

#!/bin/sh

echo "app start"

@3:通過sed命令編輯啟動指令碼zstart,在“/usr/bin/bcm8953xspiutil”前面一行加上“/home/apps/app.sh

@4:通過工具zserial_reboot抓取串列埠輸出,測試啟動時間,原始碼見附件1

@5:通過shell指令碼比較啟動時間,小於3s列印YES

cat cmpLittle.sh

#!/bin/bash

echo "$1 $2"|awk '{if ($1 < $2) print "YES"; else print "NO"}'

@6:用例恢復,刪除在啟動指令碼zstart中增加的文字行

附件1

#include <stdio.h>

#include <stdlib.h>

#include <unistd.h>

#include <sys/types.h>

#include <sys/stat.h>

#include <fcntl.h>

#include <termios.h>

#include <errno.h>

#include <string.h>

#include <pthread.h>

static int fd_serial = 0;

int openComm(const char* port)

{

int fd = -1;

printf("serial device : %s\n", port);

fd = open(port, O_RDWR | O_NOCTTY | O_NDELAY);

if(fd < 0){

printf("open %s failed\n", port);

return -1;

}

//阻塞讀取

if(fcntl(fd,F_SETFL,0) < 0){

printf("fcntl failed\n");     

}     

else{     

        printf("fcntl=%d\n",fcntl(fd,F_SETFL,0));     

}   

//測試是否為終端裝置   

#if 0

if(0 == isatty(STDIN_FILENO))

{

printf("standard input is not a terminal device\n");

close(fd);

return -1;

}       

#endif

//printf("fd->open=%d\n",fd);

return fd;

}

int setComm(int fd,int speed,int flow_ctrl,int databits,int stopbits,int parity)

{

int   i;

int   status;

int   speed_arr[] = { B115200, B57600, B38400, B19200, B9600, B4800, B2400, B1200, B300};

int   name_arr[] = { 115200, 57600, 38400,  19200,  9600,  4800,  2400,  1200,  300};

struct termios old_options;

struct termios options;

printf("fd:%d, speed:%d, flow_ctrl:%d, databits:%d, stopbits:%d, parity:%c\n", fd, speed, flow_ctrl, databits, stopbits, parity);

if( tcgetattr( fd, &old_options)  !=  0)

{

perror("serial cfg failed\n");    

return -1;

}

bzero(&options, sizeof(options));

//修改控制模式,保證程式不會佔用串列埠

options.c_cflag |= CLOCAL;

//修改控制模式,使得能夠從串列埠中讀取輸入資料

options.c_cflag |= CREAD;

//設定串列埠輸入波特率和輸出波特率

status = 0;

for ( i= 0;  i < sizeof(speed_arr) / sizeof(int);  i++)

{

if  (speed == name_arr[i])

{       

tcflush(fd, TCIOFLUSH);

            cfsetispeed(&options, speed_arr[i]);

            cfsetospeed(&options, speed_arr[i]);

            if(tcsetattr(fd, TCSANOW, &options) != 0)

            {

                perror("tcsetattr fd failed");

                return -1;

            }

            tcflush(fd, TCIOFLUSH);

status = 1;

break;

}

}

if(status == 0){

printf("no %d speed, set default speed 115200\n", speed);

cfsetispeed(&options, B115200);

cfsetospeed(&options, B115200);

}

//設定資料流控制

switch(flow_ctrl)

{

case 0 ://不使用流控制

options.c_cflag &= ~CRTSCTS;

break;   

case 1 ://使用硬體流控制

options.c_cflag |= CRTSCTS;

break;

case 2 ://使用軟體流控制

options.c_cflag |= IXON | IXOFF | IXANY;

break;

}

//設定資料位

options.c_cflag &= ~CSIZE; //遮蔽其他標誌位

switch (databits)

{

case 5:

options.c_cflag |= CS5;

break;

case 6:

options.c_cflag |= CS6;

break;

case 7:    

options.c_cflag |= CS7;

break;

case 8:    

options.c_cflag |= CS8;

break;  

default:   

fprintf(stderr,"Unsupported data size\n");

return -1;

}

//設定校驗位

switch (parity)

{  

case 'n':

case 'N': //無奇偶校驗位。

options.c_cflag &= ~PARENB;

options.c_iflag &= ~INPCK;    

break;

case 'o':  

case 'O'://設定為奇校驗    

options.c_cflag |= (PARODD | PARENB);

options.c_iflag |= INPCK;             

break;

case 'e':

case 'E'://設定為偶校驗  

options.c_cflag |= PARENB;       

options.c_cflag &= ~PARODD;       

options.c_iflag |= INPCK;       

break;

case 's':

case 'S': //設定為空格

options.c_cflag &= ~PARENB;

options.c_cflag &= ~CSTOPB;

break;

default:  

fprintf(stderr,"Unsupported parity\n");   

return -1;

}

// 設定停止位

switch (stopbits)

{

case 1:   

options.c_cflag &= ~CSTOPB;

break;

case 2:   

options.c_cflag |= CSTOPB;

break;

default:   

fprintf(stderr,"Unsupported stop bits\n");

return -1;

}

//設定最少字元和等待時間

options.c_cc[VTIME] = 0;

options.c_cc[VMIN] = 0;

tcflush(fd, TCIFLUSH);

//啟用配置 (將修改後的termios資料設定到串列埠中)

if (tcsetattr(fd,TCSANOW,&options) != 0)  

{

perror("set serial config error!\n");  

return -1;

}

return 0;

}

void closeComm(int fd)

{

close(fd);

}

int readComm(int fd, char *rcv_buf, int data_len)

{

int len;

len = read(fd, rcv_buf, data_len);

return len;

}

int writeComm(int fd, char *send_buf, int data_len)

{

int len = 0;

len = write(fd, send_buf, data_len);

if (len == data_len )

{

return len;

}

tcflush(fd,TCOFLUSH);

return -1;

}

#define LINE_BUF_SIZE 512

#define READ_BUF_SIZE 1024

int send_cmd(int fd_serial, char *cmd_buf, int cmd_len, char *recv_buf, int recv_len)

{

char read_buf[READ_BUF_SIZE];

char line_buf[LINE_BUF_SIZE];

int ret = 0;

int index = 0;

int i = 0;

int flag = 0;

writeComm(fd_serial, cmd_buf, cmd_len);

if(recv_len == 0 || recv_buf == NULL)

return 0;

index = 0;

memset(read_buf, 0x0, READ_BUF_SIZE);

while(1)

{

ret = readComm(fd_serial, read_buf + index, READ_BUF_SIZE - index);

if(ret > 0){

index = index + ret;

//printf("==>index:%d ret:%d recv_len:%d read_buf:[%s]\n", index, ret, recv_len, read_buf);

if(index < recv_len){

continue;

}

for(i = 0; i < index - recv_len; i++){

if(0 == strncmp(read_buf + i, recv_buf, recv_len)){

//printf("==>[found]\n");

return 0;

}

}

if(index >= READ_BUF_SIZE)

index = 0;

}

}

return 0;

}

int send_reboot(int fd_serial)

{

char cmd_buf[10];

char recv_buf[40];

printf("==> start reboot\n");

cmd_buf[0] = 'r';

cmd_buf[1] = 'e';

cmd_buf[2] = 'b';

cmd_buf[3] = 'o';

cmd_buf[4] = 'o';

cmd_buf[5] = 't';

cmd_buf[6] = '\r';

cmd_buf[7] = '\n';

send_cmd(fd_serial, cmd_buf, 8, NULL, 0);

/*

//ctrl+d

cmd_buf[0] = 4;

strcpy(recv_buf, "kdb:");

send_cmd(fd_serial, cmd_buf, 1, recv_buf, strlen(recv_buf));

//^

cmd_buf[0] = 94;

strcpy(recv_buf, "Return reboots");

send_cmd(fd_serial, cmd_buf, 1, recv_buf, strlen(recv_buf));

// \r\n

cmd_buf[0] = '\r';

cmd_buf[1] = '\n';

send_cmd(fd_serial, cmd_buf, 2, NULL, 0);

*/

return 0;

}

//#define TEST_DEBUG  1

int main(int argc, char **argv)

{

char read_buf[READ_BUF_SIZE];

char read_buf_2[READ_BUF_SIZE];

int i = 0;

int ret = 0;

int bart = 0;

struct timeval tv_start, tv_current;

int total_time;

char line_buf[LINE_BUF_SIZE];

int index;

int index_2;

char *start = NULL;

char *end = NULL;

#ifdef TEST_DEBUG

  char test_buf[2048];

int test_index = 0;

memset(test_buf, 0x0, 2048);

#endif

if (argc < 3){

printf("please input param\n");

printf("zserial device bart [start] [end]\n");

printf("  eg:./zserial /dev/ttyUSB0 115200 \"console_init\" \"kzb start\"\n");

return -1;

}

fd_serial = openComm(argv[1]);

if(fd_serial < 0){

return -1;

}

bart = atoi(argv[2]);

printf("open %s %d\n", argv[1], bart);

if(setComm(fd_serial, bart, 0, 8, 1, 'N') < 0){

closeComm(fd_serial);

return -1;

}

if(argc >= 4)

start = argv[3];

if(argc >= 5)

end =  argv[4];

send_reboot(fd_serial);

memset(line_buf, 0x0, LINE_BUF_SIZE);

index = 0;

gettimeofday(&tv_start, 0);

while(1)

{

memset(read_buf, 0x0, READ_BUF_SIZE);

ret = readComm(fd_serial, read_buf_2, READ_BUF_SIZE);

if(ret > 0){

index_2 = 0;

for(i = 0; i < ret; i++){

if(read_buf_2[i] != 0){

read_buf[index_2++] = read_buf_2[i];

}

}

ret = index_2;

if(ret < 1)

continue;

#ifdef TEST_DEBUG

if(test_index + ret < 2048){

memcpy(test_buf + test_index, read_buf, ret);

test_index += ret;

}else{

printf("==> test_index:%d ret:%d\n", test_index, ret);

}

#endif

if(index + ret > LINE_BUF_SIZE){

ret = LINE_BUF_SIZE - index;

}

memcpy(line_buf + index, read_buf, ret);

index += ret;

if(index >= LINE_BUF_SIZE || line_buf[index -1] == '\n')

{

//去除空行

if(index == 2 && line_buf[0] == 0xd){

index = 0;

memset(line_buf, 0x0, LINE_BUF_SIZE);

continue;

}

if(line_buf[0] == 0xd)

line_buf[0] = ' ';

if(start){

//printf("{%c}", line_buf[0]);

if(0 == strncmp(line_buf,start,strlen(start))){

gettimeofday(&tv_start, 0);

}

}

gettimeofday(&tv_current, 0);

total_time = (tv_current.tv_sec - tv_start.tv_sec) * 1000000L;

total_time += tv_current.tv_usec - tv_start.tv_usec;

printf("[%f] %s", (double)total_time / 1000000, line_buf);

if(end){

if(0 == strncmp(line_buf,end,strlen(end))){

printf("the boot take time total: %f\n", (double)total_time / 1000000);

break;

}

}

index = 0;

memset(line_buf, 0x0, LINE_BUF_SIZE);

}

}

}

closeComm(fd_serial);

#ifdef TEST_DEBUG

printf("\n=====================================\n");

for(i = 0; i < test_index; i++){

if(test_buf[i]>= 'a' && test_buf[i] <= 'z' || test_buf[i] == '#'){

printf("[%d]%c\n", i, test_buf[i]);

}else{

printf("[%d]%x\n", i, test_buf[i]);

}

}

printf("=====================================\n");

#endif

return 0;

}

相關推薦

啟動時間測試Robot Framework一則

[Setup]    配置網路IP    ${local_ip}    SERIAL通過串列埠傳送字元    "mount;echo RESULT:$?\\r\\n"    ${data}    SERIAL等待字串    RESULT:0    Should Contain

利用 Traceview 精準定位啟動時間測試的異常方法 (工具開源)

ogl 輸出 lock 溫度 結果 累加 定位 我們 錄制 機智的防爬蟲標識原創博客地址:http://www.cnblogs.com/alexkn/p/7095855.html博客求關註: http://www.cnblogs.com/alexkn 1.啟動時

App啟動時間測試

android命令方式:adb shellam start -W -n com.android.browser/.BrowserActivity(回車後觀察模擬器)-W 是指啟動完成之後,返回啟動耗時-n 後面是需要啟動的App的包名和launchActivitythis time 是本次App啟動所花費的時

python unittest單元測試框架-3執行順序、多級目錄、類別、

1.用例執行順序 unittest預設會按照ascii碼的順序,依次執行。類名——方法名排序,使用discover也是預設排序。如果不想使用預設排序,就使用testsuite測試集的方式。 import unittest class TestB(unittest.TestCase): def se

Android APP啟動時間測試

使用命令: adb.exe shell am start -W com.doctorapp/com.doctorapp.MainActivity WaitTime 返回從 startActivity 到應用第一幀完全顯示這段時間. 就是總的耗時,包括前一

對於功能測試來說設計有哪些方法

 一、測試分析   測試需求來源   開發需求DR;協議標準需求PR;使用者需求UR;案例庫需求LR;競爭需求CR;繼承需求SR;   2. 測試項分析步驟   a. 為分析的測試項編號;   b. 註明來源:開發文件/法律條款/案例庫編號   c. 整合測試項:刪除合併重

python unittest單元測試方法和

python內部自帶了一個單元測試的模組,pyUnit也就是我們說的:unittest 先介紹下unittest的基本使用方法: 1.import unittest 2.定義一個繼承自unittest.TestCase的測試用例類 3.定義setUp和tearDown,在

測試中,介面測試的必要性與介面測試的基礎設計

1、 什麼是介面,為什麼要做介面測試(介面測試的必要性) 介面: 現在介面一般分為兩種,一種程式內介面,另一種是系統對外的介面,程式內介面就是我們開發一個系統或者程式,只供我們程式內使用,而對外介面就是我們需要提供給外部用的介面,比如說我們要的第三方登入(微信登陸,或者微博登陸)或者支付,這種就是我們調取的微

Robot Framework測試框架指令碼設計方法

Robot Framework介紹  Robot Framework是一個通用的關鍵字驅動自動化測試框架。測試用例以HTML,純文字或TSV(製表符分隔的一系列值)檔案儲存。通過測試庫中實現的關鍵字驅動被測軟體。    Robot Framework靈活且易於擴充套件

Python寫Robot Framework測試

瀏覽器 from model self ear browser rar .py down Robot Framework 框架是基於 Python 語言開發的,所以,它本質上是 Python 的一個庫。 百度搜索實例 創建 py_robot.py 文件,代碼如下: fro

Robot Framework用法總結(二):簡單的編寫

3.簡單用例編寫 3.1建立專案New Project 注:選擇directory原因是,在directory的專案下可以建立測試套件,如果是tpye為file,則只能建立測試用例,這不利於用例的管理。 3.2建立測試套件New Suit 右鍵點選Test

robot framework rf自動化測試例項(第一篇:啟動應用)

1. 啟動手機用USB連線電腦,注意手機需要開啟開發者模式,開啟USB除錯功能(或者啟動電腦上的手機模擬器) 2. 啟動命令列cmd, 用命令檢視手機裝置名稱:adb devices (如下圖): 3. 啟動appium, 看到以下介面無報錯,則為啟動成功 4. 啟動r

jenkins定時編譯節省測試執行時間

使用jenkins定時編譯結果執行自動化測試。 當自動化測試的用例較多時,每次執行都重新編譯build會浪費一些時間,並且會有程式碼提交不對等原因導致工程build失敗的情況,影響正常自動化測試工作的進行。現已有持續整合定時build監控任務,這篇部落格是說

MyBatis+JUnit測試Dao(Mapper)的實現( 不啟動web工程 且 未使用SpringMVC管理MyBatis時 )

<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-

junit測試啟動報錯java.lang.NoClassDefFoundError: javax/servlet/SessionCookieConfig

開發十年,就只剩下這套架構體系了! >>>   

基於RFS(robot framework selenium)框架模擬POST/GET請求執行自動化接口測試

files use key get align git eat 發送 網頁 轉載自:http://www.cnblogs.com/jerry-yin/articles/4812012.html 今天研究了一下基於RFS自動化測試框架實現HTTP的POST/GET請求發送

Robot Framework自動化測試Selenium2Library庫詳細用法

www range fire 查看 int log world 定時 until 一、瀏覽器驅動 通過不同的瀏覽器執行腳本。 Open Browser Htpp://www.xxx.com chrome 瀏覽器對應的關鍵字: fi

Robot Framework自動化測試---Selenium API

地址 create http 錯誤提示 所有 baidu htmlunit pan 發的 一、瀏覽器驅動 通過不同的瀏覽器執行腳本。 Open Browser Htpp://www.xxx.com chrome 瀏覽器對應

黑盒測試設計-錯誤推測和因果圖方法

9.png sub png str 二義性 生成 當前 其中 關系 3.錯誤推測方法 基於經驗和直覺,找出程序中你認為可能出現的錯誤,有針對性地設計測試用例。經驗可能來自於在對某項業務的測試較多,也可以來自於售後用戶的反饋意見,或者從故障管理庫中整理bug。梳

黑盒測試設計-判定表驅動方法

組成 出了 mage 條件 技術分享 .cn 動作 align 轉換成 5.判定表驅動方法 前面因果圖方法中已經用到了判定表。判定表是分析和表達多邏輯條件下執行不同操作的情況的工具。在程序設計中可作為編寫程序的輔助工具。把復雜的邏輯關系和多種條件組合的情況表達