使用VS2005+TCL搭建集成測試環境測試瀏覽器接口

【背景介紹】:

搜狗瀏覽器2.0版本實現了Webkit和Trident雙內核引擎,當訪問兼容性好的站點時,瀏覽器會使用Webkit內核進行渲染解析;當訪問兼容性較差的站點時,瀏覽器會使用Trident內核進行渲染解析。瀏覽器通過雙核選擇流程判斷採用何種內核:

1.當訪問一個Url時,瀏覽器將Url按照一定的規則轉換爲Pattern;

2.將Pattern與黑白名單進行匹配。

3.如果匹配白名單,則使用Webkit內核;

4.如果命中白名單的同時又命中黑名單,則使用Trident內核;

5.如果沒有命中白名單,則使用Trident內核。

【目標建立】:

瀏覽器雙核選擇流程決定了用戶瀏覽頁面的體驗好壞,因此雙核選擇流程的功能正確性和穩定性具有舉足輕重的作用。爲了能夠提高測試效率,以及用盡可能多的Url提升功能覆蓋度,雙核選擇流程需要自動化輔助測試。

【評估實現】:

雙核選擇流程中,Url轉換爲Pattern模塊、Pattern匹配黑白名單模塊是雙核選擇流程中的兩個核心算法,其中存在了大量的字符串操作,功能邏輯性強,輸入容易構造,輸出容易檢驗。因此在評估可行性後決定採用集成測試的方式,對雙核選擇模塊的Url2Pattern()函數和MultiCoreChooser()函數進行自動化的集成測試。

【環境搭建】:

我們採用了經典的VS2005 + TCL搭建集成測試環境。這個測試環境的優點是:

  1. TCL腳本語法規則相對簡單。
  2. TCL屬於解釋語言,代碼能夠動態的改變。
  3. 可以通過C、C++或者Java進行擴展。通過這點,我們可以在VS2005中編寫待測試函數的驅動函數,然後註冊到TCL的解釋器中,在TCL腳本的執行過程中調用註冊的命令,最後校驗輸出結構與預期結果是否一致。

搭建步驟:

  1. 獲取tcl8.3的安裝包,安裝到 c:\tcl目錄下。
    這裏寫圖片描述
  2. 利用 Visual Studio 2005建立一個Win32 Console Application工程,工程的名字爲 ITAutoTest。
    這裏寫圖片描述
  3. 配置VS 2005工程屬性。
    如圖,在Linker->Additional Dependencies中添加tcl83.lib庫
    這裏寫圖片描述
  4. 添加待測試函數。
    這裏寫圖片描述
  5. 編寫驅動函數。

創建DriverFunc.h文件:

//驅動函數的聲明:
//
//TclEx_Dochoose是瀏覽器雙核選擇的函數
int TclEx_DoChoose( ClientData clientData, Tcl_Interp * interp, int argc , char* argv[]);
int TclEx_Url2Pattern( ClientData clientData, Tcl_Interp * interp, int argc , char* argv[]);

創建DriverFunc.cpp文件

#include "stdafx.h"
#include "DriverFunc.h"
#include "MultiCoreChooser.h"
#include "ListCenter.h"

//1.5版本雙核選擇函數DoChoose
int TclEx_DoChoose( ClientData clientData, Tcl_Interp * interp, int argc , char* argv[])
{
    ……
    CString strUrl;
    //string strUrl;
    int iExpectResult = ParamInitValue;
    int iResult = 0;

    //參數:獲取期望結果
    if ( TCL_OK != Tcl_GetInt(interp , argv[1] , &iExpectResult ) )
    {
        interp->result = "para1 error";
        return TCL_OK;
    }

    …

    //參數:獲取Url
    char szUrl[2048] = { 0 };
    strncpy( szUrl, argv[2] , 2048 );
    DWORD dwNum = MultiByteToWideChar( CP_ACP , 0 , szUrl , -1 ,NULL , 0 );
    wchar_t * pwszUrl;
    pwszUrl = new wchar_t[dwNum];

    if ( !pwszUrl )
    {
        delete []pwszUrl;
    }
    MultiByteToWideChar( CP_ACP , 0 , szUrl , -1 , pwszUrl , dwNum );

    //傳入的szUrl必須轉爲Unicode
    iResult = MultiCore::ChooseCore( pwszUrl ); //調用待測試函數
    delete []pwszUrl;

    if ( iResult != iExpectResult )
    {
        interp->result = "Test Failed!";
    }
    else
    {
        interp->result = "Test Succeded!";
    }
    return TCL_OK;
}


