《電子技術應用》
您所在的位置:首頁 > 測試測量 > 設計應用 > 基于.NET平臺GUI自動化測試框架的設計
基于.NET平臺GUI自動化測試框架的設計
來源:微型機與應用2010年第19期
段 瑩,郭利剛
(武漢理工大學 計算機學院,湖北 武漢 430063)
摘要: 分析了錄制回放技術的基本原理和缺陷,運用WIN32API和.NET反射機制,設計了一個改進的輕量級GUI自動化測試框架,解決了當前測試自動化中出現的一些棘手問題。
Abstract:
Key words :

摘  要: 分析了錄制回放技術的基本原理和缺陷,運用WIN32API和.NET反射機制,設計了一個改進的輕量級GUI自動化測試框架,解決了當前測試自動化中出現的一些棘手問題。
關鍵詞: GUI;自動化測試;反射

    軟件測試是保證軟件質量的有效手段。目前,在GUI自動化測試中,很多軟件體系都采用錄制回放技術。這種技術要求測試者通過鼠標和鍵盤的點擊進行工作,腳本記錄事件,然后以自動化測試的方式進行回放。記錄下來的測試腳本必須經過編輯和調試之后插入驗證和檢查點。產生的腳本通常是硬編碼,需要測試人員對腳本進行編輯以及參數化操作。同時,界面元素屬性的任何變化都會影響腳本的運行,有時甚至需要重新錄制腳本。
1 .NET中的反射機制
    通常,應用程序(包括桌面程序和Web應用)都由一些基本的界面控件組成,所有的軟件指令都是通過控件以事件或消息的形式傳遞給后臺處理。GUI自動化測試的本質是對GUI中的控件元素提供編程手段[2]。在基于GUI對象識別和控制的自動化測試工具中,過去一直依賴于Windows API函數的調用。而隨著新的編程語言和平臺的出現,涌現了很多新的語言特性,這些語言特性可用于自動化測試工具的設計,例如反射機制就是其中一項技術。
    反射(Reflection)是.NET中的重要機制,通過反射可以在運行時獲得.NET中每一個類型(包括類、結構、委托、接口和枚舉等)的成員,包括方法、屬性、事件及構造函數等,還可以獲得每個成員的名稱、限定符和參數等。如果獲得了構造函數的信息,即可直接創建對象,即使這個對象的類型在編譯時還不知道。程序集包含模塊,而模塊包含類型,類型又包含成員,反射則提供了封裝程序集、模塊和類型的對象。可以使用反射動態地創建類型的實例,將類型綁定到現有對象或從現有對象中獲取類型,然后調用類型的方法或訪問其字段和屬性[3]。
2 框架的整體設計
    自動化測試框架的搭建基本上占了整個自動化測試工作量的40%,是自動化測試實施的一個重要組成部分。軟件自動化框架從本質看是一系列的策略思想、規范文件和代碼的集合。本文提出一種改進的輕量級的GUI自動化測試框架,該框架可以幫助用戶避免當前測試工具出現的缺陷。此框架將具備以下五個特性:GUI控件自動搜索、自動生成和執行測試腳本、基于數據驅動的原則、測試的自動驗證、使用編程語言開發。框架的整體設計如圖1所示。從圖1可以看出,該框架讓測試人員從繁重的錄制工作中解放出來,將更多的時間和精力集中在測試用例的設計中。

3 框架具體開發
3.1 加載被測試程序

    為了測試GUI應用程序,必須在測試工具中運行被測程序使兩個程序交互。使用Assembly定義和加載程序集,加載在程序集清單中列出模塊,并從此程序集中查找類型,創建該類型的實例。為了使這兩個應用程序實現交互,必須通過多線程機制實現。下面是通過反射加載被測程序的核心代碼[4]:
    Assembly asm=Assembly.LoadFrom(path);
    Type t1=asm.GetType(formName);
    testForm=(Form)asmCreateInstance(t1.FullName);
    ParameterizedThreadStart pt=new ParameterizedThreadStart(AppRun);
    Thread thread=new Thread(pt);
    thread.Start(testForm);
    private void AppRun(Form theForm)
    {
       Application.Run(theForm);
    }
