欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
Web 應用程序用戶(hù)界面低層測試自動(dòng)化



  Web 應用程序日漸復雜,對它們的測試工作也變得越來(lái)越重要。有很多測試技術(shù)可供你選擇使用。例如,在 2005 年 4 月份的 MSDN 雜志中,我描述了一個(gè)基于 JScript 的簡(jiǎn)單系統,它使用 IE 的文檔對象模型(Internet Explorer Document Model)來(lái)完整地測試某個(gè) Web 應用程序的用戶(hù)界面。這個(gè)技術(shù)很有效,但是在幾個(gè)方面存在著(zhù)缺陷。我的一些同事問(wèn)我是否能使用 .Net 框架編寫(xiě)功能更強,但仍然是輕量級的 Web 應用程序用戶(hù)界面自動(dòng)化測試程序。在這個(gè)月的專(zhuān)欄文章中,我將向你們展示怎樣達到這個(gè)目的。這個(gè)低層技術(shù)要求直接調用 fmshtml.dll 和 shdocvw.dll 動(dòng)態(tài)鏈接庫來(lái)訪(fǎng)問(wèn)和操縱 IE 瀏覽器客戶(hù)區中的 HTML 對象。
  讓我們從一個(gè)屏幕截圖開(kāi)始,如圖1所示。圖1表明我正在測試一個(gè)虛構的 Web 應用程序,它搜索一個(gè)雇員信息數據倉庫。用戶(hù)能通過(guò)雇員的姓和名進(jìn)行搜索。應用程序顯示雇員的姓、名,如果大小寫(xiě)都匹配,那么顯示相應的生日。通過(guò)手工測試這個(gè) Web 應用程序的用戶(hù)界面是非常沉悶的、低效的,并且可能錯誤百出。更好的一種方法是通過(guò)測試自動(dòng)化。該自動(dòng)化啟動(dòng)一個(gè)IE實(shí)例,裝載正在進(jìn)行的測試,操縱應用程序,并檢查應用程序的正確性狀態(tài)。


圖1 測試執行例子

  當然,一個(gè)實(shí)際的 Web 應用程序肯定比這更加復雜,但是我向你們展示的技術(shù)能夠用來(lái)測試基于 IE 的 Web 應用程序。在接下來(lái)的一節中,我將簡(jiǎn)要介紹正進(jìn)行測試的 Web 應用程序,這樣你就能理解我在測什么和怎么測。我也會(huì )詳細解釋產(chǎn)生圖1的測試場(chǎng)景代碼,也會(huì )描述怎樣改編和擴展這里描述的技術(shù)。

