軟件中手機軟件自動化測試研究報告
一、引言
由于最近一些事務好久沒有更新博文了,望關注我博客的網友們諒解,正好最近一段時間著手自動化測試的研究特將我的一些思路及想法寫出來與網友們分享,也算是2010年新年賀禮了。前段時間我也有一篇關于自動化測試的文章《手機軟件自動化測試探索》相對較淺顯,本文在此基礎上進行了更進一步的研究探索,希望大家能得到更進一步的了解。手機軟件的自動化測試一直困擾著手機軟件測試從業人員,本文將最近的一些研究新發現及具體思路作詳盡闡述,希望能給予大家更多的參考萌發新的思路。
通過長期的手工測試得出如下可以以自動化測試來解決的問題:
1. 壓力測試:一些連續不斷的操作,比如反復切換歌曲播放及聯網操作等;
2. 極限臨界測試:一些極限條件的構造(創建多個列表)及輸入字符個數等;
3. 兼容及中斷:比如在播放或下載歌曲的時候來電話或者信息;
4. 基本功能回歸測試:這樣大大的節約了時間和人力成本。
對于以上的測試很多也是可以通過手工來完成,但部分測試采用手工測試是不可靠的,比如最近發現一個Bug(在聯網的一瞬間如果來一個信息等中斷操作出現死機),類似這種Bug出現條件非?量毯团R界的情況在手工測試中是很難發現和構造這種測試環境的,即使發現了在很大程度上也屬于一種偶然,同時給開發人員定位這個問題也帶來了很大的困難!疚恼聛碓矗簭堅Y的博客 http://blog.csdn.net/vincetest】
面對諸多因素,我們不得不重視手機軟件的自動化測試研究。其實如果掌握了一些自動化測試要領,從簡單入手,逐步實現和突破,相信一定能夠解決手機軟件自動化測試的難題。
二、自動化測試原理
【自動化測試原理圖】
1. TestAgent
TestAgent為嵌入在手機軟件系統中的一個測試代理模塊,解決PC端與手機端交互處理及互聯消息通訊問題,這是區別于其他桌面軟件自動化測試的關鍵點,也是嵌入式軟件自動化測試的主要特征之一。通過串口或藍牙設備與PC端中的TestTool建立通訊,其具備的主要功能如下:
1) 接收TestTool發送的消息并向手機端軟件系統分發消息及任務
2) 監控手機端軟件運行情況并根據相應的約束反饋給PC端的TestTool
3) 被測軟件的功能(接口)封裝及消息響應
2. TestTool
TestTool自動化測試工具在PC端用于測試控制及測試操作實體,與TestAgent對應,該工具與常規的自動化測試軟件一樣,其具備的主要功能如下:
1) 向手機端TestAgent發送可識別的消息及任務
2) 接收來自手機端TestAgent的反饋結果
3) 對來自手機端TestAgent的反饋進行測試業務的處理
4) 將測試業務的處理結果呈現給測試人員
三、測試業務
1. 主動式測試
TestTool主動式測試是根據我們的測試需求比如(壓力、性能、極限)在TestTool中編寫測試腳本控制手機端軟件進行測試,或者構造一些手工很難實現的測試場景,通過運行腳本向TestAgent發送消息及任務,TestAgent再向被測軟件分發消息及任務,并將結果原路返回給TestTool,TestTool再通過數據處理分析得出測試結果。關鍵點:發送和分發消息、接收及處理反饋結果(結果判斷)。
2. 回歸式測試
基本功能的回歸測試最為簡單的方法就是錄制和回放機制,通過運行錄制的測試腳本達到按照先前的操作順序、步驟、輸入數據等再次測試被測軟件以此達到回歸測試的目的。
1) 錄制:就是在執行手工測試時將手工測試的任何操作及返回結果(預期正確的結果)通過TestAgent在TestTool中保存下來,并進行分析處理形成一個可執行的腳本。錄制的關鍵點:按鍵或觸屏消息、坐標、響應結果(GUI界面)。
2) 回放:與錄制相對應,運行錄制時產生的腳本,與主動式測試方式不同的是回歸式測試是事先要錄制腳本,通過錄制腳本來代替人工編寫腳本;胤抨P鍵點:發送和分發消息、接收及處理反饋結果(結果判斷)。
四、關鍵技術
1. 消息傳送機制
利用手機Modem中提供的AT Command通過串口向手機端建立命令消息通訊,目前手機廠商提供了常用的AT Command,基本滿足普通的自動化測試需求,另外廠商還提供了用戶自定義AT Command的功能,當標準的AT Command不能滿足自動化測試需求時,我們可以利用自定義AT Command來實現我們自動化測試中所需要的消息通訊。如下為MTK平臺上實現自定義AT Command的關鍵樣例代碼:
view plaincopy to clipboardprint?//customer_at_command.c
#include "kal_non_specific_general_types.h"
#include "stdio.h"
#include "string.h"
#define CUSTOM_SYMBOL '^' // '+' and '/' and ' \ 'is NOT allowed
#define MAX_UART_LEN 128
/*****************************************************************************
* customer command
*****************************************************************************/
#define PLAY "play"
#define STOP "stop"
kal_uint8 custom_get_atcmd_symbol(void);
void custom_command_hdlr(char *full_cmd_string);
extern void rmmi_write_to_uart(kal_uint8 * buffer, kal_uint16 length, kal_bool stuff);
/*****************************************************************************
* FUNCTION
* custom_command_hdlr()
* DESCRIPTION
* This function should parse the custom AT command and do correspondent action.
* Customer should maintain and modify the code.
* PARAMETERS
* kal_uint8 * cmd_string
* RETURNS
* none
*****************************************************************************/
void custom_command_hdlr(char *full_cmd_string)
{
char buffer[MAX_UART_LEN];
char cmd_name[15];
kal_uint8 index = 3; // we start parsing index after the CUSTOM_SYMBOL
kal_uint8 tmp_idx = 0;
while ((full_cmd_string[index] != '=' ) && //might be TEST command or EXE command
(full_cmd_string[index] != '?' ) && // might be READ command
(full_cmd_string[index] != 13 )) //carriage return
{
cmd_name[tmp_idx] = full_cmd_string[index] ;
tmp_idx ++;
index ++;
}
cmd_name[tmp_idx] = '\0' ;
/* just a very basic example : customer can implement their own */
if (strcmp(cmd_name, PLAY) == 0)
{
/* BEGIN: do the following parsing and correspondent action */
/* */
/* */
/* */
/* END: do the following parsing and correspondent action */
/* generate final result code: "OK" */
//Todo 實現消息分發或功能調用
sprintf(buffer, "Hello Play");
printf("%s\n", "Hello Play");
rmmi_write_to_uart((kal_uint8*)buffer, (kal_uint16)strlen(buffer), KAL_TRUE);
}
else if (strcmp(cmd_name, STOP) == 0)
{
/* BEGIN: do the following parsing and correspondent action */
/* */
/* */
/* */
/* END: do the following parsing and correspondent action */
/* generate final result code: "OK" */
//Todo 實現消息分發或功能調用
sprintf(buffer, "Hello Stop");
printf("%s\n", "Hello Stop");
rmmi_write_to_uart((kal_uint8*)buffer, (kal_uint16)strlen(buffer), KAL_TRUE);
}
else
{
/* unrecognized command */
/* generate final result code: "ERROR" */
sprintf(buffer, "ERROR");
printf("%s\n", "ERROR");
rmmi_write_to_uart((kal_uint8*)buffer, (kal_uint16)strlen(buffer), KAL_TRUE);
}
return;
}
kal_uint8 custom_get_atcmd_symbol(void)
{
return (CUSTOM_SYMBOL);
}
2. 圖像識別
圖像識別主要通過抓取LCD屏幕顯示圖像進行智能識別來模擬測試工程師的雙眼辨識文字或圖像信息,以此判斷測試結果。主要涉及圖像的獲取和對比分析,智能識別是一個比較專業的研究領域,更進一步的研究需要進行調研,目前我們可以考慮是否能夠通過第三方工具來實現,比如借助目前已經成熟的測試工具QTP等。對于圖像獲取在手機平臺上應該具備這樣的接口,或者自行開發這個接口。
3. 錄制回放
錄制的信息及相應的實現方式如下:
1) 按鍵消息:由TestAgent捕獲該消息并同步給PC端的TestTool
2) 筆點消息:由TestAgent捕獲該消息并同步給PC端的TestTool
3) 坐標:由TestAgent捕獲該坐標信息并同步給PC端的TestTool
4) 響應結果(GUI界面回放的預期結果):通過圖像抓取接口抓取圖像并同步給PC端的TestTool(如果做到極致的話在PC端所呈現的GUI界面與實際手機GUI界面同步一致,等同于PC機上的顯示為手機GUI的一個鏡像)
5) 時鐘同步:操作步驟的時間點、操作的先后順序、輸出結果響應時間
6) 錄制腳本組裝:TestTool將所有的錄制信息進行處理并組裝成一套可運行的測試腳本,要求運行該腳本后能夠與錄制時的操作完全一樣,并能將回放時的實際結果與預期結果進行比較從而得出執行結果。
7) 回放:主要是運行組裝好的測試腳本,將回放時的實際結果與預期結果進行比較從而得出執行結果,關鍵點還是圖像識別。
4. 測試管理
1) 腳本語言:可以選用Python、TCL作為腳本語言,用一些開源的工具進行腳本文件的管理維護。
2) 測試數據:需要建立一個數據倉庫管理數據,比如錄制時產生的消息、坐標、GUI圖像信息等。
3) 測試結果管理:主要涉及測試報告的呈現及保存。
五、 輔助工具及設備
1. 串口線
2. 超級終端(PC機自帶)或者手機廠商提供的配套工具
3. 腳本編寫、調試、維護及管理工具(開源的比較多)
文章來源于領測軟件測試網 http://www.kjueaiud.com/