3.2 GUI控件搜索
    大部分自動化功能測試工具,尤其是商業的測試工具,都是基于GUI對象識別技術設計的。基本思想是每個基于窗體的控件都是一個窗體,每個控件或窗體都有一個句柄來進行訪問、操作和檢查。
    實現GUI測試自動化的困難之一是測試工具并不知道被測程序中存在哪些GUI部件。錄制回放工具使用手工錄制過程暫時解決了這一問題。Win32 API中封裝了很多可用于自動化測試編程的函數,這些函數可在編程語言進行調用,實現自動化測試編程。本文的自動化GUI測試工具將采用Win32 API對被測程序進行自動、系統、全面的控件搜索。實現該搜索將用到Win32 API中封裝的可用于自動化測試編程的函數,包括:GetWindowRect、mouse_event、GetCursorPos和WindowFromPoint函數等。GetWindowRect函數返回指定窗口的邊框矩形的尺寸。該尺寸以相對于屏幕坐標左上角的屏幕坐標給出。通過使用這個函數可以計算出窗口的寬度和高度。mouse_event函數能模擬鼠標擊鍵和鼠標動作。GetCursorPos函數檢取光標的位置,并以屏幕坐標來表示。使用WindowFromPoint函數能獲得包含指定點的控件的句柄。一旦得到了窗口的句柄,就能得到控件的文本、類名以及父窗口的句柄。為了對界面進行徹底的控件搜索,該框架將使用嵌套循環,從界面的左上角到界面的右下角依次移動鼠標進行控件識別,并將結果保存到對象庫中[5]。
    該模塊實現的偽代碼如下:
    RECT  rt=new RECT();
    GetWindowRect(iHandle,ref rt);
    width=rt.Right-rt.Left; //得到界面的寬度
    height=rt.Bottom-rt.Top; //得到高度
    step=8; //鼠標每次移動的像素
    for (int x=0;x<width;x+=step)
    {
        for (int y=0;y<height;y+=step)
        {
           mouse_event();      //移動鼠標到相應的坐標

           GetCursorPos();        //得到坐標點處的光標
           WindowFromPointGet();  //得到此處的控件句柄
           GetWindowText();           //得到窗體的文本
          GetClassName();             //得到控件的類別
          GetParent();              //得到父窗體的句柄
         if (the handle does not exist in object repository)
         then save the infomation.
      }
    }
    通過對界面的徹底搜索,可以得出控件的句柄、文本、類名、父窗體的句柄以及GUI控件間的層次關系。
3.3 生成測試用例
    實現GUI測試自動化的另一個問題是測試工具不能按事件發生的順序來選擇和操作控件。傳統的測試工具通過錄制的方法記錄程序運行的順序,但是這種機制存在很多限制。本文設計的自動化測試框架的思路是經過界面控件的徹底搜索后,控件的詳細信息會保持到對象庫中。此時,測試人員可以通過測試用例的輸入/輸出模塊來編寫測試用例。該模塊是一個可視化編輯器。測試用例編輯器從對象庫中導入對象信息,該模塊根據測試用例設計人員的操作順序自動產生事件的順序并將測試步驟保存到XML文件中。按事件發生的順序存儲的相關事件可以形成一個測試場景。測試用例編寫者可以對產生的測試場景進行編輯,改變測試步驟的順序或者添加更多的事件。測試運行模塊將會從XML文件中讀取測試用例,按事件的順序執行相應的操作。
3.4 執行并驗證測試
    基于數據驅動的原則,在測試用例產生之后,測試用例文件驅動測試的執行。不同的控件類型將從測試類庫中調用不同的測試執行方法。該模塊采用反射機制來模擬用戶的操作。反射提供了延遲綁定,能模擬用戶的常用操作,如編輯控件文本、單擊按鈕等。調用控件的事件方法的關鍵是要用到反射中的MethodInfo.Invoke方法。如果沒有潛在的其他問題,可以像下面這樣調用控件的事件方法:
    Type t1=testForm.GetType();
    MethodInfo mi=t1.GetMethod(“button1_Click”,flags);
    mi.Invoke(testForm,new object[]{null,EventArgs.Empty});
    注意在調用該方法時要充分考慮線程的問題。該方法不是從被測應用程序運行的線程被調用的,而是從測試工具本身的主線程中被調用的。因此,應該通過調用Form.Invoke方法間接運行MethodInfo.Invoke方法[4]。
    驗證測試過程中,為了得到控件的屬性或字段信息,將用到反射中的Form.GetType、Type.GetField、FieldInfo.GetValue、PropertyInfo.GetValue等方法。通過比較測試用例的預期結果和實際運行結果來決定測試結果。然后將測試用例的編號、預期結果、實際結果以及時間信息保存到XML文件中,同時可采用XSLT方式將測試結果以更友好的方式展現出來。
3.5 使用Windows調度程序
    測試人員可能希望測試工具能在指定時間自動地運行測試,例如晚上11:00點。這樣,整個測試工作可以在下班之后進行,到第二天就能看到測試運行的結果。事實上,Microsoft都包含一個能在給定時間執行命令的程序。當前版本中,這個程序是Scheduled Tasks,位于控制面板上。打開這個文件夾,會看到Add Scheduled Task 圖標,單擊它可以啟動向導。有一個重要的選項是Task選項卡上的Run文本框,如圖2所示。可以在該文本框中添加相應的參數來完成自動化測試[6]。

    本文設計了一個輕量級的GUI自動化測試框架,該框架可以系統、全面、主動地實現控件搜索,避免了傳統測試工具中繁重的錄制過程。界面控件的任何改變也不會影響測試腳本的運行。該框架讓測試人員從繁瑣的錄制工作、測試腳本的編輯和驗證點的插入工作中解放出來,使測試人員能將更多的時間和精力集中到測試用例的設計中。
參考文獻
[1] BECK K. Test driven development: by example[M]. Addison-Wesley Professional, 2002.
[2] DUSTIN E, RASHKA J, PAUL J. Automated software testing introduction, management, and performance[M]. Boston addison Wesley,1999.
[3] 柳勝.軟件自動化測試框架設計與實踐[M].北京:人民郵電出版社,2009.
[4] ZHOU R Z, WEI Z K. Study on Application of .NET Reflection in Automated Testing[J]. ICACT, 2010,7-10:(797-800).
[5] MCCAFFREY J D. .NET test automation recipes: a problem-solution approach[M]. Apress, 2006.
[6] LI K L, WU M Q. Effective GUI testing automation: developing an automated GUI testing tool[M].王軼昆,譯.北京:電子工業出版社,2005.
[7] ROOT R, SWEENEY M R. A tester’s guide to .NET Programming[M].楊浩,譯.北京:清華大學出版社,2007:279-280.

此內容為AET網站原創,未經授權禁止轉載。
亚洲一区二区欧美_亚洲丝袜一区_99re亚洲国产精品_日韩亚洲一区二区
91久久黄色| 亚洲主播在线观看| 99国产精品自拍| 亚洲成人在线观看视频| 亚洲婷婷综合久久一本伊一区| 一本色道88久久加勒比精品| 欲香欲色天天天综合和网| 国产欧美日韩中文字幕在线| 国产精品欧美久久| 欧美性久久久| 国产精品国产三级国产普通话三级| 欧美日本一区二区三区| 欧美高清视频www夜色资源网| 美女免费视频一区| 久热这里只精品99re8久| 久久五月天婷婷| 老司机一区二区| 蜜桃av综合| 欧美成人自拍| 欧美国产精品中文字幕| 欧美大片在线影院| 欧美大片免费| 欧美激情无毛| 欧美人牲a欧美精品| 欧美日韩国产麻豆| 欧美视频免费看| 欧美手机在线视频| 国产精品日韩欧美一区二区| 国产午夜精品美女视频明星a级| 国产日韩欧美综合一区| 国产一区二区三区久久 | 国产欧美日韩91| 国产视频久久网| 国产一区在线播放| 一区二区视频在线观看| 亚洲精品国偷自产在线99热| 在线视频欧美日韩精品| 亚洲欧美国产另类| 久久福利一区| 99精品国产在热久久下载| 在线综合+亚洲+欧美中文字幕| 亚洲一区二区三区在线| 欧美在线视频一区二区三区| 久久久久九九九| 欧美高清在线精品一区| 欧美久色视频| 国产精品久久久久久久一区探花 | 久久综合婷婷| 欧美另类极品videosbest最新版本| 欧美日韩视频在线第一区| 国产精品卡一卡二| 加勒比av一区二区| 亚洲免费观看在线视频| 亚洲综合精品四区| 亚洲黑丝在线| 亚洲欧美国产另类| 久久久综合网站| 欧美日韩国产一中文字不卡| 国产精品自拍在线| 亚洲国产欧美在线人成| 在线视频亚洲欧美| 久久国内精品自在自线400部| 亚洲精品在线视频| 午夜久久影院| 欧美大片91| 国产欧美一区二区色老头| 亚洲国产成人在线| 亚洲综合第一页| 亚洲美女黄网| 久久精品免视看| 欧美日韩中文字幕综合视频 | 狠久久av成人天堂| 一区二区三区产品免费精品久久75| 欧美一区中文字幕| 夜夜精品视频一区二区| 久久久精品国产免费观看同学| 欧美日韩精品免费观看视频| 国语对白精品一区二区| 一区二区毛片| 亚洲黄色一区| 久久精品国产一区二区三| 欧美日韩一区二区在线| 精品51国产黑色丝袜高跟鞋| 亚洲图片欧美日产| 99re成人精品视频| 久久午夜精品| 国产精品一区视频网站| 亚洲美女中文字幕| 亚洲国产精品99久久久久久久久| 亚洲欧美另类综合偷拍| 欧美激情自拍| 亚洲成人影音| 久久精品国产亚洲一区二区三区| 亚洲欧美中文字幕| 欧美日本在线| 亚洲三级影片| 亚洲国产成人一区| 久久国内精品视频| 国产精品国产馆在线真实露脸| 亚洲日韩欧美视频一区| 亚洲第一精品影视| 久久不射网站| 国产精品入口夜色视频大尺度| 亚洲乱码久久| 日韩午夜在线观看视频| 嫩草成人www欧美| 激情综合久久| 欧美在线综合视频| 久久国产精品高清| 国产伦理精品不卡| 亚洲一区二区三区在线| 亚洲一区二区动漫| 欧美日韩视频| 日韩视频一区二区在线观看| 日韩视频在线观看| 欧美激情四色| 亚洲精品乱码久久久久久日本蜜臀| 亚洲经典在线看| 嫩草国产精品入口| 亚洲第一福利在线观看| 亚洲高清视频一区| 久久一日本道色综合久久| 韩国一区二区三区在线观看| 欧美一区二区三区免费看| 欧美一区二区三区四区在线| 国产精品影院在线观看| 先锋a资源在线看亚洲| 欧美在线日韩| 国产丝袜美腿一区二区三区| 欧美亚洲综合久久| 久久精品国产精品亚洲精品| 国产亚洲在线| 久久精品国产成人| 麻豆乱码国产一区二区三区| 雨宫琴音一区二区在线| 亚洲精品日产精品乱码不卡| 欧美激情网友自拍| 一本到高清视频免费精品| 亚洲一级二级| 国产精品色婷婷| 午夜在线视频一区二区区别| 久久激情五月婷婷| 一区二区三区在线看| 最新成人av在线| 欧美日韩国产成人在线观看| 一道本一区二区| 欧美一区二区大片| 韩国av一区二区三区在线观看| 亚洲激情成人在线| 欧美精品久久99久久在免费线| 99ri日韩精品视频| 午夜精品福利一区二区蜜股av| 国产午夜久久| 亚洲欧洲日本专区| 欧美视频网站| 欧美亚洲免费电影| 男人天堂欧美日韩| 一区二区三区 在线观看视频| 欧美一区二区三区视频在线观看| 狠狠88综合久久久久综合网| 亚洲精品影院| 国产精品免费一区豆花| 久久激情综合| 欧美日韩精品免费观看视频| 亚洲欧美综合国产精品一区| 榴莲视频成人在线观看| 99在线精品观看| 久久成人免费视频| 亚洲国产精品va| 亚洲免费视频观看| 伊人男人综合视频网| 在线一区二区日韩| 国产一区二区三区在线观看精品 | 国产日韩av在线播放| 亚洲成人资源网| 欧美日韩国产区一| 午夜免费电影一区在线观看| 欧美ab在线视频| 亚洲一区二区三区四区五区黄| 欧美+日本+国产+在线a∨观看| 亚洲一区国产| 欧美暴力喷水在线| 亚洲欧美一区在线| 欧美伦理一区二区| 性欧美xxxx大乳国产app| 欧美韩日一区二区三区| 亚洲欧美日本精品| 欧美国产日韩一区| 性欧美大战久久久久久久久| 欧美日韩aaaaa| 久久国产黑丝| 国产精品久久久久久久久免费桃花 | 亚洲午夜精品久久久久久app| 久久夜色精品国产亚洲aⅴ| 一本色道久久综合亚洲精品婷婷 | 欧美va天堂在线| 先锋影音国产一区| 欧美色精品在线视频| 亚洲国产电影| 国产亚洲精品bv在线观看|