被測試的 Web 應用程序

  我的 Web 應用程序,WebForm1.aspx,是一個(gè)ASP.NET程序,但是本專(zhuān)欄描述的技術(shù)能夠應用于任何類(lèi)型的 Web 應用程序中。我的程序包括:兩個(gè)單選按鈕控件來(lái)告訴應用程序的控制邏輯要搜索的是哪一種字段;一個(gè)文字輸入控件來(lái)接受用戶(hù)的搜索項;一個(gè)按鈕控件來(lái)啟動(dòng)搜索;以及一個(gè)文本區,用來(lái)顯示結果。在文本區的下方,有一個(gè)標志欄,它顯示“搜索完成”,它的初始狀態(tài)是隱藏。我這里闡述的技術(shù)的兩個(gè)優(yōu)點(diǎn)是:我不用對該Web應用程序進(jìn)行插裝,也不需要接觸應用程序的源代碼。但是,我需要知道Web應用程序中各種HTML元素的ID號,通過(guò)View/Source,我能輕易做到這一點(diǎn)(不過(guò)要求ID必須是靜態(tài)的,不能是動(dòng)態(tài)的)。例如,按鈕控件有ID號“Button1”,而“Last Name單選按鈕”控件有ID號“RadioButtonList1_0”。當然,如果你能夠接觸程序的源代碼,你肯定已經(jīng)有了這些控件的ID信息。
  我使用Visual Studio.NET來(lái)創(chuàng )建這個(gè)用來(lái)測試的虛構的Web應用程序。從Visual Studio.NET的設計角度來(lái)看,我添加了三個(gè)標簽控件、一個(gè)單選按鈕、一個(gè)文本區、一個(gè)按鈕控件和一個(gè)列表框控件。為簡(jiǎn)化起見(jiàn),我使用了控件的默認名稱(chēng)“Label1”、“TetBox1”等。相關(guān)代碼列在圖2中。我聲明了一個(gè)Employee類(lèi)和一個(gè)ArrayList對象來(lái)存放Employee對象。在方法Page_Load中,我向ArrayList中增加了虛構的雇員數據。在實(shí)際的應用程序中,你的數據可能來(lái)自于SQL Server數據庫或XML文件。但就用戶(hù)界面測試自動(dòng)化來(lái)說(shuō),數據來(lái)自哪里是無(wú)關(guān)緊要的。
  方法Button1_Click中清空列表框控件,從文本框控件中獲取過(guò)濾子串,檢查單選按鈕以便確定是搜索姓還是搜索名,在內存數據中搜索相匹配的,并把匹配的雇員信息顯示出來(lái)。我得強調一下,為了使應用程序例子簡(jiǎn)單,我在這里可能用了一些不好的編碼技術(shù)。這與你可能遇到的某種情況非常類(lèi)似——你所處理的應用程序是發(fā)布前的,代碼可能并沒(méi)有經(jīng)過(guò)優(yōu)化。我的Web應用程序顯然是虛構的,但是通過(guò)用戶(hù)界面來(lái)測試任何Web應用程序的基本要素是應用程序隨著(zhù)每一個(gè)HTTP請求-應答對的狀態(tài)轉換。換句話(huà)說(shuō),就算你打算測的Web應用程序要求訪(fǎng)問(wèn)SQL Server數據庫或者進(jìn)行了非常復雜的處理,它只是一種狀態(tài)轉換,并且這種轉換會(huì )在HTTP應答和用戶(hù)界面中顯示出來(lái)。

測試自動(dòng)化

  測試場(chǎng)景系統由一個(gè)單一文件組成。我打算把我的測試集實(shí)現為一個(gè)C??刂婆_應用程序,但你將會(huì )看到,我能使用任何與.Net兼容的語(yǔ)言?。ɡ?,Visual Basic .NET),該技術(shù)也能用于任何程序(例如,一個(gè)Windows程序)和測試框架(例如,NUnit)。場(chǎng)景的整體結構顯示在圖3中。首先,我向“Microsoft Internet Controls”這個(gè)優(yōu)秀的COM組件添加了一個(gè)引用(reference)。這是shdocvw.dll模塊的一個(gè)別名,該模塊擁有操作基于Windows的瀏覽器(例如IE和Windows Explorer)的能力。然后我向Microsoft.mshtml.Net組件添加了一個(gè)引用。這是mshtml.dll模塊的一個(gè)別名,該模塊擁有訪(fǎng)問(wèn)HTML元素的能力。我向兩個(gè)相應的名字空間增加了“using”聲明,這樣我就不需完整驗證他們的類(lèi)了。我也針對System.Diagnostics和System.Threading分別增加了“using”聲明,這樣我容易引用前者的Process類(lèi),也能在我合適的時(shí)候引用后者的Thread.Slepp方法來(lái)暫停我的自動(dòng)化過(guò)程。
  這項技術(shù)的一個(gè)關(guān)鍵是要有能力確定一個(gè)Web頁(yè)面/文檔/應用程序何時(shí)已經(jīng)在IE中充分裝載了。我定義了一個(gè)類(lèi)范圍的AutoResetEvent對象documentComplet,我使用該對象來(lái)標記一個(gè)已經(jīng)充分裝載了文檔的等待線(xiàn)程。

static AutoResetEvent documentComplete = new AutoResetEvent(false);

  馬上,我就會(huì )詳細介紹這里的細節。我由向命令行中打印一條狀態(tài)信息來(lái)開(kāi)始我的測試場(chǎng)景。然后我聲明了一個(gè)Boolean類(lèi)型的變量pass并把它設為false。我假設測試場(chǎng)景會(huì )失敗,如果我檢測到應用程序的最后狀態(tài)是正確的,我修正我的假設并把pass變量設為true。下一步我聲明了一個(gè)InternetExplore對象“ie”:

Console.WriteLine("\nStart test run");                        bool pass = false;                        InternetExplorer ie = null;                        
  InternetExplorer類(lèi)是在SHDocVw名字空間中定義的。該類(lèi)有很多方法操縱Internet Explorer的一個(gè)實(shí)例,但是由你決定啟動(dòng)Internet Explorer并把兩者相關(guān)聯(lián),如下所示:
// launch explorer                        Console.WriteLine("\nLaunching an instance of IE");                        Process p = Process.Start("iexplore.exe", "about:blank");                        if (p == null) throw new Exception("Could not launch IE");                        Console.WriteLine("Process handle = " + p.MainWindowHandle.ToString());                        // find all active browsers                        SHDocVw.ShellWindows allBrowsers = new SHDocVw.ShellWindows();                        Console.WriteLine("Number active browsers = " + allBrowsers.Count);                        if (allBrowsers.Count == 0) throw new Exception("Cannot find IE");                        
  我使用System.Diagnostics.Process名字空間中的Start方法來(lái)啟動(dòng)一個(gè)Internet Explorer(iexplore.exe)并裝載空白頁(yè)面“about:blank”;Start方法返回對創(chuàng )建進(jìn)程對象的一個(gè)引用。然后我初始化了一個(gè)名為allBrowsers的ShellWindows對象。這個(gè)對象掌握了對所有ShellWindows對象的引用,也掌握了對瀏覽器的引用(包括Windows Explorer的實(shí)例,我剛才啟動(dòng)的Internet Explorer的實(shí)例和之前啟動(dòng)的Internet Explorer的實(shí)例)。我使用Count屬性來(lái)顯示關(guān)于目前活動(dòng)瀏覽器的診斷信息,以便確保Internet Explorer成功啟動(dòng)了。測試自動(dòng)化的下一步是把新的進(jìn)程與Internet Explorer對象關(guān)聯(lián)起來(lái):
Console.WriteLine("Attaching to IE");                        for(int i=0; i < allBrowsers.Count && ie == null; i++)                        {                        InternetExplorer e = (InternetExplorer)allBrowsers.Item(i);                        if (e.HWND == (int)p.MainWindowHandle) ie = e;                        }                        if (ie == null)  throw new Exception("Failed to attach to IE");                        
  可能有好幾個(gè)Internet Explorer的實(shí)例正在運行,所以我需要辨明哪個(gè)是我的測試場(chǎng)景啟動(dòng)的,以便我能把我的InternetExplorer變量ie與正確的實(shí)例關(guān)聯(lián)起來(lái)。記住,我把測試啟動(dòng)的Internet Explorer捕獲到一個(gè)進(jìn)程對象p中了。所以我遍歷ShellWindows中的每一個(gè)對象,檢查他們的句柄或指針是否和測試啟動(dòng)的進(jìn)程的主窗口句柄一致。我有時(shí)候采用的一個(gè)替換的方法是假設只有我的測試Internet Explorer實(shí)例允許運行。如果有多個(gè)Internet Explorer實(shí)例運行,我拋出一個(gè)異常。這個(gè)假設運行我把測試Internet Explorer與下面的代碼簡(jiǎn)單關(guān)聯(lián)起來(lái):
ie = (InternetExplorer)allBrowsers.Item(0);                        
  你實(shí)際采用何種方法取決于你的實(shí)際測試場(chǎng)景。既然我建立了我的測試InternetExplorer對象,我能注冊我之前提到的DocumentComplete事件句柄:
ie.DocumentComplete += new                        DWebBrowserEvents2_DocumentCompleteEventHandler(ie_DocumentComplete);                        
  簡(jiǎn)單來(lái)說(shuō),當InternetExplorer的DocumentComplete事件發(fā)生時(shí),調用用戶(hù)定義的ie.DocumentComplete方法。如果你回頭去看圖3中的代碼,你能看到我如此定義了該方法:
private static void ie_DocumentComplete(object pDisp, ref object URL)                        {                        documentComplete.Set();                        }                        
  ie_DocumentComplete 方法調用了我早些時(shí)候在測試類(lèi)中定義的AutoResetEvent對象中的Set方法。簡(jiǎn)而言之,現在我能暫停我的執行線(xiàn)程,直到我的InternetExplorer對象充分裝載了。我會(huì )立即向你展示怎樣具體做這件事情?,F在我瀏覽正在進(jìn)行測試的Web應用程序,等到應用程序充分裝載:
