|
我们创建另一个 JUnit 4 单元测试类:dw.xml.DWloginXML.java,依次编写 @BeforeClass、@Test、@AfterClass 方法。读者可自行下载本文附带的源代码项目导入到自己的 Eclipse 开发工作区。下面对代码进行讲解:
解析测试用例 XML,读取执行设置信息
使用 Dom4J 来解析 XML 用例脚本文件,ucXMLFile 变量存放测试用例文件路径。首先解析 SETTINGS 元素,读取其中的属性设置。可以看出,使用 XML 维护测试用例,能轻松维护 Selenium Server 的相关信息。如果想换其他浏览器执行这个用例,只需修改 XML 文件中 SETTINGS 元素的 browser 属性,比如把“*iexplore”改为“*firefox”,运行的时候就会启动 firefox 浏览器来执行该用例,而不需要改动任何 Java 程序代码。同样,如果喜欢使用谷歌 Chrome 浏览器,则需要设置为“*googlechrome”。当然,需要预先在启动 Selenium Server 的机器上安装相应的浏览器软件。
清单 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");
}
读取 STEP 测试步骤信息
获取用例级别的延时设置,在每一个测试步骤执行之前,暂停 timeout 指定的秒数。通过指定延时,可以让程序执行的慢一些,符合用户真实操作,也方便演示。获取的测试步骤信息保存在列表实例 List<Element> stepNodes。
清单 6. 获取测试步骤信息
// TEST element
Element testElm = suiteElm.element("TEST");
System.out.println("测试用例名称为 ::" + testElm.attributeValue("name"));
if (testElm.attributeValue("timeout") != null) {
// 用例级别的 timeout 设置 , 覆盖了默认设置!
timeout = new Integer(testElm.attributeValue("timeout")).intValue();
System.out.println("延时设置,timeout=" + testElm.attributeValue("timeout")+"秒");
}
stepNodes = testElm.element("STEPS").elements();
}
创建 Selenium 实例,启动浏览器,最大化浏览器窗口,打开要访问的网站
清单 7. 创建初始化 Selenium 实例
selenium = new DefaultSelenium(seleniumServer,
new Integer(seleniumPort).intValue(), browser, application_url);
System.out.println("正在启动 Selenium。。。");
selenium.start();
selenium.windowMaximize();
selenium.open(application_url);
迭代解析 STEP 元素执行各个测试步骤
创建一个迭代器实例 iterator,使用 while 循环,依次执行各个测试步骤。在执行的时候,打印详细的步骤信息,方便调试。根据 type 属性指定的步骤类型,分别调用不同的 Selenium 接口。作为演示,本文提供的代码例子,仅仅包括鼠标单击、输入框输入和截图功能。通过丰富处理 SETP 步骤元素的代码,可以支持更多的功能。
清单 8. 迭代依次解析测试步骤
Element elm = null;
// 循环解析测试步骤
Iterator<Element> iterator = null;
iterator = stepNodes.iterator();
while (iterator != null && iterator.hasNext()) {// while 循环开始
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()+ "\n 步骤执行失败,测试执行被中止 , \
测试元素为 :\n" + elm.asXML());
}
} else if (type.equals("Type.INPUT")) {
// 处理 Input 在输入框执行输入操作
pause(timeout*1000);
try {
String inValue = elm.element("VALUE").getText();selenium.type(\
elm.element("XPATH").getText(), inValue);
} catch (Exception e) {
SeleneseTestBase.fail(e.getMessage()
+ "\n 步骤执行失败,测试执行被中止 , 测试元素为 :\n" + elm.asXML());
}
}
else if(type.equals("Type.CaptureScreenshot")){
pause(timeout*1000);
String fileName = elm.element("VALUE").getText();
captureScreenshot(fileName);
}
}// 循环解析测试步骤;while 循环结束
完整的框架项目代码请参考附件进行下载。对这个单元测试类的运行和前文描述的是一致的,不再赘述。当然,现在的框架支持的功能是非常简单的 ( 仅仅支持单击、表单输入和截图功能 ),框架开发人员可以添加更多的功能特性,然后就可以把该自动化测试框架交付给业务测试人员,他们就再不会为编写测试代码发愁了。 |
|