int TclEx_Url2Pattern( ClientData clientData, Tcl_Interp * interp, int argc , char* argv[] )
{
    ……
    int iExpectResult = ParamInitValue;
    int iResult = 0;
    //參數:獲取期望結果
    if ( TCL_OK != Tcl_GetInt(interp , argv[1] , &iExpectResult ) )
    {
        interp->result = "para1 error";
        return TCL_OK;
    }
    ……
    //參數:獲取Url
    char szUrl[2048] = { 0 };
    strncpy( szUrl, argv[2] , 2048 );
    char szPattern[2048] = { 0 };

    ListCenter::Url2Pattern( szUrl , szPattern ); //調用待測試函數
    //輸出執行結果
    //fix bug:如果使用strcpy_s的話會出現崩潰,所以使用strcpy。
    int ilen = strlen( szPattern );
    if ( TCL_RESULT_SIZE > ilen )
    {
        strcpy( interp->result, szPattern );
    }
    else
    {
        interp->result = "result is too long";
    }
        return TCL_OK;
}

6.編寫Tcl運行環境的Main函數並註冊外部命令。

#include "stdafx.h"
#include "Main.h"
#include
#ifdef _DEBUG
#define new DEBUG_NEW
#endif

// The one and only application object
CWinApp theApp;
using namespace std;
Tcl_Interp * MyInterp;

int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
    int nRetCode = 0;
    ……
    //創建TCL解釋器
    MyInterp = Tcl_CreateInterp();
    //初始化解釋器
    Tcl_Init( MyInterp );

    //創建外部命令
    Tcl_CreateCommand( MyInterp , "DoChoose" , TclEx_DoChoose, NULL , NULL );
    Tcl_CreateCommand( MyInterp , "Url2Pattern" , TclEx_Url2Pattern , NULL, NULL );
    Tcl_CreateCommand( MyInterp , "GetPath" , TclEx_GetPath, NULL , NULL );
    ……
    while(1)
    {
        _tprintf( _T("Please input the TclScript Name:\n") );
        scanf( "%s" , &szScriptName );//這裏用scanf_s會出錯,所以還是原用scanf
        sprintf_s( sScript, "%s\\%s", szScriptPath ,szScriptName);
        try
        {
            rCode = Tcl_EvalFile( MyInterp , (char * ) sScript );
        }
        catch (CException* e)
        {
            // Note: DELETE_EXCEPTION(e) not required
            LPTSTR pszErrText;
            e->GetErrorMessage(pszErrText,100);
            AfxMessageBox(pszErrText,MB_OK);

            //DELETE_EXCEPTION(e);
        }
        if ( TCL_OK != rCode )
        {
            _tprintf( _T("There are errors in your Tcl File\n") );
        }
    }
    return nRetCode;
}

【測試執行】:

1.編寫Tcl腳本並調用擴展命令。
Url2Pattern.tcl

#Log開關
set bFlagLog 1

#獲取當前程序路徑
set source "WHITE.src"
set dest "WHITE.dst"
set curpath [ GetPath ]

#用例文件
set testdatafile [format "%s/%s" $curpath $source]
#結果文件
set testresultfile [format "%s/%s" $curpath $dest]

#打開文件
set hftestdata [open $testdatafile r]
set hftestresult [open $testresultfile w]
…
#不斷的逐行地讀取用例數據文件直到文件結束
while { ![eof $hftestdata] } {
#獲取一行數據並把它保存到變量sstr中
gets $hftestdata sstr
……

#執行DoChoose,結果寫入ret($i)
set ret($i) [DoChoose $p3($i) $p4($i)] #調用已註冊的TCL命令,將測試數據和預期結果傳入MultiChooseCore函數。

#Log:輸出執行結果到屏幕
if { 1 == $bFlagLog } {
puts $ret($i)
}


…

puts $hftestresult "---------------------------------------------------------"
#關閉文件
close $hftestdata
close $hftestresult

2.準備測試用例。

第一列是用例執行標誌位,Y代表執行,N代表不執行。
第二列爲用例編號。
第三列是預期結果,0代表Trident內核,1代表Webkit內核。

這裏寫圖片描述

3.測試結果:
這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章