清單 5. 使用 DOM4J 解析 XML 腳本文件
Document document = null;
try {
System.out.println("測試用例 XML 文件位置 ::" + ucXMLFile);
document = new SAXReader().read(new File(ucXMLFile));
} catch (DocumentException e) {
e.printStackTrace();
}
Element suiteElm = document.getRootElement();
// settings element
Element settings = suiteElm.element("SETTINGS");
if (settings != null) {
browser = settings.attributeValue("browser");
seleniumServer = settings.attributeValue("seleniumServer");
seleniumPort = settings.attributeValue("seleniumPort");
application_url = settings.attributeValue("application_url");
}
2、讀取 STEP 測試步驟信息
獲取用例級(jí)別的延時(shí)設(shè)置,在每一個(gè)測試步驟執(zhí)行之前,暫停 timeout 指定的秒數(shù)。通過指定延時(shí),可以讓程序執(zhí)行的慢一些,符合用戶真實(shí)操作,也方便演示。獲取的測試步驟信息保存在列表實(shí)例 List<Element> stepNodes。
清單 6. 獲取測試步驟信息
// TEST element
Element testElm = suiteElm.element("TEST");
System.out.println("測試用例名稱為 ::" + testElm.attributeValue("name"));
if (testElm.attributeValue("timeout") != null) {
// 用例級(jí)別的 timeout 設(shè)置 , 覆蓋了默認(rèn)設(shè)置!
timeout = new Integer(testElm.attributeValue("timeout")).intValue();
System.out.println("延時(shí)設(shè)置,timeout=" + testElm.attributeValue("timeout")+"秒");
}
stepNodes = testElm.element("STEPS").elements();
}
3、創(chuàng)建 Selenium 實(shí)例,啟動(dòng)瀏覽器,大化瀏覽器窗口,打開要訪問的網(wǎng)站
清單 7. 創(chuàng)建初始化 Selenium 實(shí)例
selenium = new DefaultSelenium(seleniumServer,
new Integer(seleniumPort).intValue(), browser, application_url);
System.out.println("正在啟動(dòng) Selenium。。。");
selenium.start();
selenium.windowMaximize();
selenium.open(application_url);
4、迭代解析 STEP 元素執(zhí)行各個(gè)測試步驟
創(chuàng)建一個(gè)迭代器實(shí)例 iterator,使用 while 循環(huán),依次執(zhí)行各個(gè)測試步驟。在執(zhí)行的時(shí)候,打印詳細(xì)的步驟信息,方便調(diào)試。根據(jù) type 屬性指定的步驟類型,分別調(diào)用不同的 Selenium 接口。作為演示,本文提供的代碼例子,僅僅包括鼠標(biāo)單擊、輸入框輸入和截圖功能。通過豐富處理 SETP 步驟元素的代碼,可以支持更多的功能。
清單 8. 迭代依次解析測試步驟
Element elm = null;
// 循環(huán)解析測試步驟
Iterator<Element> iterator = null;
iterator = stepNodes.iterator();
while (iterator != null && iterator.hasNext()) {// while 循環(huán)開始
elm = iterator.next();
System.out.println("------------------------------>");
System.out.println("step index=" + elm.attributeValue("index"));
System.out.println("step name=" + elm.attributeValue("name"));
System.out.println("step type=" + elm.attributeValue("type"));
String type = elm.attributeValue("type");
if (type == null) {
SeleneseTestBase.fail("必須定義 type 屬性,請檢查 XML 測試用例。");
}
if (type.equals("Type.CLICK")) {
// 處理 Click 單擊操作
pause(timeout*1000);
try {
String xpValue = elm.element("XPATH").getText();
selenium.click(xpValue);
} catch (Exception e) {
SeleneseTestBase.fail(e.getMessage()+ "
步驟執(zhí)行失敗,測試執(zhí)行被中止 ,
測試元素為 :
" + elm.asXML());
}
} else if (type.equals("Type.INPUT")) {
// 處理 Input 在輸入框執(zhí)行輸入操作
pause(timeout*1000);
try {
String inValue = elm.element("VALUE").getText();selenium.type(
elm.element("XPATH").getText(), inValue);
} catch (Exception e) {
SeleneseTestBase.fail(e.getMessage()
+ "
步驟執(zhí)行失敗,測試執(zhí)行被中止 , 測試元素為 :
" + elm.asXML());
}
}
else if(type.equals("Type.CaptureScreenshot")){
pause(timeout*1000);
String fileName = elm.element("VALUE").getText();
captureScreenshot(fileName);
}
}// 循環(huán)解析測試步驟;while 循環(huán)結(jié)束
完整的框架項(xiàng)目代碼請參考附件進(jìn)行下載。對這個(gè)單元測試類的運(yùn)行和前文描述的是一致的,不再贅述。當(dāng)然,現(xiàn)在的框架支持的功能是非常簡單的 (僅僅支持單擊、表單輸入和截圖功能),框架開發(fā)人員可以添加更多的功能特性,然后可以把該自動(dòng)化測試框架交付給業(yè)務(wù)測試人員,他們再不會(huì)為編寫測試代碼發(fā)愁了。
Selenium 框架的更多特性開發(fā)
通過上面的演示,我們了解了如何開發(fā)一套不需要掌握編碼知識(shí)能編寫自動(dòng)化測試用例的測試框架。因?yàn)槠脑,本框架支持的特性比較少,框架的功能非常簡單,只支持鼠標(biāo)單擊操作、數(shù)據(jù)輸入操作和截圖功能,遠(yuǎn)遠(yuǎn)不能滿足自動(dòng)化測試的需求。本文的主要目的在于讓讀者理解這種自動(dòng)化框架的理念。讀者可以根據(jù)自己項(xiàng)目組的實(shí)際情況進(jìn)行自定義開發(fā)更多的功能特性。
結(jié)束語
通過上面的介紹,我們了解到了如何向傳統(tǒng)的功能測試用例里面添加額外的控件信息,從而形成能被自動(dòng)化測試工具識(shí)別的自動(dòng)化測試用例;以及如何使用 XLST 轉(zhuǎn)換 XML 格式的測試用例文件成 HTML 格式,增加了用例的可讀性;并通過詳細(xì)的例子探討了如何定制屬于自己的基于 Selenium 二次開發(fā)的自動(dòng)化測試框架。后再次總結(jié)一下該框架的讓人心動(dòng)之處,整理一下思路 , 規(guī)劃屬于您自己的自動(dòng)化測試框架吧。
● 業(yè)務(wù)測試人員不需要編程知識(shí),熟悉業(yè)務(wù)和瀏覽器,即可開發(fā)自動(dòng)化測試腳本業(yè)務(wù)測試
● 人員不需要編程知識(shí),熟悉業(yè)務(wù)和瀏覽器,即可開發(fā)自動(dòng)化測試腳本
● 自動(dòng)化測試用例和傳統(tǒng)的功能測試用例看起來很像,閱讀方便,利于評(píng)審
● 擴(kuò)展性比較強(qiáng)大,可以開發(fā)出更多的功能特性。XML 測試用例腳本通用性強(qiáng),可以適用不同的測試工具