您是否正在寻找一种把自动测试技术应用到 Web 开发中的方法?那么不用再找了!jWebUnit 就是为 Web 应用程序创建测试用例的一个开源框架,它可以容易地插入到大多数 Java IDE 中。通过使用一个示例应用程序,描述了生成简洁测试用例的详细步骤,软件工程师 Amit Tuli 对 jWebUnit 进行了介绍。
自动测试可以节省重复执行相同测试步骤的时间和精力。本文将介绍 jWebUnit,这是一组 Java 类,用于为 Web 应用程序开发测试用例。jWebUnit 是一个开源项目,可以在 BSD 许可下免费获得。我将介绍如何下载 jWebUnit 库、配置 Eclipse 平台来开发 jWebUnit 测试用例,以及如何构建一个示例测试用例。
jWebUnit 简介
jWebUnit 以 HttpUnit(一个进行 Web 应用程序自动测试的 Java 库)和 JUnit 单元测试框架为基础(请参阅 参考资料)。 jWebUnit 提供了导航 Web 应用程序的高级 API,并组合了一组断言,用它们来验证链接导航、表单输入项和提交、表格内容以及其他典型商务 Web 应用程序特性的正确性。 jWebUnit 以 JAR 文件形式提供的,可以很容易地将它插入大多数 IDE 中,jWebUnit 也包含其他必要的库。
用 HttpUnit 进行测试
对 Web 应用程序自动进行测试意味着跳过 Web 浏览器,通过程序来处理 Web 站点。首先,我要介绍 HttpUnit(JWebUnit 的构建块之一)是如何简化这项工作的。HttpUnit 可以模拟帧、JavaScript、页面重定向 cookie,等等。在将 HttpUnit 用于 JUnit 时,它可以迅速地对 Web 站点的功能进行验证。
清单 1 显示了一个用 HttpUnit 编写的测试用例,它试图单击 HttpUnit 主页上的“Cookbook”链接:
清单 1. 单击 HttpUnit 主页上 Cookbook 链接的 HttpUnit 代码
1 public class HttpUnitTest {
2 public static void main(String[] args) {
3 try {
4 WebConversation wc = new WebConversation();
5 WebRequest request =
new GetMethodWebRequest("http://httpunit.sourceforge.net/index.html");
6 wc.setProxyServer( "your.proxy.com", 80 );
7 WebResponse response = wc.getResponse(request);
8 WebLink httpunitLink =
response.getFirstMatchingLink(WebLink.MATCH_CONTAINED_TEXT,"Cookbook");
9 response = httpunitLink.click();
10 System.out.println("Test successful !!");
11 } catch (Exception e) {
12 System.err.println("Exception: " + e);
13 }
14 }
15 }
清单 1 中的代码用 your.proxy.com (第 6 行)连接 Internet。如果存在直接 Internet 连接,那么可以把这个语句注释掉。第 8 行的语句在页面中搜索包含文本 Cookbook 的 Web 链接。第 9 行的语句用于单击这个链接。如果找到链接,那么用户会看到 Test Successful !! 这条消息。
用 jWebUnit 进行的测试更简单
清单 2 的测试用例用 jWebUnit API 执行和清单 1 相同的任务:
清单 2. 单击 HttpUnit 主页上 Cookbook 链接的 jWebUnit 代码
1 public class JWebUnitTest extends WebTestCase{
2 public static void main(String[] args){
3 junit.textui.TestRunner.run(new TestSuite(JWebUnitTest.class));
4 }
5 public void setUp(){
6 getTestContext().setBaseUrl("http://httpunit.sourceforge.net");
7 getTestContext().setProxyName("webproxy.watson.ibm.com");
8 getTestContext().setProxyPort(8080);
9 }
10 public void testSearch(){
11 beginAt("/index.html");
12 clickLinkWithText("Cookbook");
13 }
14 }
如果没注意清单 2 中特定于 JUnit 的代码,那么您可以看到,测试用例现在变得相当整洁、简练。需要查看的重要的行是第 6 行、第 11 行和第 12 行。在第 6 行,基本 URL 被设置到 HttpUnit 的主页中。第 11 行用相对路径 /index.html 连接站点。第 12 行用于单击页面上具有文本 Cookbook 的链接。如果链接有效,那么 JUnit 会报告成功;否则,JUnit 会报告异常。
jWebUnit API:进一步观察
每个 jWebUnit 测试的核心都是 net.sourceforge.jwebunit.WebTestCase 类,它代表测试用例。每个测试用例都必须是从这个类扩展而来。(net.sourceforge.jwebunit.WebTestCase 类本身则是从 junit.framework.TestCase 类扩展而来的,它在 JUnit 中代表测试用例。) 表 1 描述了这个类的一些常用方法:
表 1. net.sourceforge.jwebunit.WebTestCase 类的重要方法
方法 说明
public TestContext getTestContext() 得到测试用例的上下文。可以用它访问像地区、基本 URL 和 cookie 之类的项目
public void beginAt(String relativeURL) 在相对于基本 URL 的 URL 处开始对话
public void setWorkingForm(String nameOrId) 与指定的表单开始交互。如果当前页面只有一个表单,就不需要调用这个方法
protected void submit() 提交表单 —— 等同于单击表单的 提交 按钮
public void gotoFrame(String frameName) 激活命名帧
另一个重要的类是 net.sourceforge.jwebunit.TestContext。它为测试创建上下文。可以用这个类来处理像 cookie、会话和授权之类的信息。表 2 显示了这个类的一些重要方法:
表 2. net.sourceforge.jwebunit.TestContext 类的重要方法
方法 说明
public void addCookie(String name, String value) 向测试上下文中添加 cookie。在 HttpUnitDialog 开始时,添加的 cookie 被设置到 WebConversation 上
public void setResourceBundleName(String name) 为测试上下文设置一个使用的资源绑定。用于按照 WebTester 中的键查找期望的值
public void setProxyName(String proxyName) 为测试上下文设置代理服务器名称
public void setBaseUrl(String url) 为测试上下文设置基本 URL
下载 jWebUnit,在 Eclipse 中配置 jWebUnit
jWebUnit 是用纯 Java 代码实现的,所以可以以 JAR 文件的形式获得它 (请参阅 参考资料,从中获得下载链接)。在完成下载之后,请按以下步骤在 Eclipse 平台上配置 jWebUnit 库:
把下载的文件 jwebunit-1.2.zip 释放到临时目录中(假设是 C:\temp)。
在 Eclipse 中创建新 Java 项目,将其命名为 jWebUnit。
右击 Package Explorer 视图中的 jWebUnit 项目,然后选择 Properties。
单击 Java Build Path。单击 Libraries 标签中的 Add External JARs。
浏览到 C:\temp\jwebunit-1.2\lib 目录,选择这个目录中的所有 JAR 文件。
单击 OK。
现在可以在 Eclipse 中的 jWebUnit 项目下开发 jWebUnit 测试用例了。
构建示例应用程序
现在就可以查看 jWebUnit API 的实际应用了。我将带您研究一个示例应用程序,帮助您更好地理解 jWebUnit 的真正威力。这个应用程序是一个测试用例,用于打开一个 Google 搜索页面并搜索文本 HttpUnit。应用程序需要测试以下场景:
打开 Google 主页 http://www.google.com。
确定该页包含一个名为 q 的表单元素。(在 Google 的主页上,名为 q 的文本框是接受用户查询输入的文本框。)应用程序用这个元素输入搜索参数。
在搜索文本框中输入字符串 HttpUnit Home,并提交表单。
获得结果页,并确定该页面包含的链接中包含文本 HttpUnit Home。
单击包含文本 HttpUnit Home 的链接。
现在测试场景已经就绪,可以编写 Java 应用程序,用 jWebUnit 实现这些需求了。
第一步是声明一个从 WebTestCase 扩展而来的类,如清单 3 所示:
清单 3. 声明测试用例类
public class GoogleTest extends WebTestCase {
static String searchLink = "";
}
正如我在前面提到过的,jWebUnit 要求每个测试用例都是从 WebTestCase 中扩展而来的。searchLink 保存传入的搜索参数。这个值以命令行参数的形式传递给测试用例。
下一步是声明入口点 —— main() 方法,如清单 4 所示:
清单 4. main() 方法
public static void main(String[] args) {
searchLink = args[0];
junit.textui.TestRunner.run(new TestSuite(GoogleTest.class));
}
main() 方法调用 junit.textui.TestRunner.run() 执行 JTest 测试用例。因为需要运行 GoogleTest 测试用例,所以,作为参数传递给 run() 方法的测试套件采用 GoogleTest.class 作为参数。
接下来,JTest 调用 setUp() 方法来设置基本 URL 和代理,如清单 5 所示:
清单 5. 设置
public void setUp() {
getTestContext().setBaseUrl("http://www.google.com");
getTestContext().setProxyName("proxy.host.com");
getTestContext().setProxyPort(80);
}
清单 5 把基本 URL 设置为 http://www.google.com。这意味着测试用例的启动是相对于这个 URL 的。下面两个语句设置连接到 Internet 的代理主机和代理端口。如果是直接连接到 Internet,那么可以忽略代理设置语句。
现在开始浏览站点并输入搜索参数。清单 6 显示了访问 Web 页面,然后测试所有场景的代码:
清单 6. 测试所有场景
public void testSearch() {
beginAt("/");
assertFormElementPresent("q");
setFormElement("q", "HttpUnit");
submit("btnG");
assertLinkPresentWithText(searchLink);
clickLinkWithText(searchLink);
}
清单 6 的代码连接到基本 URL,并相对于 / 开始浏览。然后它断定页面中包含一个名为 q 的表单元素 —— q 是 Google 主页上查询输入文本框的名称。下一条语句用值 HttpUnit 设置名为 q 的文本框。再下一条语言提交表单上名为 btnG 的提交按钮。(在 Google 的主页上,名为 btnG 的按钮是标签为 Google Search 的按钮。)表单是在这个对话中提交的,下一页列出搜索结果。在结果页面上,代码首先检查是否有一个链接的文本是 HttpUnit Home。如果该链接不存在,那么测试就以 AssertionFailedError 失败。如果该链接存在,则测试执行的下一个操作是单击链接。
运行示例应用程序
现在把示例应用程序投入使用当中:
下载示例应用程序 j-webunitsample.jar (请参阅 下载)。
在一个目录中解压缩 j-webunitsample.jar。例如,如果把它释放到 C:\temp 中,那么就要把源文件和类文件放在 C:\temp\com\jweb\test 中,而 setclasspth.bat 则放在 C:\temp 中。
编辑 setclasspath.bat:设置 JAR_BASE 指向包含所有必需 JAR 文件的目录。例如,如果在 C:\temp 中释放 jwebunit-1.2.zip 文件,那么将 JAR_BASE 设置为 C:\temp\jwebunit-1.2\lib。
打开命令行提示符,切换到 C:\temp 目录。
执行 setclasspath.bat。这会设置执行测试用例所需的 CLASSPATH。
用命令 java com.jweb.test.GoogleTest "HttpUnit Home" 运行应用程序。
示例输出
在执行了测试用例之后,会在命令行输出一个测试用例报告。如果测试失败,报告看起来如清单 7 中所示:
清单 7. 带有断言失败的输出
C:\temp>java com.jweb.test.GoogleTest "HttpUnit Hwee"
.F
Time: 5.338
There was 1 failure:
1) testSearch(com.jweb.test.GoogleTest)junit.framework.AssertionFailedError: Link
with text [HttpUnit Hwee] not found in response.
at net.sourceforge.jwebunit.WebTester.assertLinkPresentWithText(WebTester.java:618)
at net.sourceforge.jwebunit.WebTestCase.assertLinkPresentWithText(WebTestCase.java:244)
at com.jweb.test.GoogleTest.testSearch(GoogleTest.java:36)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at com.jweb.test.GoogleTest.main(GoogleTest.java:19)
FAILURES!!!
Tests run: 1, Failures: 1, Errors: 0
正如在清单 7 中可以看到的,可以用 HttpUnit Hwee 作为参数来执行测试用例。这个测试用例遇到断言的地方会失败,因为结果页面中不包含带有这个文本的链接。由此也就产生了junit.framework.AssertionFailedError。
清单 8 执行时用 HttpUnit Home 作为参数。测试用例找到一个带有这个文本的链接,所以测试通过了:
清单 8. 成功测试的输出
C:\temp>java com.jweb.test.GoogleTest "HttpUnit Home"
.
Time: 6.991
OK (1 test)
结束语
本文通过讨论 jWebUnit 框架的一些突出特性和最重要的类,介绍如何用它创建简洁的测试用例,让您对 jWebUnit 框架有一个认识。jWebUnit 还有更多特性可以用在测试用例中。它支持测试 Web 页面中的链接行数。可以对字符串、表或者带有指定标签的表单输入元素是否存在于页面上进行断言。此外,jWebUnit 还可以处理 cookie (例如断言存在某个 cookie、删除 cookie 等。)测试可以对某个文本之后出现的特定文本的链接进行单击。 如果想为 Web 应用程序构建快而有效的测试用例,jWebUnit 可能是您最好的朋友。
(http://www.fanqiang.com)
原文链接:http://www-128.ibm.com/developerworks/cn/java/j-jwebunit/
分享到:
相关推荐
随着Web应用程序的日益普及和发展,确保这些应用程序的稳定性和功能性变得至关重要。测试是软件开发过程的关键部分,对于Web应用程序而言更是如此。本篇文章将深入探讨两种用于Web应用测试的工具:HttpUnit与...
jWebUnit是以HttpUnitJUnit 单元测试框架为基础,用于为Web应用程序开发测试用例,对 Web应用程序自动进行测试意味着跳过Web浏览器,通过程序来处理Web站点。jWebUnit提供了导航Web应用程序的高级API,并组合了一组...
JWebUnit是一个开源的Java测试框架,专为Web应用程序提供自动化测试解决方案。在3.2版本中,该框架进一步提升了测试的便利性和覆盖率,使得开发者能够更高效地进行Web应用的质量控制。下面将详细介绍JWebUnit 3.2...
WEB应用程序为Web应用程序创建软件测试用例软件测试本文内容包括:jWebUnit简介jWebUnitAPI:进一步观察下载jWebUnit,在Eclipse中配置jWebUnit构建示例应用程序运行示例应用程序结束语下载参考资料您是否正在寻找一...
这个名字表明它是JWebUnit的一部分,这是一个基于Java的自动化Web应用程序测试框架。 **描述详解:**"jwebunit.jar 基于java的测试网络程序的框架" 描述了该文件的主要功能。它是一个工具,帮助开发者对Web应用进行...
jWebUnit简介 jWebUnit是以HttpUnitJUnit单元测试框架为基础,用于为Web应用程序开发测试用例,对Web应用程序自动进行测试意味着跳过Web浏览器,通过程序来处理Web站点。jWebUnit提供了导航Web应用程序的高级API,...
JWebUnit是一个基于HttpUnit的高级封装,提供了更多的Web测试功能,使得测试Web应用变得更加方便。 为了进行接口测试,测试工程师需要了解HTTP协议。HTTP(超文本传输协议)是用于从Web服务器传输超文本到本地...
JWebUnit 是一个强大的Java库,专门用于自动化Web应用程序的测试。这个工具提供了一种简洁的方式来编写JUnit测试,可以模拟用户与Web页面的交互,如点击链接、填写表单、提交数据,并验证页面内容。通过JWebUnit,...
JWebUnit作为一个强大的Web测试工具,使得开发者能够轻松地对Web应用程序进行自动化测试,提高了测试覆盖率和产品质量。通过它的丰富API,你可以创建全面的测试场景,覆盖从基本的页面元素验证到复杂的用户交互流程...
在Java开源领域,有许多优秀的Web测试工具,这些工具帮助开发者和测试人员确保Web应用程序的功能性和稳定性。以下是一些主要的Java开源Web测试工具的详细介绍: 1. **HtmlUnit**:这是一个JUnit的扩展,能够模拟...
例如,在JWebUnit或HttpUnit等扩展框架的帮助下,可以轻松实现Web应用程序的自动化测试。然而,测试的基础设施(如测试数据的准备和清理)需要开发者额外的工作,以确保每次测试都能在一个一致的状态下执行。 清单1...
因为使用Structs会使web程序容器间(in-container)的功能测试和单元测试变得复杂,StructsTestCase就是专为Struts程序的容器间测试设计的。 单元测试(Unit Testing) -------------------- ### 什么是单元测试?...
- **设置J2EE Web应用程序项目**:详细讲解了如何在开发环境中配置一个新的J2EE项目来使用Struts。 - **编写第一个Action**:介绍了如何创建一个简单的Action类来处理用户请求。 - **编写第一个Forward**:解释了...
在IT行业中,J2EE(Java 2 Platform, Enterprise Edition)是企业级应用开发的重要标准,涵盖了一系列技术和框架。作为一名J2EE程序员,你需要掌握以下关键领域的知识: 1. **Web开发框架**: - JSF(Facelets,...
JavaScript 基于的 HTTP 测试库是一种创新的开源工具,它旨在为开发者提供一种方便、灵活的方式来测试 Web 应用程序的前端部分。这个库的出现是对 HttpUnit 和 jWebUnit 这类 Java 测试框架的一种 JavaScript 实现,...