Console.WriteLine("\nNavigating to the Web app");                        object missing = Type.Missing;                        ie.Navigate("http://localhost/LowLevelWebUIAutomationApp/WebForm1.aspx",                        ref missing, ref missing, ref missing, ref missing);                        documentComplete.WaitOne();                        
  我使用InternetExplorer.Navigate方法來(lái)裝載我的Web應用程序。Navigate接受數個(gè)可選參數,但是在這個(gè)例子中,我不需要任何參數。注意,我調用了documentComplete對象的WaitOne方法。WaitOne將停止我的執行線(xiàn)程,直到應用程序充分裝載到了Internet Explorer中。在這個(gè)例子中,我沒(méi)有提供一個(gè)超時(shí)值,所以我會(huì )不停的等待,但你很可能會(huì )向WaitOne傳遞一個(gè)代表超時(shí)毫秒數的整型值。下一步我設定Internet Explorer為一個(gè)固定的大小,并獲得Web應用程序文檔的一個(gè)引用。
Console.WriteLine("Setting IE to 525x420");                        ie.Width = 525;                        ie.Height = 420;                        HTMLDocument theDoc = (HTMLDocument)ie.Document;                        
  我聲明了一個(gè)HTMLDocument變量,并為它指定了一個(gè)值。HTMLDocument接口是在mshtml名字空間中定義的。我怎么知道呢?圖4是Visual Studio .NET對象瀏覽器的一個(gè)屏幕截圖。我擴展mshtml interop到匯編層,看到了它們的所有接口、類(lèi)、事件和其他對象。


圖 4對象瀏覽器

下一步,我模擬了對“Last Name”單選按鈕的檢查,向文本框控件中輸入“urk”:

Console.WriteLine(                        "\nSelecting ‘‘Last Name‘‘ radio button");                        HTMLInputElement radioButton =                        (HTMLInputElement)theDoc.getElementById("RadioButtonList1_0");                        radioButton.@checked = true;                        Console.WriteLine("Setting text box to ‘‘urk‘‘");                        HTMLInputElement textBox =                        (HTMLInputElement)theDoc.getElementById("TextBox1");                        textBox.value = "urk";                        
  這兩段代碼是非常相似的,并且看起來(lái)相當明白。我通過(guò)getElementByID方法獲得了HTMLInputElemen對象的引用。在擁有這個(gè)對象之后,我能使用它的屬性或方法來(lái)操縱它。這里我選擇單選按鈕控件的“checked”屬性(因為在C#中checked是一個(gè)保留字,我必須使用“@checked”)和文本框控件的“value”屬性。按你下面看到的方式點(diǎn)擊Search按鈕:
Console.WriteLine("Clicking search button");                        HTMLInputElement button =                        (HTMLInputElement)theDoc.getElementById("Button1");                        button.click();                        documentComplete.WaitOne();                        
  在這個(gè)例子中,我需要調用WaitOne方法來(lái)確保表示搜索結果的頁(yè)面被充分裝載了。通過(guò)一些很小的實(shí)驗,你會(huì )發(fā)現你能虛擬操縱任何HTML元素。例如,我能模擬下拉框的選擇、超鏈接的點(diǎn)擊,當然在這個(gè)測試場(chǎng)景中我無(wú)需這樣做。在我操作Web應用程序之后,我必須檢查最終狀態(tài)的正確性。
Console.WriteLine("\nSeeking ‘‘Burke, Brian‘‘ in list box");                        HTMLSelectElement selElement =                        (HTMLSelectElement)theDoc.getElementsByTagName(                        "select").item(0, null);                        if (selElement.innerText.ToString().IndexOf("Burke, Brian") >= 0)                        {                        Console.WriteLine("Found target string");                        pass = true;                        }                        else                        {                        Console.WriteLine("*Target string not found*");                        }                        
  一般模式是通過(guò)共同的標簽名獲得一個(gè)HTML元素集的引用,然后使用屬性得到某一特定元素,然后獲取表示該元素頭標簽和尾標簽之間數據串的innerText。這里,我獲得了所有<select>元素的引用,然后通過(guò)元素集的屬性得到了第一個(gè)<select>元素——當然,也是我的Web頁(yè)面中唯一的<select>元素。這是由一個(gè)ASP.NET列表框控件生成的HTML。傳遞給項目屬性的參數有點(diǎn)復雜。第一個(gè)參數既可以是整數,也可以是字符串,前者被理解為基于0的索引值,后者被理解為標簽名。我向項目屬性的第二個(gè)參數傳遞一個(gè)空值NULL。這個(gè)參數也是一個(gè)索引值,但它只是在項目屬性返回一個(gè)集合而不是一個(gè)原子對象時(shí)才有用。有時(shí)你需要訪(fǎng)問(wèn)不是任何HTML字元素中的文檔體中的值,下面的代碼片斷向你展示了一種達到目的的方法:
Console.WriteLine("Seeking ‘‘Search complete‘‘ in body");                        HTMLBody body = (HTMLBody)theDoc.getElementsByTagName(                        "body").item(0, null);                        if (body.createTextRange().findText("Search complete", 0, 0) == true)                        {                        Console.WriteLine("Found target string");                        pass = true;                        }                        else                        {                        Console.WriteLine("*Target string not found*");                        }                        
  我獲得了文檔體的一個(gè)引用,使用從createTextRange返回的IHTMLTxtRange對象的findText方法來(lái)搜索一個(gè)目標串。這兩個(gè)參數0表示從“范圍的開(kāi)始”搜索,匹配部分串。啟動(dòng)Internet Explorer之后,裝載測試中的Web應用程序,操作程序界面,檢查程序的狀態(tài),剩下來(lái)需要做的就是決定測試結果是正確還是錯誤,還有要關(guān)閉Internet Explorer。
if (pass) Console.WriteLine("\nTest result = Pass\n");                        else Console.WriteLine("\nTest result = *FAIL*\n");                        Console.WriteLine("Closing IE in 3 seconds . . . ");                        Thread.Sleep(3000);                        ie.Quit();                        Console.WriteLine("\nEnd test run");                        
  在這個(gè)案例中,我簡(jiǎn)單的把我的測試結果記錄在命令行中,你可能要把你的測試結果寫(xiě)到一個(gè)文本文件、XML文件或者SQL Server數據庫中。

自動(dòng)化擴展

  我在這里闡述的這個(gè)簡(jiǎn)單的低層Web應用程序用戶(hù)界面測試自動(dòng)化技術(shù)的代碼,你能從本專(zhuān)欄附屬的代碼中下載到。你能從幾個(gè)方面擴展這個(gè)技術(shù)。一個(gè)顯著(zhù)的加強是使測試場(chǎng)景完全是自動(dòng)化的。因為測試系統創(chuàng )建了一個(gè).exe文件,你能輕易安排它在不需要手工交互的情況下運行,例如,使用Windows任務(wù)計劃。你也可能使用System.Web.Mail名字空間(如果你使用的是.NET構架2.0,你將使用System.Net.Mail名字空間),通過(guò)e-mail發(fā)送測試運行結果總結。我在這里闡述的測試系統是一個(gè)簡(jiǎn)單的程序。雖然簡(jiǎn)單有效,但是測試集的重用卻是困難的。你可以把這些基本路徑提煉到一個(gè).Net類(lèi)庫中。
  但我在這個(gè)專(zhuān)欄中討論一項技術(shù)時(shí),我常省略了很多錯誤檢測,你也可以寫(xiě)出你自己的錯誤檢測語(yǔ)句,向你的測試集增加一些更細微的異常處理塊。另外,為清晰起見(jiàn),我的輸入參數是嚴格限定的。你可以通過(guò)腳本來(lái)更靈活的指定它們,如果用一個(gè)XML文件來(lái)驅動(dòng)測試則是更好的方法。
  我闡述的方法的兩個(gè)特點(diǎn)是:你無(wú)需接觸Web應用程序的源代碼;由于你工作在一個(gè)很低的層次,你能充分控制應用程序的用戶(hù)界面。隨著(zhù)Web應用程序系統在復雜性上增加,測試你的軟件比以前更重要。我這里描述的Web應用程序用戶(hù)界面測試在你的產(chǎn)品測試中能起一個(gè)很大的作用。



 

本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
WEB 自動(dòng)化測試演示
操縱IE瀏覽器模擬用戶(hù)登錄CSDN
如何對webbrowser和IE編程(八)
用Visual C#打造個(gè)性化的IE瀏覽器
BHO編程
手動(dòng)修復被篡改的瀏覽器主頁(yè)
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久