论坛首页 Java企业应用论坛

关于build tool的构想--从ant说起

浏览 26900 次
该帖已经被评为精华帖
作者 正文
   发表时间:2005-07-13  
Readonly 写道
ajoo 写道

不知道大家有过这个经验没有?我有100个test case,我希望一个test target运行着100个test case,但是有时候为了调试某个问题,我可能希望能够单独运行一个test case。

晕啊, 原来你的yan里面ant脚本扔那么多的target是这个缘故??
你不会用运行期属性来指定么?
	<target name="junitall" depends="clean, build" description="Run all unit test">
		<junit fork="yes" haltonfailure="yes">
			<batchtest fork="yes" todir="${test.dir}/report">
				<fileset dir="${test.dir}" includes="**/*Test.class" excludes="**/*AbstractTest.class"/>
			</batchtest>
		</junit>    
	</target>

	<target name="junitone" depends="clean, build" description="Run single unit test">
		<fail unless="test.name">
			You must specify a test.name using -Dtest.name=NAME
        </fail>	
        <echo level="info">Starting a signle unit test named '${app.name}'...</echo>
        <junit>
          <test name="${test.name}"/>
        </junit>
	</target>


运行:
ant junitone -Dtest.name=com.mycomp.test.MyTest

是啊。因为我不会用junit这个task嘛。我从来都是调用java。嘿嘿。
同样因为懒得学那么多task,所以才希望每个task都最最简单,task个数也尽量少,然后用脚本组合起来实现复杂功能。
而不是每一个稍微不同点的功能都要去找新的Task。
0 请登录后投票
   发表时间:2005-07-13  
ajoo 写道

ant也是,import会不分青红皂白地把target名字都import进来,这也就意味着你需要对被import的xml文件内部有多少target很清楚。耦合呀。
为什么java, c++这些语言都有私有变量?为什么它们支持以对象为名字空间?为什么obj1.x()和obj2.x()是两个不同的函数调用?
ant这么做,是不得已,但是不可否认,这个import机制相当简陋。代码重用也不是这么个重用法。又回到c++的简陋的#include及至了。


这个import和include当然有很大不同了。
首先,project的重用最重要的部分就是target的重用,本来就是奔着common.xml中的target去的. 就好像你要继承一个类,本来就需要知道父类的一些东西。只不过这里的target都是 public而已。
第二个,target是可以被重新定义的,而且可以你所谓的名字空间的方式调用。比如某个project中在import xxx之后又定义了yyy,而xxx之中也有yyy,此时,可以用xxx.yyy来引用
0 请登录后投票
   发表时间:2005-07-13  
ajoo 写道
是啊。因为我不会用junit这个task嘛。我从来都是调用java。嘿嘿。
同样因为懒得学那么多task,所以才希望每个task都最最简单,task个数也尽量少,然后用脚本组合起来实现复杂功能。
而不是每一个稍微不同点的功能都要去找新的Task。


为了单独测试,别人只是用了junit Task.
而neptune却需要做很多基础工作
 "tests.jfun.parsec.TestColoring", 
  "tests.jfun.parsec.TestLexer","tests.jfun.parsec.TestParser", 
  "tests.jfun.parsec.TestRfc822", "tests.jfun.parsec.TestSqlParser" 
  ]; 
  make_tests = import "${properties.neptune.home}/scripts/neptune.np" 
          .make_tests; 
 ]; 

需要在脚本中把所有的那些testcase都罗列一边,这个是不能忍受的。最好也用一个patten来搞定。
否则,每加一个testcase或者重构一下名字就需要改动配置脚本,这个脚本的稳定性也太差了。
0 请登录后投票
   发表时间:2005-07-13  
Readonly 写道
晕啊, 原来你的yan里面ant脚本扔那么多的target是这个缘故??
你不会用运行期属性来指定么?
	<target name="junitall" depends="clean, build" description="Run all unit test">
		<junit fork="yes" haltonfailure="yes">
			<batchtest fork="yes" todir="${test.dir}/report">
				<fileset dir="${test.dir}" includes="**/*Test.class" excludes="**/*AbstractTest.class"/>
			</batchtest>
		</junit>    
	</target>

	<target name="junitone" depends="clean, build" description="Run single unit test">
		<fail unless="test.name">
			You must specify a test.name using -Dtest.name=NAME
        </fail>	
        <echo level="info">Starting a signle unit test named '${app.name}'...</echo>
        <junit>
          <test name="${test.name}"/>
        </junit>
	</target>


运行:
ant junitone -Dtest.name=com.mycomp.test.MyTest


其实maven的处理更加简单:
maven -Dtestcase=..... test:single

这样就搞定了,不需要对配置文件本身做任何改动
0 请登录后投票
   发表时间:2005-07-13  
charon 写道
ajoo 写道
是啊。因为我不会用junit这个task嘛。我从来都是调用java。嘿嘿。
同样因为懒得学那么多task,所以才希望每个task都最最简单,task个数也尽量少,然后用脚本组合起来实现复杂功能。
而不是每一个稍微不同点的功能都要去找新的Task。


为了单独测试,别人只是用了junit Task.
而neptune却需要做很多基础工作
 "tests.jfun.parsec.TestColoring", 
  "tests.jfun.parsec.TestLexer","tests.jfun.parsec.TestParser", 
  "tests.jfun.parsec.TestRfc822", "tests.jfun.parsec.TestSqlParser" 
  ]; 
  make_tests = import "${properties.neptune.home}/scripts/neptune.np" 
          .make_tests; 
 ]; 

需要在脚本中把所有的那些testcase都罗列一边,这个是不能忍受的。最好也用一个patten来搞定。
否则,每加一个testcase或者重构一下名字就需要改动配置脚本,这个脚本的稳定性也太差了。

呵呵。我不是不知道junit task吗?不要忘了,任何ant的task,neptune都可以直接调用。所以就算我的方法笨(恩,确实比较笨),也不妨碍你用junit task呀。
0 请登录后投票
   发表时间:2005-07-14  
ajoo,为啥要用script去调用ant task,而不是写一个ant task去支持script呢:
    &lt;target name="runscript"&gt;
        &lt;!-- Run beanshell script in file--&gt;
        &lt;script language="beanshell" src="myscript.bsh"/&gt;

        &lt;!-- Run jaskell script in-line --&gt;
        &lt;script language="jaskell"&gt;&lt;![CDATA[
            auto (info.println "build done") $
            do {time=now} $
            info.println ("build starting at " + time)  &gt;&gt;
            do {t1 = readFile "file1"} $
            do {t2 = readFile "file2"} $
            let
              diff = t2 - t1;
              writeFile "file3" diff
            end
        ]]&gt;&lt;/script&gt;
    &lt;/target&gt;
0 请登录后投票
   发表时间:2005-07-14  
应该说用ant来调用script也是可以实现的。

不过,意义有多大呢?

script调ant,是把ant的task当作作基本底层工作的元件。

script本身自己不见得提供这些copy, javac, java这些功能。

(当然,可以用Command接口实现,但没什么意义这么做)

script的主要作用就是胶水,把各个不同的task, command组合在一起。

都是胶水组合零件,很少听说零件要用到胶水的。


更何况,我本身是讨厌xml的,自然希望用script彻底取代xml了。
0 请登录后投票
   发表时间:2005-07-18  
也许可以参考下Maven 2
Maven 2的脚本改为用script进行编写了
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics