繼續上文谷歌搜索的場景,通過實例來了解 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