`
Ivan_Pig
  • 浏览: 388289 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

ZK单元测试

阅读更多
Luca Vix Visconti, CEO, Open Gate S.r.l.
Last Update: November 25, 2008

原文地址:http://www.zkoss.org/smalltalks/zkunittesting/

版本

适用与任何版本.ZK 3.0.x 和 3.5.x经过测试。

背景

应用中运行自动化测试是开发出一个高质量的企业应用的保证。在这篇文章中,我们将介绍一种使用Selenium和JUnit测试ZK程序的简单方法。我们以测试ZK Demo为例。

准备

我们假设你已经安装了Eclipse 3.X和Firefox

介绍

Selenium是一个测试套件。它由一个单元测试运行部分Selenium Remote Control,一些客户端的语言库,firefox的宏插件以及一个可视化的eclipse插件组成。 Selenium Remote Control是一个服务器端,它会等待客户端发送过来的命令,并根据命令控制浏览器来运行相应的web程序。这里我们将解释如何启动Selenium Remote Control以及使用java编写一个简单的客户端来测试ZK demo的一些特性。Firefox的Selenium IDE对一步步的测试你的宏很有帮助。

获得软件

要下载selenium请访问Selenium Remote Control 下载页面,并下载最新版本。在SELENIUM_HOME目录下解压缩文件。
要为你的Firefox安装Selenium IDE,请访问addon网站,按一般流程来下载安装addons.
我们还需要JUnit,你在从Sourcefoge Junit page下载。

启动Selenium Remote Control
到SELENIUM_HOME/selenium-server-1.0-beta-1/ 目录下,并运行

java -jar selenium-server.jar


配置Firefox

Selenium Remote Control以代理的方式运行,所以,如果要使所有的测试能运行,你必须要设置浏览器的代理。创建一个如下所示的proxy.pac文件。到 Preferences > Advanced > Network > Settings 并设置自动代理配置的url为 file:///path/to/your/proxy.pac
对于windows下使用IE的用户,你必须要去掉一个斜杠,像这样
file://path/to/your/proxy.pac

proxy.pac

function FindProxyForURL(url, host) {
  if ( shExpMatch(url,"*selenium-server*") ) {
    return "PROXY localhost:4444; DIRECT"; //The Selenium Remote Control
  } else {
    if ( shExpMatch(host,"localhost") ) {
      return "DIRECT";
    } else {
      return "PROXY your.proxy.com:proxyport; DIRECT"; // or DIRECT like localhost if you have no proxy
    }
  }
}


保证访问下面的例子网址时都能流畅的运行,http://google.com和 http://google.com/selenium-server.如果一切OK,你会看到下面的错误信息。

HTTP ERROR: 404

/selenium-server/ Not Found

RequestURI=/selenium-server/

Powered by Jetty://

你需要到about:config下(地址栏内输入 about:config),将browser.sessionstore.resume_from_crash 属性设置为false.

创建测试程序

打开eclipse创建一个java工程。创建一个lib文件夹并导入需要的库:
    * SELENIUM_HOME/selenium-java-client-driver-1.0-beta-1下的selenium-java-client-driver.jar
    * 从sourceforge下载的junit-3.8.1.jar

接着选择这个库,右击并选择Build Path > Add to Build Path

在src下,默认包内创建一个新类ZKDemoTest粘帖下面的代码:

import com.thoughtworks.selenium.*;
import java.util.regex.Pattern;

public class ZkDemoTest extends SeleneseTestCase {

		@Override
		public void setUp() throws Exception {
			setUp("http://www.zkoss.org/", "*custom /usr/bin/firefox");
		}
		
		@Override
		public void tearDown() throws Exception {
			super.tearDown();
			selenium.stop();
		}

		public void testNew() throws Exception {
			selenium.open("/zkdemo/userguide/");
			selenium.click("//div[text()='Paging']");
			for (int second = 0;; second++) {
				if (second >= 60) fail("timeout");
				try { 
					if (selenium.isElementPresent("//h4[text()='Listboxes with paging control']")) break; 
				} catch (Exception e) {}
				Thread.sleep(1000);
			}

			selenium.click("//button[@class='z-paging-next']");
			for (int second = 0;; second++) {
				if (second >= 60) fail("timeout");
				try {
					if ("2".equals(selenium.getValue("//input[@class='z-paging-inp']"))) break; 
				} catch (Exception e) {}
				Thread.sleep(1000);
			}

			selenium.click("//button[@class='z-paging-next']");
			for (int second = 0;; second++) {
				if (second >= 60) fail("timeout");
				try { 
					if ("3".equals(selenium.getValue("//input[@class='z-paging-inp']"))) break; 
				} catch (Exception e) {}
				Thread.sleep(1000);
			}

			selenium.click("//button[@class='z-paging-next']");
			for (int second = 0;; second++) {
				if (second >= 60) fail("timeout");
				try { 
					if ("4".equals(selenium.getValue("//input[@class='z-paging-inp']"))) break;
				} catch (Exception e) {}
				Thread.sleep(1000);
			}

			selenium.click("//div[text()='The onChanging event']");
			for (int second = 0;; second++) {
				if (second >= 60) fail("timeout");
				try {
					if (selenium.isElementPresent("//h4[text()='The onChanging event']")) break;
				} catch (Exception e) {}
				Thread.sleep(1000);
			}

			selenium.type("//span[text()='onChanging textbox: ']//../../..//input", "testme");
			Thread.sleep(1000);
			assertEquals("testme", selenium.getValue("//span[text()='instant copy: ']//../../..//input"));
		}
}


setUp方法定义了站点的url和浏览器。IE用户使用IE的路径替换第二个参数即可。

要运行测试,右击ZkDemoTest.java并选择Run As > JUnite Test



编写你自己的测试代码

为了简化你自己的测试代码你可以使用Selenium IDE.
在安装了前面所说的插件后,你可以使用Firefox到你想测试的站点
并打开IDE。( Tools > Selenium IDE ).



在base URL一栏输入web应用的地址并点击录制按钮(在顶部右端的红色按钮)
在你录制了一些命令后,你可能需要编辑它们。Selenium和其他测试套件一样,使用组件的ID辨认组件。如果你使用元数据绑定,记得在使用了类型命令后执行onBlur事件。如果你想修改你的zk组件去包含一个z.id属性,修改html元素为如下形式//element[@z.id='myZkId']

你编辑完之后可以到Options > Format > Java - Selenium RC并将结果粘帖到你的java类里面。
  • 大小: 96 KB
  • 大小: 26.7 KB
4
0
分享到:
评论

相关推荐

    ZK+spring+hibernate的整合

    6. **测试与优化**:最后,进行单元测试和集成测试,确保所有功能正常运行。在实际应用中,还需要考虑性能优化,如缓存策略、数据库索引设计等。 通过上述步骤,我们就能实现ZK、Spring和Hibernate的深度整合,构建...

    ZK所需jar包

    6. **测试**:编写单元测试和集成测试,确保所有组件正常工作。 在实际开发中,你还需要考虑线程安全、性能优化、错误处理和日志记录等问题。ZK7+Spring4+Hibernate4的组合提供了一种强大的方式来构建健壮且易于...

    ajax框架 zk开发手册

    - **测试与调试**:使用ZK提供的工具进行单元测试和性能测试,确保应用质量。 **6. ZK开发手册** 《ZK开发手册》是ZK框架的官方文档,详细介绍了ZK的使用方法、组件、API、事件处理、集成策略等内容,是开发者学习...

    zk组件封装demo

    7. **测试与调试**:在Eclipse Juno环境下,开发者可能会编写单元测试来验证封装组件的功能,并使用IDE的调试工具来查找和修复问题。 8. **版本兼容性**:由于使用了jdk1.5,需要注意ZooKeeper的版本是否与之兼容,...

    zk组件开发代码,可运行

    6. **单元测试与集成测试**:检查代码是否包含相关的测试用例,了解如何使用JUnit或其他测试框架对Zookeeper组件进行测试。 7. **模块化编程**:理解如何按照模块化的方式组织代码,提高代码的可读性和可维护性。 ...

    zk studio 开发包

    7. **运行和测试**:提供预览和运行ZK应用的功能,以及单元测试的支持。 8. **版本控制集成**:如Git或SVN,便于代码版本管理和团队协作。 9. **插件市场**:可能可以访问更多的社区插件,进一步扩展ZK Studio的功能...

    ZK Spreadsheet(3-3)

    1. **Znodes**: 存储数据的基本单元,可以设置 watches(监视器),并且有版本号来追踪变更。 2. **Watches**: 一次性触发的通知机制,当一个znode的数据或结构发生变化时,所有设置了watch的客户端都会收到通知。 3...

    zk+dubbo+spring本地工程

    8. **测试与监控**:一个完整的工程通常会包含单元测试和集成测试,确保服务的正确性。此外,Dubbo和Zookeeper都有相应的监控工具或接口,用于查看服务状态、调用统计等,这对于微服务的运维至关重要。 综上所述,...

    zk框架开发帮助文档

    1. 节点(Znode):Zookeeper数据存储的基本单元,类似于文件系统中的文件或目录。每个节点都有路径,可以存储数据,并且具有版本号。 2. 会话(Session):客户端与Zookeeper服务器之间的连接,用于保持服务的连续...

    注册管理(zk基本运用)

    - **节点(Znode)**: Zookeeper中的数据存储单元,分为临时节点和持久节点。 - **会话(Session)**: 客户端与Zookeeper服务器之间的连接,有超时时间限制。 - **Watch机制**: 可以设置监听特定节点的变化,当...

    wxh zk-src-3.0.3-2008-01-31

    6. **test**:测试代码,包括单元测试和集成测试,用于验证ZK的功能和性能。 在学习和研究ZK 3.0.3源码时,你可以关注以下几个方面: - **组件系统**:ZK的组件模型是如何实现的,如何通过XML或Java代码创建和布局...

    ultimatest:终极单元测试

    "Ultimate Test",正如其名,旨在提供一种全面且高效的单元测试方法,完全剥离了对第三方依赖如dubbo、zk、redis、codis和mysql等的服务。这种做法有助于保持测试的独立性和纯粹性,同时提高测试速度和准确性。 ...

    【转】zk做的新闻发布系统源码【作者zkajax 】

    开发完成后,通常需要进行单元测试和集成测试,确保各个模块正常工作。ZK提供了测试工具,如ZK TestNG,便于进行UI测试。部署时,ZK应用通常打包为WAR文件,可部署在任何支持Servlet的容器中,如Tomcat。 总的来说...

    ZK 6.5.0 Component Development Essentials

    - **集成测试**:使用 JUnit 或其他测试框架进行单元测试和集成测试。 - **创建简单的 ZK 组件**: - **定义组件类**:继承自 `zul.wgt.UICustom` 类或其他 ZK 组件基类,实现必要的方法。 - **实现属性**:根据...

    ZK Dev Guide 2.4.1 English Version

    - **组件**: 是构成用户界面的基本单元,它们可以是按钮、文本框等。 - **页面**: 是一组相关的组件的集合,通常对应于一个特定的视图或功能。 - **桌面**: 是多个页面的容器,允许用户在不同的页面之间导航。 ####...

    zk-FCKeditor-2.5.1_1.zip

    "标签"为"zujian",这可能意味着该压缩包内容主要关注的是ZK框架的组件或者控件部分,因为"组件"在中文中常常被用来指代软件开发中可复用的代码单元。 从"压缩包子文件的文件名称列表"来看,只有一个条目"zk-...

    Delphi zk4500_delphi_ztk_

    标题 "Delphi zk4500_delphi_ztk_" 暗示了这是一个基于 Delphi 开发的项目,专门针对 ZK4500 模块的 SDK 进行测试。Delphi 是一种流行的面向对象的 Pascal 编程语言,常用于开发桌面应用程序。ZTK 可能是 ZK ...

    zk-framework-maven:Ejemplo Jenkins con zk框架

    如果项目包含单元测试,可以配置Jenkins运行这些测试并在构建完成后生成测试报告。 通过这个例子,开发者可以学习如何将ZK框架、Maven和Jenkins结合,构建一个高效、自动化的工作流,从而提升开发效率和软件质量。...

    Java版node-zk-browser

    8. **单元测试与集成测试**:使用JUnit或其他测试框架对Java代码进行单元测试,确保代码的正确性。 9. **版本控制**:熟悉Git或其他版本控制系统,用于协同开发和代码版本管理。 通过学习和实践这个项目,开发者...

    junit-4.12.rar包及依赖包

    在Java开发过程中,单元测试是不可或缺的一环,它有助于确保代码的质量和可维护性。JUnit作为最常用的Java单元测试框架,被广泛应用于各种项目中。本文将深入探讨关于"junit-4.12.rar"包及其依赖包,以及如何解决在...

Global site tag (gtag.js) - Google Analytics