您的位置:软件测试 > 开源软件测试 > 开源功能测试工具 > Selenium
使用 Selenium 和 TestNG 进行编程式测试
作者:网络转载 发布时间:[ 2012/12/7 15:15:54 ] 推荐标签:

图 1. 创建小部件的 Web 表单

请注意:表单元素的类型是具有三个不同选项的下拉列表,如图 2 所示:


图 2. 包含下拉列表的 Web 表单

单击 Create Widget 将促使 Groovlet 处理这一请求。如果所有内容正确的话(即名字和定义不为空,并且数据库中不存在该实例),Groovlet 将创建一个新的小部件实例并类似图 3 所示的状态页面:

图 3. 返回的 Web 页面显示状态

结合使用 Selenium 和 TestNG 验证简单的 Create Widget 用例是一种可管理的应用:

    配置并启动 Selenium 服务器的实例。
    与 Create Widget Web 表单交互并提交它。
    检验结果页面是否包含具有小部件名称的成功信息。
    停止 Selenium 服务器实例。

请注意:用例中的每一步都是通过 Selenium 完成的 —— 所以说,TestNG 仅仅帮助进行查找。现在,我们来实践一下。

Create Widget 测试用例

我希望对 Selenium 服务器进行灵活的配置,所以我将编写一个参数化 fixture(TestNG-Selenium 样式),一般可以使用它来为不同浏览器、不同位置甚至混合的 Web 应用程序地址(类似 localhost 和产品)创建 Selenium 服务器。清单 4 定义了我所配置的灵活的 Selenium 服务器 fixture:

清单 4. 灵活的 Selenium fixture

                 @Parameters({"selen-svr-addr","brwsr-path","aut-addr"}) @BeforeClass private void init(String selenSrvrAddr, String bpath,    String appPath) throws Exception {  driver = new DefaultSelenium(selenSrvrAddr,     SeleniumServer.getDefaultPort(), bpath, appPath);  driver.start(); } //.... @AfterClass private void stop() throws Exception {  driver.stop(); } 


必须将参数名与 TestNG 的 testng.xml 文件中的值链接起来;因此,我定义了如清单 5 所示的三个参数。(默认情况下为 Firefox 定义了 brwsr-path 参数,但是我可以同样轻松地定义一组新的使用 Internet Explorer 的测试。)

清单 5. TestNG testng.xml 文件中的参数值

                 <parameter name="selen-svr-addr" value="localhost"/>  <parameter name="aut-addr" value="http://localhost:8080/gt15/"/>  <parameter name="brwsr-path" value="*firefox"/> 


接下来,我将定义清单 6 所示的测试用例,它也包含一个参数,用于进行测试的应用程序的基 URL。该测试将促使浏览器在 Web 应用程序内打开特定页面,并操作 图 1 所示的表单。

清单 6. 一个良好的测试用例

                 @Parameters({"aut-addr"}) @Test public void verifyCreate(String appPath) throws Exception {  driver.open(appPath + "/CreateWidget.html");  driver.type("widget", "book-01");  driver.select("type", "book");  driver.type("definition", "book widget type book");  driver.click("submit");  driver.waitForPageToLoad("10000");    assertEquals(driver.getText("success"),     "The widget book-01 was successfully created.",     "test didn't return expected message"); } 


通过调用 driver.click("submit") 提交表单后,Selenium 将等待响应的加载,然后我将断言成功的创建信息。(注意:响应 Web 页面具有一个 ID 为 success 的元素。)

结果产生一个灵活的文本类,它将检验两种场景:一种是良好的场景,而另一种是没有提供定义的边界用例,如清单 7 所示:


清单 7. 使用 TestNG 进行全部的处理

                public class CreateWidgetUATest { private Selenium driver; @Parameters({"selen-svr-addr","brwsr-path","aut-addr"}) @BeforeClass private void init(String selenSrvrAddr, String bpath,    String appPath) throws Exception {  driver = new DefaultSelenium(selenSrvrAddr,     SeleniumServer.getDefaultPort(), bpath, appPath);  driver.start(); } @Parameters({"aut-addr"}) @Test public void verifyCreate(String appPath) throws Exception {  driver.open(appPath + "/CreateWidget.html");  driver.type("widget", "book-01");  driver.select("type", "book");  driver.type("definition", "book widget type book");  driver.click("submit");  driver.waitForPageToLoad("10000");    assertEquals(driver.getText("success"),     "The widget book-01 was successfully created.",     "test didn't return expected message"); } @Parameters({"aut-addr"}) @Test public void verifyCreationError(String appPath) throws Exception {  driver.open(appPath + "/CreateWidget.html");  driver.type("widget", "book-02");  driver.select("type", "book");  //definition explicitly set to blank  driver.type("definition", "");  driver.click("submit");  driver.waitForPageToLoad("10000");    assertEquals(driver.getText("failure"),     "There was an error in creating the widget.",     "test didn't return expected message"); } @AfterClass private void stop() throws Exception {  driver.stop(); }} 


目前为止,我已经定义了两种足够灵活的 Selenium 测试,可以对多个浏览器进行测试,并且还可以对多个位置进行测试,这对初学者非常有利。尽管如此,我还想获得更高级点的应用,我开始考虑测试中的逻辑是否可重复使用。比如,如果对一行运行两次 CreateWidgetUATest 测试类会怎样?如何确保我的 Web 应用程序运行的是本地机器(或其他机器)上新版本的代码?


可重复的验收测试

在执行 Selenium 测试时,必须运行 Selenium 服务器以及要检验的 Web 应用程序。言外之意,还必须运行应用程序中所有相关的架构依赖关系 —— 对于大多数 Java™ Web 应用程序来说,即 Servlet 容器和相关的数据库。

正如在我的另一篇文章 repeatable system tests 中解释的一样,DbUnit 和 Cargo 是两种我喜欢的技术,可以在依赖数据库的 Web 应用程序中实现逻辑重复。DbUnit 管理数据库中的数据,而 Cargo 使容器管理以通用的方式实现自动化。下面几节将向您展示如何结合使用 Selenium 和 TestNG 从而确保实现逻辑重复的验收测试。

上一页123下一页
软件测试工具 | 联系我们 | 投诉建议 | 诚聘英才 | 申请使用列表 | 网站地图
沪ICP备07036474 2003-2017 版权所有 上海泽众软件科技有限公司 Shanghai ZeZhong Software Co.,Ltd