- 浏览: 581535 次
- 性别:
- 来自: 广州
文章分类
- 全部博客 (188)
- java (14)
- web (14)
- web service (3)
- 杂谈 (14)
- Version Control (13)
- software test (30)
- linux (17)
- database (3)
- distributed storage and computing (1)
- ejb (7)
- project building (46)
- spring & IOC (2)
- Thread (2)
- xml (2)
- tool software (0)
- [网站分类]1.网站首页原创Java技术区(对首页文章的要求: 原创、高质量、经过认真思考并精心写作。BlogJava管理团队会对首页的文章进行管理。) (0)
- project manager (9)
- OSGI (1)
- nosql (3)
最新评论
-
sp42:
好搞笑
你懂不懂xml! (2) -
cherishmmo2004:
感觉你们都很牛掰,我们做的一个运维平台也是用karaf的,用k ...
基于osgi开发大型的企业应用 -
liubey:
“自作聪明”的使用了读写锁,其实只使用ReentrantLoc ...
编码最佳实践(4)--小心LinkedHashMap的get()方法 -
liubey:
你这个代码是sublist后仍然一直持有这个sub的引用,一般 ...
编码最佳实践(5)--小心!这只是冰山一角 -
xiegqooo:
初学maven(5)-使用assembly plugin实现自定义打包
近期自己折腾自己,放着正统的maven + junit不用,却准备用ant + ivy 替代maven做依赖管理,用testng替代junit做单元测试。
现在要做的工作,其实很简单,就是ant的脚本中,搞定相关的target: 编译,运行单元测试。
需要的步骤大体如下:
1. ivy 做依赖解析,得到所有依赖的jar包,以便生成编译源码需要的classpath路径
这里很重要的一点,是需要区分开编译正常代码的classpath和编译测试代码的classpath,因为通常情况下testcase需要一些特殊的依赖如juni,testng之类的测试框架,easymock,jmock之类的mock工具。
2. 编译代码和测试案例
3. 运行testng 来执行testcase
分别来看三者的实现。
1) ivy解析依赖
ant代码如下:
<target name="ivy.resolve" description="--> resolve project dependencies by ivy">
<echo>resolve dependencies of project "${ant.project.name}" by ivy</echo>
<ivy:resolve />
<ivy:cachefileset setid="ivy.cachefileset.compile" type="jar,bundle" conf="compile" />
<ivy:cachefileset setid="ivy.cachefileset.test" type="jar,bundle" conf="test" />
</target>
<echo>resolve dependencies of project "${ant.project.name}" by ivy</echo>
<ivy:resolve />
<ivy:cachefileset setid="ivy.cachefileset.compile" type="jar,bundle" conf="compile" />
<ivy:cachefileset setid="ivy.cachefileset.test" type="jar,bundle" conf="test" />
</target>
用到了ivy标准的resolve 任务,然后再用cachefileset来获取需要的文件列表,以备后面使用。注意type要写成"jar,bundle",因此目前的依赖包虽然扩张名都是jar,但是它的ivy类型定义确有可能为bundle(都是OSGI惹得祸)。还有上面用了两次cachefileset任务,conf不同。
2) 编译代码和测试案例
<target name="compile.compile" depends="ivy.resolve" >
<echo>compile project ${ant.project.name} </echo>
<compile_source_main />
<compile_source_test />
</target>
<macrodef name="compile_source_main">
<sequential>
<echo>compile java classes in project ${ant.project.name} </echo>
<echo>classpath is : ${project.classpath.compile.ivy.lib}</echo>
<delete dir="${dir.target.bin.main}" />
<mkdir dir="${dir.target.bin.main}" />
<javac debug="true" srcdir="${dir.src.main.java}" destdir="${dir.target.bin.main}" target="1.5" includeAntRuntime="false">
<classpath>
<pathelement location="${dir.src.main.resources}" />
<fileset refid="ivy.cachefileset.compile" />
</classpath>
</javac>
</sequential>
</macrodef>
<macrodef name="compile_source_test">
<sequential>
<echo>compile java testcase in project ${ant.project.name} </echo>
<echo>classpath is : ${project.classpath.test.ivy.lib}</echo>
<delete dir="${dir.target.bin.test}" />
<mkdir dir="${dir.target.bin.test}" />
<javac debug="true" srcdir="${dir.src.test.java}" destdir="${dir.target.bin.test}" target="1.5" includeAntRuntime="false">
<classpath>
<pathelement location="${dir.src.test.resources}" />
<pathelement location="${dir.src.main.resources}" />
<pathelement location="${dir.target.bin.main}" />
<fileset refid="ivy.cachefileset.test" />
</classpath>
</javac>
</sequential>
</macrodef>
<echo>compile project ${ant.project.name} </echo>
<compile_source_main />
<compile_source_test />
</target>
<macrodef name="compile_source_main">
<sequential>
<echo>compile java classes in project ${ant.project.name} </echo>
<echo>classpath is : ${project.classpath.compile.ivy.lib}</echo>
<delete dir="${dir.target.bin.main}" />
<mkdir dir="${dir.target.bin.main}" />
<javac debug="true" srcdir="${dir.src.main.java}" destdir="${dir.target.bin.main}" target="1.5" includeAntRuntime="false">
<classpath>
<pathelement location="${dir.src.main.resources}" />
<fileset refid="ivy.cachefileset.compile" />
</classpath>
</javac>
</sequential>
</macrodef>
<macrodef name="compile_source_test">
<sequential>
<echo>compile java testcase in project ${ant.project.name} </echo>
<echo>classpath is : ${project.classpath.test.ivy.lib}</echo>
<delete dir="${dir.target.bin.test}" />
<mkdir dir="${dir.target.bin.test}" />
<javac debug="true" srcdir="${dir.src.test.java}" destdir="${dir.target.bin.test}" target="1.5" includeAntRuntime="false">
<classpath>
<pathelement location="${dir.src.test.resources}" />
<pathelement location="${dir.src.main.resources}" />
<pathelement location="${dir.target.bin.main}" />
<fileset refid="ivy.cachefileset.test" />
</classpath>
</javac>
</sequential>
</macrodef>
注意这里用到classpath时,是在上面得到的ivy cachefileset的基础上,增加其他路径才得到最终的classpath。曾经在这里折腾了不少时间,因为开始是用ivy的cacheclasspath任务直接拿到一个classpath,然后在这里发现单有这个classpath是不够的。可是又没有找到如何从一个classpath生成一个更多内容的classpath的方法(郁闷,ant里面的classpath似乎不支持这种classpath=***+***+classpath的算法,或者是我笨没有找到)。最后只好改用cachefileset来获取fileset,然后自己增加其他路径。典型如编译测试案例时,必须将前面编译好的class作为classpath的一部分增加。从这种角度讲,ivy的cacheclasspath任务是用处不大的,实用的是cachefileset任务。
3) 运行testng
首先需要初始化testng,引入testng的任务。
<target name="testng.init" depends="ivy.resolve">
<taskdef resource="testngtasks">
<classpath>
<fileset refid="ivy.cachefileset.test" />
</classpath>
</taskdef>
</target>
<taskdef resource="testngtasks">
<classpath>
<fileset refid="ivy.cachefileset.test" />
</classpath>
</taskdef>
</target>
在具体执行testng时,有两种选择:
1. 通过testng.xml指定具体的测试案例
应该说testng对此有非常强大而富有弹性的支持,通过testng.xml可以指定不同的package,class,可以指定exclude,可以分组,还有其他高级特性。
2. 运行所有案例
使用testng.xml文件的前提是项目有提供testng.xml文件,对于一些简单的项目,可能只是简单的希望执行所有testcase,因此就需要在运行检测testng.xml文件存在与否。
<target name="testng.test" depends="testng.init">
<if>
<resourceexists>
<file file="${dir.src.test.java}/testng.xml" />
</resourceexists>
<then>
<run_testng_with_xml />
</then>
<else>
<run_testng_without_xml />
</else>
</if>
</target>
<if>
<resourceexists>
<file file="${dir.src.test.java}/testng.xml" />
</resourceexists>
<then>
<run_testng_with_xml />
</then>
<else>
<run_testng_without_xml />
</else>
</if>
</target>
testng.xml存在时,通过xmlfileset来调用testng任务:
<macrodef name="run_testng_with_xml">
<sequential>
<echo>run testng to test project "${ant.project.name}".</echo>
<echo>found ${dir.src.test.java}/testng.xml, use it to run testng.</echo>
<delete dir="${dir.target.testng.testoutput}" />
<testng outputDir="${dir.target.testng.testoutput}" haltOnfailure="true">
<xmlfileset dir="${dir.src.test.java}" includes="testng.xml" />
<classpath>
<pathelement location="${dir.src.test.resources}" />
<pathelement location="${dir.src.main.resources}" />
<pathelement location="${dir.target.bin.test}" />
<pathelement location="${dir.target.bin.main}" />
<fileset refid="ivy.cachefileset.test" />
</classpath>
</testng>
</sequential>
</macrodef>
<sequential>
<echo>run testng to test project "${ant.project.name}".</echo>
<echo>found ${dir.src.test.java}/testng.xml, use it to run testng.</echo>
<delete dir="${dir.target.testng.testoutput}" />
<testng outputDir="${dir.target.testng.testoutput}" haltOnfailure="true">
<xmlfileset dir="${dir.src.test.java}" includes="testng.xml" />
<classpath>
<pathelement location="${dir.src.test.resources}" />
<pathelement location="${dir.src.main.resources}" />
<pathelement location="${dir.target.bin.test}" />
<pathelement location="${dir.target.bin.main}" />
<fileset refid="ivy.cachefileset.test" />
</classpath>
</testng>
</sequential>
</macrodef>
testng.xml不存在时,通过classfileset来指定需要执行的class:
<macrodef name="run_testng_without_xml">
<sequential>
<if>
<resourcecount when="greater" count="0">
<fileset dir="${dir.target.bin.test}" includes="**/*.class" />
</resourcecount>
<then>
<echo>run testng to test project "${ant.project.name}".</echo>
<echo>${dir.src.test.java}/testng.xml not found, default to run all the testcase.</echo>
<delete dir="${dir.target.testng.testoutput}" />
<testng outputDir="${dir.target.testng.testoutput}" haltOnfailure="true">
<classfileset dir="${dir.target.bin.test}" includes="**/*.class" />
<classpath>
<pathelement location="${dir.src.test.resources}" />
<pathelement location="${dir.src.main.resources}" />
<pathelement location="${dir.target.bin.test}" />
<pathelement location="${dir.target.bin.main}" />
<fileset refid="ivy.cachefileset.test" />
</classpath>
</testng>
</then>
<else>
<echo>no testcase exist in "${dir.target.bin.test}", nothing to do for testng.</echo>
</else>
</if>
</sequential>
</macrodef>
<sequential>
<if>
<resourcecount when="greater" count="0">
<fileset dir="${dir.target.bin.test}" includes="**/*.class" />
</resourcecount>
<then>
<echo>run testng to test project "${ant.project.name}".</echo>
<echo>${dir.src.test.java}/testng.xml not found, default to run all the testcase.</echo>
<delete dir="${dir.target.testng.testoutput}" />
<testng outputDir="${dir.target.testng.testoutput}" haltOnfailure="true">
<classfileset dir="${dir.target.bin.test}" includes="**/*.class" />
<classpath>
<pathelement location="${dir.src.test.resources}" />
<pathelement location="${dir.src.main.resources}" />
<pathelement location="${dir.target.bin.test}" />
<pathelement location="${dir.target.bin.main}" />
<fileset refid="ivy.cachefileset.test" />
</classpath>
</testng>
</then>
<else>
<echo>no testcase exist in "${dir.target.bin.test}", nothing to do for testng.</echo>
</else>
</if>
</sequential>
</macrodef>
注意这里有个检测,判断是否有测试案例存在,如果没有写测试案例,则跳过testng任务的执行,否则如果classfileset为空,testng即得不到testng.xml的输入,也得不到classfileset的输入,会直接报错的,因此需要避免因为没有测试案例导致test失败进而整个build都失败的情况。
OK,上述三板斧下去,基本ant + ivy + testng就可以完成整合,一起跑起来了。敲一个ant test下去,就可以依赖解析,编译,执行testcase的全套过程。过程比maven + junit复杂多了,主要是一切都要自己动手,不过完成之后的效果似乎还不错。上述的过程对于一般项目都是通用的,因此以后就可以偷懒了。
发表评论
-
搜索maven依赖的网站推荐
2011-12-02 16:04 4304使用maven填写依赖的时候,常会遇到需要查一下gro ... -
hudson中subversion HEAD check out 的问题及疑惑
2010-09-30 10:56 40近期发现一个问题,hudson执行任务时,经常不能获取 ... -
slf4j1.6.0-RC0和logback的0.9.20版本不兼容
2010-04-26 08:54 3507今天,尝试使用slf4j + logback的黄金组合,结果发 ... -
fisheye2.2.1 & Crucible 2.2.1 安装配置笔记
2010-04-27 16:48 31761) 下载 从atlassian网站 ... -
让ivy支持maven的classifier属性
2009-10-15 01:56 3178在maven中,对于一个依赖,除了groupId,ar ... -
ivy教程(1)-目录
2009-09-21 23:57 2939学习的最佳方式是实践!这是ivy教程将帮助你做到的 ... -
ivy教程(2)-快速开始
2009-09-22 11:48 3050在这个例子中,我们将看到使用ivy的一个最简单的方 ... -
ivy教程(3)-调整默认设置
2009-09-24 20:58 2344ivy绑定一些默认 ... -
ivy教程(4)-多解析器
2009-09-25 15:28 1788这个例子演示模块是如何被多解析器获得的。使用多解析 ... -
ivy教程(5)-双重解析器
2009-09-27 20:58 1709在一些情况下,会发生这样的事情:你的模块描述符(ivy ... -
ivy教程(6)-项目依赖
2009-09-29 23:32 2998这个示例将举例说明在两个项目之间的依赖。 depen ... -
ivy教程(7)-在多项目环境下使用ivy
2009-10-03 11:48 2361在上一个教程中,你已 ... -
ivy教程(8)-使用ivy模块配置
2009-10-04 10:15 2658这个教程介绍ivy文件中的模块配置的使用。ivy模块配置事实上 ... -
ivy教程(9)-架设仓库(1)-介绍
2009-10-04 13:42 1846install任务让你从一个仓库复制一个模块或者模 ... -
ivy教程(10)-架设仓库(2)-基础仓库复制
2009-10-04 15:04 3048在这个步骤中我们使用install任务来从mave ... -
ivy教程(11)-架设仓库(3)-使用命名空间
2009-10-09 21:04 2249现在你已经看到从一个已经存在的仓库创建你自己的仓库是如何的简单 ... -
ivy教程(12)-更多例子
2009-10-09 21:29 1814如果你已经成功的跟随并理解了所有的教程,可能你还是需要得到更好 ... -
ivy中文参考文档(21)-ant任务(9)-post resolve tasks
2009-09-15 14:17 14631) post resolve tasks ... -
ivy中文参考文档(20)-ant任务(8)-cachefileset
2009-09-03 23:11 13871) cachefileset 为配置构建一个有iv ... -
ivy中文参考文档(18)-ant任务(6)-deliver
2009-08-31 22:22 14561) deliver 交付当前模块的解析好的描述符, ...
相关推荐
6. **测试报告**:Ant和TestNG会生成详细的HTML测试报告,显示每个测试用例的执行情况和结果。 7. **环境配置**:可能包括如何设置Ant属性来指定Selenium WebDriver的路径,以及如何配置不同的浏览器环境(如Chrome...
《Java测试新技术:TestNG和高级概念》介绍了Java测试的新技术,主要内容包括:基本概念、测试设计模式、企业级测试、Java EE测试、集成和扩展TestNG等。《Java测试新技术:TestNG和高级概念》通过针对有效测试Java...
1. **Ant**:Ant是Apache软件基金会开发的一款Java构建工具,主要用于管理Java项目。它通过XML配置文件(通常称为build.xml)来定义构建任务,如编译源代码、打包、运行测试等。Ant的工作方式是任务驱动,你可以...
JAVA测试新技术:TESTNG和高级概念 清晰版
Next Generation Java Testing: TestNG and Advanced Concepts. 纸质书售卖地址:...
综上所述,"eclipse-testng离线包"是为了在Eclipse中便捷地使用和管理TestNG测试框架而提供的离线安装资源,包含了Eclipse与TestNG集成所需的所有组件,帮助开发者高效地进行单元测试、集成测试和功能测试。
testng-6.9.4.jar 是最新jar包,亲测可用
单元测试 框架 testng6.8
博文链接:https://lighter.iteye.com/blog/184225
本文主要探讨了两个流行的Java测试框架——JUnit 4和TestNG,它们都是用于编写和执行自动化测试的工具。尽管JUnit 4引入了注解来提高测试的灵活性,但TestNG早在JUnit 4之前就已采用了注解,并且提供了更多高级特性...
TestNG是一个Java的框架,所以第一个要求是JDK要安装在你的机器上。 系统要求 JDK 1.5或以上 内存 没有最低要求 磁盘空间 没有最低要求 操作系统 没有最低要求 步骤1 -验证Java安装在你的机器上 现在,打开...
TestNG是Java编程语言中的一款强大且功能丰富的自动化测试框架,尤其在进行单元测试和集成测试时表现出色。"testng-6.10.jar"是TestNG的特定版本,即6.10版本的库文件,以Java Archive (JAR)格式封装,方便开发者在...
TestNG的"testng-6.7.jar"是这个框架的核心库文件,包含了所有必要的类和接口,使得开发者能够编写和执行各种测试用例。 `CommandLineArgs`类是TestNG中的一个重要组件,主要用于处理命令行参数。在执行TestNG测试...
描述中提到的“testng架包使用在java程序中”,意味着你需要将TestNG整合到你的Java项目中。以下是一些关键知识点: 1. **测试类和方法**:在TestNG中,测试类和方法使用特定的注解来标识。例如,`@Test`注解标记...
TestNG是Java编程语言中的一款强大的测试框架,与JUnit相比,它提供了更丰富的功能和更灵活的测试配置。TestNG-6.9.7源码分析将带我们深入理解其内部工作原理,这对于想要定制测试框架或者提升测试技能的开发者来说...
TestNG是Java编程语言中的一款高级测试框架,与JUnit相比,它提供了更多元化和强大的功能,尤其在并发测试和测试套件的组织方面。标题中的"testng-6.1.jar"指的是TestNG库的特定版本,即6.1版本的JAR文件。这个文件...