使用分层的 Selenium 框架进行复杂 Web 应用的自动测试
2012-05-16 09:37
731 查看
http://www.oschina.net/question/12_7697
Selenium 是一种 Web 应用的自动测试工具,通过模拟用户对 Web 页面的各种操作,可以精确重现软件测试人员编写的 Test Cases 步骤。Selenium 包含三个工具:Selenium-IDE,Selenium-RC 以及 Selenium-Core。其中,Selenium-Core 是驱动 Selenium 工作的核心部分,作为一个用 JavaScript 编写的测试引擎,它可以操作 Web 页面上的各种元素,诸如:点击按钮、输入文本框,以及断言 Web 页面上存在某些文本与 Web 元素等。
Selenium-IDE 是一个 Firefox 插件,能够录制回放用户在 Firefox 中的行为,并把所记录的 Selenese (Selenium Commands) 转化为 Java/C#/Python/Ruby 等语言,在 Selenium-RC 中修改复用。对于较为复杂的 Test Cases,Selenium-IDE 的功能有限,往往用它录制大致的步骤,再转化为测试人员熟悉的编程语言,在此基础上完善,形成更为强大且灵活的 Selenium-RC Test Cases。
Selenium-RC(Selenium Remote Control)在 Web 浏览器与需要测试的 Web 应用间架设代理服务器(Selenium Server),使得 JavaScript 引擎与被测 Web 应用同源,绕开同源策略的限制(Same Origin Policy),进而取得对 Web 页面进行各种操作的权限。
开发环境配置
以 Java 作为测试用语言为例,在 Eclipse 中新建一个 Java 项目 Test Search Engine,下载 Selenium-RC 软件包,把 selenium server/selenium java client driver 的 Jar 以及 JUnit 库加入到该项目的 Java Build Path。
图
1. Build Path 配置
![](http://www.ibm.com/developerworks/cn/java/j-lo-selenium/image001.png)
启动 Selenium-Server,可以在命令行中使用
如果想在 Java 程序中启动/停止 Selenium-Server,首先,新建一个 RemoteControlConfiguration 对象 rcc,并指定远程控制参数(包括配置 Selenium Server 的监听端口,Firefox 浏览器的 Profile 等),然后新建一个 SeleniumServer 对象,把 rcc 传入 SeleniumServer 的构造函数(对于中文 Windows 操作系统且使用 IBM JDK,在 Eclipse 的 Run Configurations 的 VM
arguments 中加入
清单
1. 使用 Java 启动 / 停止 Selenium Server
此外,Selenium Server 还可以通过 Ant 脚本来控制启动/停止,这提供了另一种灵活而强大的项目控制方式。
清单
2. 使用 Ant 脚本启动 / 停止 Selenium Server
在 Selenium-Server 启动后,建立一个 Selenium 类的实例 selenium,并通过这个实例与 Selenium-Server 进行交互,方法如下。
清单
3. Selenium 实例的启动 / 停止
Selenium 实例包含丰富接口,可以对各种 Web 元素进行各种操作。例如,在谷歌页面中输入“developerWorks”,点击搜索按钮,在结果页面中验证是否包含“developerWorks 中国”字样等。
清单
4. Selenium 测试的简单示例
当
Selenim 遇到 TestNG
用 Selenium 测试 Web 页面时,所重现的各种行为依赖于测试人员的输入参数,例如:选择下拉餐单的项目,在文本框中输入字符等。不同的测试用例对应不同的输入,若有方法能够简单 有效的传入测试用参数,会大大提高测试用例的复用性和可维护性。当 Selenium 遇到 TestNG,这些就可以实现。TestNG 中的 NG,意为 Next Generation,事实上,该测试框架引入了不少新特性:灵活的测试配置,支持 JDK 5 注释,支持数据驱动的测试,强大的执行模型等。
继续上文谷歌搜索的场景,通过实例来了解 TestNG 的用法与功能。
清单
5. TestNG 应用示例
上面的代码清单中,注释 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 文件示例
这时,在 testng.xml 中,删去 locators 相关的 parameters,只需要解析 .properties 文件,生成 locators 的 properties 备用。在所附的源码中可以看到 .properties 文件的解析器 PropUtils 的简单实现。
测试任务分解与实现
为说明任务分解,以简单的搜索过程为例,可以分为输入搜索关键字、点击搜索按钮、以及验证结果页面。实际代码如下所示,不难发现,由参数决定 行为方式的测试任务,都接受一个 paraMap 数据结构,并根据其内容在方法内采取适当的行为。通过这种方式,test cases 能够以参数配置文件来驱动测试任务实施其想要的行为。
清单
8. Test Task 代码示例
clickSearchBtn 方法无需参数输入,因为其任务只是点击搜索按钮,在 test cases 需要时调用即可。这里只是以一个简单的例子说明如何分解任务,对于实际的 test case,这个过程会复杂许多,但其后的复用与灵活调用完全值得这些工作的付出。
Test
Cases 实现与 Test Tasks 调用
Test Cases 作为一系列测试步骤的集合,可以通过调用若干 Test Tasks 实现。以贯穿本文的搜索引擎为例,以此调用上一部分定义的 test taskss,重现整个测试过程。简单代码如下所示。
清单
9. Test Case 代码示例
Test Cases 在分层 Selenium 测试框架下,就是按照要求调用已有的 Test Tasks。值得注意的是,在上面两个代码列表里的 paraMap 参数。这个哈希表由我们实现的解析器解析参数定义文件而得到。TestNG 的 Parameters 参数机制,使得 Test Cases 能够灵活地指定参数文件,从而驱动不同的 Test Cases。
清单
10. 参数定义文件示例
建立输入参数解析器(parser)及参数文件
Test Cases 与 Test Tasks 的顺畅工作,需要输入参数文件及对应的参数解析器的配合。我们以上面代码清单的例子说明参数文件的格式。<fvt_element> 标签在最外层,其内的子元素为具体的参数值,如 <arg> 标签表示一个页面元素与其对应的输入。<arg> 元素的 id 属性与清单 6 中的 . properties 文件定义的 locators 对应,而其子元素 <value> 则表示该 locator 的输入值。解析器的具体实现可以参见所附的示例源代码。
导出可执行
Jar 包以部署到各类测试服务器
为了能够把 Selenium 测试脚本导出成一个可执行 Jar 包,我们可以把 testng.xml 中定义的相关内容,在 Java 代码中实现,如下所示。
清单
11. testng.xml 的 Java 表示
这份代码列表的功能与前文的 testng.xml 完全相同,把这些代码添加到新定义的类 SearchEngineSuite 的 main 函数中,在这个类的方法中启动并关闭 Selenium 服务器,并把相关文件打成一个可执行 Jar,就可以通过命令行的 java – jar 命令,执行 Selenium 测试。当然,因为具有通用性,也可以部署到各类测试服务器,执行测试。
这里推荐使用 Eclipse 的插件 Fat Jar 导出 runnalbe Jar。首先,填入输出 Jar 的命名,并把 SearchEngineSuite 设置为 Main-Class。然后,勾选”merge individual-sections of all MANIFEST.MF files”,后一项视需求勾选。
图
2. Fat Jar 导出步骤 1
![](http://www.ibm.com/developerworks/cn/java/j-lo-selenium/image002.png)
进入下一步,选择要导出的文件,包含源代码以及用到的 Jar 文件,点击完成即可。
图
3. Fat Jar 导出步骤 2
![](http://www.ibm.com/developerworks/cn/java/j-lo-selenium/image003.png)
导出后的 runnable Jar,使用命令 java – jar TestSearchEngine_fat.jar 运行即可。
结束语
通读本文不难发现,Selenium 提供了一种 Web 测试的新方法,在分层框架的支持下,其功能更为强大,运用灵活,有很强的复用性。通过指定不同的参数文件,本文的例子可以对 Google 进行不同关键字的测试验证,同样的方法可以应用于百度与必应。并通过 testng.xml 或者其 Java 代码形式整合为一个 Test Suite 运行。在所附源代码中可以看到详细的实现。在作者的实际工作中,复杂的测试需求也能应付自如。
本文样例代码
l原文 :http://www.oschina.net/question/12_7697
Selenium 是一种 Web 应用的自动测试工具,通过模拟用户对 Web 页面的各种操作,可以精确重现软件测试人员编写的 Test Cases 步骤。Selenium 包含三个工具:Selenium-IDE,Selenium-RC 以及 Selenium-Core。其中,Selenium-Core 是驱动 Selenium 工作的核心部分,作为一个用 JavaScript 编写的测试引擎,它可以操作 Web 页面上的各种元素,诸如:点击按钮、输入文本框,以及断言 Web 页面上存在某些文本与 Web 元素等。
Selenium-IDE 是一个 Firefox 插件,能够录制回放用户在 Firefox 中的行为,并把所记录的 Selenese (Selenium Commands) 转化为 Java/C#/Python/Ruby 等语言,在 Selenium-RC 中修改复用。对于较为复杂的 Test Cases,Selenium-IDE 的功能有限,往往用它录制大致的步骤,再转化为测试人员熟悉的编程语言,在此基础上完善,形成更为强大且灵活的 Selenium-RC Test Cases。
Selenium-RC(Selenium Remote Control)在 Web 浏览器与需要测试的 Web 应用间架设代理服务器(Selenium Server),使得 JavaScript 引擎与被测 Web 应用同源,绕开同源策略的限制(Same Origin Policy),进而取得对 Web 页面进行各种操作的权限。
开发环境配置
以 Java 作为测试用语言为例,在 Eclipse 中新建一个 Java 项目 Test Search Engine,下载 Selenium-RC 软件包,把 selenium server/selenium java client driver 的 Jar 以及 JUnit 库加入到该项目的 Java Build Path。
图
1. Build Path 配置
![](http://www.ibm.com/developerworks/cn/java/j-lo-selenium/image001.png)
启动 Selenium-Server,可以在命令行中使用
java -jar命令直接运行可执行 Jar 包(对于中文 Windows 操作系统且使用 IBM JDK,还需要加参数
-Dibm.stream.nio=true)。
如果想在 Java 程序中启动/停止 Selenium-Server,首先,新建一个 RemoteControlConfiguration 对象 rcc,并指定远程控制参数(包括配置 Selenium Server 的监听端口,Firefox 浏览器的 Profile 等),然后新建一个 SeleniumServer 对象,把 rcc 传入 SeleniumServer 的构造函数(对于中文 Windows 操作系统且使用 IBM JDK,在 Eclipse 的 Run Configurations 的 VM
arguments 中加入
-Dibm.stream.nio=true)。
清单
1. 使用 Java 启动 / 停止 Selenium Server
RemoteControlConfiguration rcc = new RemoteControlConfiguration(); rcc.setPort(4444); // 指定 Selenium Server 开放端口 SeleniumServer SELENIUM_SERVER; SELENIUM_SERVER = new SeleniumServer(rcc); SELENIUM_SERVER.start(); // 启动 server // 测试代码 SELENIUM_SERVER.stop(); // 停止 server |
清单
2. 使用 Ant 脚本启动 / 停止 Selenium Server
<!-- START SERVER--> <property name="ARGS" value="-Dibm.stream.nio=true -log selenium.log -browserSideLog" /> <target name="start-server"> <echo message="Starting server..." /> <java jar="${lib}/selenium-server.jar" fork="true" spawn="true"> <arg line="-timeout 30" /> <arg line="${ARGS}" /> </java> <echo message="Server is started." /> </target> <!-- STOP SERVER--> <target name="stop-server"> <!-- selenium server url--> <get taskname="selenium-shutdown" src="http://localhost:4444/selenium-server/ driver/?cmd=shutDownSeleniumServer" dest="result.txt" ignoreerrors="true" /> <echo taskname="selenium-shutdown" message="Errors during shutdown are expected" /> </target> |
清单
3. Selenium 实例的启动 / 停止
Selenium selenium = new DefaultSelenium(java.lang.String serverHost, int serverPort, java.lang.String browserStartCommand, java.lang.String browserURL); selenium.start(); // 经由 selenium 控制浏览器模拟各种用户操作 selenium.stop(); |
清单
4. Selenium 测试的简单示例
Selenium selenium = new DefaultSelenium("localhost", 4444, "*firefox", "http://www.google.cn"); selenium.start(); // 启动浏览器 selenium.open("/"); // 打开 www.google selenium.type("q", "developerworks"); // 输入文本框 selenium.click("btnG");// 点击搜索按钮 selenium.waitForPageToLoad("30000"); // 等待加载结果页面 verifyTrue(selenium.isTextPresent("developerWorks 中国")); // 验证是否存在指定字符 selenium.stop();// 关闭浏览器 |
Selenim 遇到 TestNG
用 Selenium 测试 Web 页面时,所重现的各种行为依赖于测试人员的输入参数,例如:选择下拉餐单的项目,在文本框中输入字符等。不同的测试用例对应不同的输入,若有方法能够简单 有效的传入测试用参数,会大大提高测试用例的复用性和可维护性。当 Selenium 遇到 TestNG,这些就可以实现。TestNG 中的 NG,意为 Next Generation,事实上,该测试框架引入了不少新特性:灵活的测试配置,支持 JDK 5 注释,支持数据驱动的测试,强大的执行模型等。
继续上文谷歌搜索的场景,通过实例来了解 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(); } |
清单
6. testng.xml 示例
<parameter name="url" value="http://www.google.cn"></parameter> <parameter name="query-string" value="developerworks"></parameter> <parameter name="btn-id" value="//input[@name='btnG']"></parameter> <parameter name="txt-id" value="//input[@name='q']"></parameter> <parameter name="verify-String" value="developerWorks 中国"></parameter> |
基于
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'] |
测试任务分解与实现
为说明任务分解,以简单的搜索过程为例,可以分为输入搜索关键字、点击搜索按钮、以及验证结果页面。实际代码如下所示,不难发现,由参数决定 行为方式的测试任务,都接受一个 paraMap 数据结构,并根据其内容在方法内采取适当的行为。通过这种方式,test cases 能够以参数配置文件来驱动测试任务实施其想要的行为。
清单
8. Test Task 代码示例
public void openSite() { selenium.open("/"); } public void typeSearchTxtField(HashMap<String, Object> 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)); } public void clickSearchBtn() { utils.waitForElement((String) elemMap.get(TestGoogleConstants.GOOGLE_SEARCH_BTN), 30); selenium.click((String) elemMap.get(TestGoogleConstants.GOOGLE_SEARCH_BTN)); } public void verifyResult(HashMap<String, Object> paraMap){ stc.verifyTrue(selenium.isTextPresent((String) paraMap.get(TestGoogleConstants.VERIFY_STRING))); } |
Test
Cases 实现与 Test Tasks 调用
Test Cases 作为一系列测试步骤的集合,可以通过调用若干 Test Tasks 实现。以贯穿本文的搜索引擎为例,以此调用上一部分定义的 test taskss,重现整个测试过程。简单代码如下所示。
清单
9. Test Case 代码示例
@Parameters( { "google_se_para_1" }) @Test public void testGoogle_1(String paraFile) { paraMap = (HashMap<String, Object>) XMLParser.getInstance() .parserXml(paraFile); tgTasks.openSite(); tgTasks.typeSearchTxtField(paraMap); tgTasks.clickSearchBtn(); tgTasks.verifyResult(paraMap); } |
清单
10. 参数定义文件示例
<?xml version="1.0" encoding="UTF-8"?> <fvt_element> <!-- Search String--> <arg id="googleSearchTxtField"> <value>developerworks</value> </arg> <arg id="verify-String"> <value>developerWorks 中国 </value> </arg> </fvt_element> |
Test Cases 与 Test Tasks 的顺畅工作,需要输入参数文件及对应的参数解析器的配合。我们以上面代码清单的例子说明参数文件的格式。<fvt_element> 标签在最外层,其内的子元素为具体的参数值,如 <arg> 标签表示一个页面元素与其对应的输入。<arg> 元素的 id 属性与清单 6 中的 . properties 文件定义的 locators 对应,而其子元素 <value> 则表示该 locator 的输入值。解析器的具体实现可以参见所附的示例源代码。
导出可执行
Jar 包以部署到各类测试服务器
为了能够把 Selenium 测试脚本导出成一个可执行 Jar 包,我们可以把 testng.xml 中定义的相关内容,在 Java 代码中实现,如下所示。
清单
11. testng.xml 的 Java 表示
//suite tag XmlSuite suite = new XmlSuite(); //set suite name suite.setName("Test Search Engine"); //set parameter tag HashMap para = new HashMap(); para.put("google_se_para_1", "/src/resources/google_se_para_1.xml"); suite.setParameters(para); //test tag XmlTest testGoogle = new XmlTest(suite); testGoogle.setName("LDAP configuration template"); List<XmlClass> classes = new ArrayList<XmlClass>(); classes.add(new XmlClass(TestGoogleTestCase.class)); testGoogle.setXmlClasses(classes); |
这里推荐使用 Eclipse 的插件 Fat Jar 导出 runnalbe Jar。首先,填入输出 Jar 的命名,并把 SearchEngineSuite 设置为 Main-Class。然后,勾选”merge individual-sections of all MANIFEST.MF files”,后一项视需求勾选。
图
2. Fat Jar 导出步骤 1
![](http://www.ibm.com/developerworks/cn/java/j-lo-selenium/image002.png)
进入下一步,选择要导出的文件,包含源代码以及用到的 Jar 文件,点击完成即可。
图
3. Fat Jar 导出步骤 2
![](http://www.ibm.com/developerworks/cn/java/j-lo-selenium/image003.png)
导出后的 runnable Jar,使用命令 java – jar TestSearchEngine_fat.jar 运行即可。
结束语
通读本文不难发现,Selenium 提供了一种 Web 测试的新方法,在分层框架的支持下,其功能更为强大,运用灵活,有很强的复用性。通过指定不同的参数文件,本文的例子可以对 Google 进行不同关键字的测试验证,同样的方法可以应用于百度与必应。并通过 testng.xml 或者其 Java 代码形式整合为一个 Test Suite 运行。在所附源代码中可以看到详细的实现。在作者的实际工作中,复杂的测试需求也能应付自如。
本文样例代码
l原文 :http://www.oschina.net/question/12_7697
相关文章推荐
- 使用分层的Selenium框架进行复杂 Web 应用的自动测试
- 使用分层的 Selenium 框架进行复杂 Web 应用的自动测试
- 使用分层的 Selenium 框架进行复杂 Web 应用的自动测试
- 使用分层的Selenium框架进行复杂 Web 应用的自动测试
- 分层 Selenium 框架进行复杂 Web 应用程序自动化测试
- 使用selenium进行web测试项目框架
- 使用自动化测试框架selenium,批量的进行截图
- Arquillian测试框架快速上手教程(四)- 使用Arquillian + Drone + Selenium + Graphene 进行Web自动化测试
- 使用Nightwatch.js做基于浏览器的web应用自动测试
- selenium使用testNG测试框架编写webdriver脚本_05
- 使用Selenium/Ant做Web应用远程自动化测试
- 使用selenium和webdriver进行自动化测试
- selenium进阶之基础--web自动测试框架(ant+junit+selenium)
- 使用Selenium 和Junit 进行WEB功能测试
- 使用unittest测试框架来写selenium的TestCase
- 应用WAS对web进行压力测试实例详解
- 使用Microsoft Web Application Stress Tool对web进行压力测试
- NetBeans IDE 使用 PHPUnit 和 Selenium 进行测试
- 《Java高手真经_应用框架卷_Java_Web核心框架》所用软件、使用版本、下载地址列表:
- WEB打印系列教程之三--使用WScript.Shell进行复杂的WEB打印设置