啟動時間測試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
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等待字串
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執行命令
${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使用率,來延長啟動時間。
@2:app.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.判定表驅動方法 前面因果圖方法中已經用到了判定表。判定表是分析和表達多邏輯條件下執行不同操作的情況的工具。在程序設計中可作為編寫程序的輔助工具。把復雜的邏輯關系和多種條件組合的情況表達