Ant执行顺序异常:期望先运行ExceuteLeadTest.class却先执行ExceuteContactTest.class
如何让Ant按指定顺序执行测试类?
我明白你现在遇到的问题——明明在build.xml里写了先处理ExecuteLeadTest.class再处理ExecuteContactTest.class,结果实际执行顺序完全反过来了,这确实挺闹心的。
先说说你原来配置的问题:你直接在<target>里放<include>标签是无效的,<include>本身不是用来执行类的,它通常是配合<fileset>这类元素来筛选文件,但即使这么用,文件的执行顺序也会依赖文件系统的排序,而不是你写<include>的顺序。
那怎么才能严格按你想要的顺序执行呢?这里有两种靠谱的方法:
方法一:为每个测试类单独编写执行任务(最直接)
这种方法不需要额外依赖,顺序完全由你掌控,就是把每个测试类的执行拆成单独的<java>任务,按你想要的顺序排列就行。修改后的build.xml大概是这样:
<project> <!-- 先保留你的编译目标,这里假设你有编译逻辑,比如把src下的代码编译到bin目录 --> <target name="compile"> <javac srcdir="src" destdir="bin"/> </target> <target name="run" depends="compile"> <!-- 先执行ExecuteLeadTest --> <java classname="testScript.ExecuteLeadTest" classpath="bin"/> <!-- 再执行ExecuteContactTest --> <java classname="testScript.ExecuteContactTest" classpath="bin"/> </target> </project>
这样Ant会严格按照你写的<java>任务顺序执行,先跑ExecuteLeadTest,跑完再跑ExecuteContactTest,完全不会乱序。
方法二:用<filelist>保证顺序(适合测试类较多的情况)
如果你有很多测试类,不想一个个写<java>任务,可以用<filelist>来定义严格顺序的文件列表,再配合循环执行。不过这个方法需要用到Ant Contrib库的<foreach>任务,你得先确保你的Ant环境里有这个库。
修改后的配置示例:
<project> <target name="compile"> <javac srcdir="src" destdir="bin"/> </target> <target name="run" depends="compile"> <!-- 用filelist严格定义执行顺序 --> <filelist id="testClasses" dir="bin"> <file name="testScript/ExecuteLeadTest.class"/> <file name="testScript/ExecuteContactTest.class"/> </filelist> <!-- 循环执行每个测试类 --> <foreach list="${toString:testClasses}" param="classfile" target="runSingleTest"/> </target> <!-- 单独的执行单个测试类的目标 --> <target name="runSingleTest"> <!-- 把class文件路径转换成类名(比如testScript/ExecuteLeadTest.class -> testScript.ExecuteLeadTest) --> <pathconvert property="className" dirsep="."> <path location="${classfile}"/> <mapper type="glob" from="*.class" to="*"/> </pathconvert> <java classname="${className}" classpath="bin"/> </target> </project>
<filelist>会严格按照你定义的顺序返回文件,所以循环执行的时候也会保持这个顺序。
总的来说,第一种方法最简单直接,不需要额外依赖,也最容易维护,推荐你优先用这个方案。
内容的提问来源于stack exchange,提问作者Jolly Priya
相关产品推荐
相关产品推荐

