自动测试节省了您重复执行相同测试步骤的时间和精力。 本文介绍了jWebUnit,这是一组Java类,可用于开发Web应用程序的测试用例。 jWebUnit是一个开放源代码项目,根据BSD许可证可免费获得。 我将向您展示如何下载jWebUnit库,配置Eclipse平台以开发jWebUnit测试用例以及构建示例测试用例。
介绍jWebUnit
jWebUnit基于HttpUnit(用于自动测试Web应用程序的Java库)和JUnit单元测试框架(请参阅参考资料 )。 jWebUnit提供了用于导航Web应用程序的高级API,并结合了一组断言,这些断言用于通过链接,表单输入和提交,表内容以及其他典型的业务Web应用程序功能来验证导航的正确性。 jWebUnit以JAR文件的形式出现,可轻松插入大多数IDE,并包含其他必需的库。
用HttpUnit测试
对Web应用程序的自动测试意味着绕过Web浏览器,并通过您的程序使用该网站。 首先,我将向您展示JWebUnit的构建模块之一HttpUnit如何简化此任务。 HttpUnit可以模拟框架,JavaScript,页面重定向cookie等。 与JUnit一起使用时,HttpUnit可以快速验证网站的功能。
清单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
相对路径/index.html
处连接到站点。 第12行单击该页面上带有文本Cookbook的链接。 如果单击成功,则JUnit报告成功。 否则,它将报告异常。
jWebUnit API:仔细研究
每个jWebUnit测试用例的核心是net.sourceforge.jwebunit.WebTestCase
类,它代表一个测试用例。 每个测试用例都必须从此类扩展。 ( net.sourceforge.jwebunit.WebTestCase
类本身是从junit.framework.TestCase
扩展的,该类代表JUnit中的一个测试案例。)表1描述了此类的一些常用方法:
表1. net.sourceforge.jwebunit.WebTestCase类的重要方法
方法 | 描述 |
---|---|
公共TestContext getTestContext() | 获取测试用例的上下文。 您可以使用它来访问区域设置,基本URL和cookie等项目。 |
公共无效beginAt(String relativeURL) | 从相对于基本URL的URL开始对话。 |
公共无效setWorkingForm(String nameOrId) | 以指定的形式开始交互。 如果当前页面只有一种形式,则无需调用此方法。 |
受保护的void Submit() | 提交表单-等同于单击表单的“ 提交”按钮。 |
公共无效gotoFrame(String frameName) | 使命名框架处于活动状态。 |
另一个重要的类是net.sourceforge.jwebunit.TestContext
。 它建立了测试的环境。 您可以使用此类来处理Cookie,会话和授权等信息。 表2显示了此类的一些重要方法:
表2. net.sourceforge.jwebunit.TestContext类的重要方法
方法 | 描述 |
---|---|
公共无效addCookie(字符串名称,字符串值) | 将cookie添加到测试上下文。 开始HttpUnitDialog 时,将在WebConversation 上设置添加的cookie。 |
公共无效setResourceBundleName(字符串名称) | 设置用于测试上下文的资源包。 用于通过WebTester 的键查找期望值。 |
公共无效setProxyName(String proxyName) | 设置测试上下文的代理服务器名称。 |
公共无效setBaseUrl(字符串url) | 设置测试上下文的基本URL。 |
在Eclipse中下载和配置jWebUnit
jWebUnit是用纯Java代码实现的,因此可以作为JAR文件使用(下载链接请参阅参考资料 )。 下载它之后,请按照以下步骤在Eclipse平台上配置jWebUnit库:
- 将下载的文件jwebunit-1.2.zip解压缩到一个临时目录(出于我们的目的,假定为C:\ temp)。
- 在Eclipse中创建一个名为jWebUnit的新Java项目。
- 在Package Explorer视图中右键单击jWebUnit项目,然后选择Properties 。
- 单击Java构建路径 。 在“库”选项卡中,单击“ 添加外部JAR” 。
- 浏览到C:\ temp \ jwebunit-1.2 \ lib目录,然后选择此目录中的所有JAR。
- 单击确定 。
现在,您可以在jWebUnit项目下的Eclipse中开始开发jWebUnit测试用例。
构建示例应用程序
现在该看看jWebUnit API的作用了。 我将引导您完成一个示例应用程序,以帮助您更好地了解jWebUnit的真正功能。 该应用程序是打开Google搜索页面并搜索文本HttpUnit的测试用例。 您希望应用程序测试以下方案:
- 打开Google主页http://www.google.com。
- 断言该页面包含名称为
q
的表单元素。 (在Google主页上,名为q
的文本框是将用户查询作为输入的文本框。)应用程序使用此元素输入搜索条件。 - 在搜索文本框中输入字符串
HttpUnit Home
,然后提交表单。 - 获取结果页面并断言它包含一个包含文本HttpUnit Home的链接。
- 单击带有文本HttpUnit Home的链接。
现在已经准备好测试方案,您可以编写一个使用jWebUnit来实现这些要求的Java应用程序。
第一步是声明一个从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
的表单元素-Google主页上的查询条目文本框的名称。 下一条语句将名称为q
的文本框设置为HttpUnit
值。 下btnG
语句提交名为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具有更多的功能,可以在测试用例中使用。 它可以让您的测试计算网页上存在的链接数。 您可以断言页面中是否存在带有给定标签的字符串,表格或表单输入元素。 您可以玩cookie,例如断言存在cookie,删除cookie等。 然后您的测试可以单击带有特定文本的链接,该链接出现在其他文本之后。 如果您想为Web应用程序构建快速有效的测试用例,则jWebUnit可能是您最好的朋友。
翻译自: https://www.ibm.com/developerworks/java/library/j-jwebunit/index.html