使用分層的 Selenium 框架進行復雜 Web 應用的自動測試(2)

發表于:2014-08-07來源:IBM作者:王晨點擊數: 標簽:selenium
繼續上文谷歌搜索的場景,通過實例來了解 TestNG 的用法與功能。 清單 5. TestNG 應用示例 @Parameters( { url, query-string, btn-id, txt-id, verify-String }) @Test public voi

  繼續上文谷歌搜索的場景,通過實例來了解 TestNG 的用法與功能。

  清單 5. TestNG 應用示例

  @Parameters( { "url", "query-string", "btn-id", "txt-id", "verify-String" })

  @Test

  public void testGoogle(String url, String queryString, String btnID,

  String txtID, String verifyString) {

  selenium = new DefaultSelenium("localhost", 4444, "*firefox", url);

  selenium.start();

  selenium.open("/");

  selenium.type(txtID, queryString);

  selenium.click(btnID);

  selenium.waitForPageToLoad("30000");

  verifyTrue(selenium.isTextPresent(verifyString));

  selenium.stop();

  }

  上面的代碼清單中,注釋 Parameters 指定的參數在 TestNG 測試框架的配置文件 testng.xml 里有具體定義,如下所示:

  清單 6. testng.xml 示例

  不難想到,只要修改 testng.xml 中的參數值,就能由輸入參數驅動不同的測試用例。然而,僅僅在 testng.xml 中指定參數有很大的局限性,顯然過多的參數會難以維護,無法井井有條地組織分屬不同 Test Cases 的輸入。在下文中,我們來解決這個問題。

  回頁首

  基于 Selenium 的分層測試框架

  作者在工作中,測試基于 OSGi 平臺的多個插件。每個插件實現特有的功能,有多條測試路徑需要覆蓋,同時,各個插件之間又有共通之處,可以抽取某些部分進行復用。對此,我們假設這樣的場景:分別在谷歌、百度和必應中搜索各種關鍵字,并在返回的結果頁面中驗證是否存在目標字符串。每個搜索引擎都可以視為一個待測的組件,分別為它們撰寫 Test Cases,并組織成一個 Test Suite,用于執行測試。事實上,3 個搜索引擎的測試由于同質性,還能夠合并為一種測試,用不同的輸入參數來指定所要測試的那個搜索引擎。這里視為三個組件,只是為了說明如何在 Selenium+TestNG 環境中組織多個測試模塊。

  自上而下地考慮,上段描述的測試場景能夠進行分解。Test Suite 包含三類 Test Cases(谷歌、百度與必應),每類 Test Cases 的一個 Test Case 由若干可復用的 Test Tasks 組成,通過傳入不同的參數,Test Task 完成同質的不同行為。在 Test Task 之下,定義相關文件,包含待測試的 Web 頁面元素的定位信息。因此,分層 Selenium 框架有三個層次:

  appObjects —— Web 頁面元素定位信息,如按鈕與文本框等;

  tasks ——測試步驟中可復用的行為;

  test cases ——由 tasks 組成的測試用例。

  Web 元素 locators 定義與收集

  Selenium 根據 XPath 來定位 Web 元素,XPath 的相關知識不屬于本文的內容。前面例子中,在 TestNG 的配置文件 testng.xml 里定義文本框與按鈕的 locators,對于復雜的測試場景而言,這不是好的實踐。因此,我們在 appObjects 層建立文件,將 Web 頁面元素 locators 歸入,便于維護使用。Selenium-IDE 的 Find 功能適于完成這一步驟。文件 googlePages.properties 的內容如下:

  清單 7. locators 文件示例

  #define the keys and corresponding XPaht locators of google page.

  googleSearchTxtField=//input[@name='q']

  googleSearchBtn=//input[@name='btnG']

  這時,在 testng.xml 中,刪去 locators 相關的 parameters,只需要解析 .properties 文件,生成 locators 的 properties 備用。在所附的源碼中可以看到 .properties 文件的解析器 PropUtils 的簡單實現。

  測試任務分解與實現

  為說明任務分解,以簡單的搜索過程為例,可以分為輸入搜索關鍵字、點擊搜索按鈕、以及驗證結果頁面。實際代碼如下所示,不難發現,由參數決定行為方式的測試任務,都接受一個 paraMap 數據結構,并根據其內容在方法內采取適當的行為。通過這種方式,test cases 能夠以參數配置文件來驅動測試任務實施其想要的行為。

  清單 8. Test Task 代碼示例

  public void openSite() {

  selenium.open("/");

  }

  public void typeSearchTxtField(HashMap paraMap) {

  utils.waitForElement((String) elemMap

  .get(TestGoogleConstants.GOOGLE_SEARCH_TXT_FIELD), 30);

  selenium.type((String) paraMap

  .get(TestGoogleConstants.GOOGLE_SEARCH_TXT_FIELD),

  (String) elemMap

  .get(TestGoogleConstants.GOOGLE_SEARCH_TXT_FIELD));

原文轉自:http://www.ibm.com/developerworks/cn/java/j-lo-selenium/index.html

国产97人人超碰caoprom_尤物国产在线一区手机播放_精品国产一区二区三_色天使久久综合给合久久97