【问题标题】:Change working directory in ant junit task更改ant junit任务中的工作目录
【发布时间】:2011-05-20 23:46:35
【问题描述】:

我有一个运行 JUnits 测试的 ant 文件。这些测试依赖于某些配置文件的相对路径。我尝试设置批处理测试的工作目录,但失败了。

我希望工作目录为${plugins.dir}/${name}

ant 脚本的 JUnit 部分:

<junit haltonfailure="no" printsummary="on" fork="true" showoutput="true" dir="${plugins.dir}/${name}">
    <jvmarg value="-Duser.dir=${plugins.dir}/${name}"/>
    <classpath> 
        <path refid="project.classpath"/>
        <pathelement location="${plugins.dir}/${dependency}/@dot/"/>
        <pathelement location="${plugins.dir}/${name}/" />
    </classpath>
    <formatter type="xml" />
    <sysproperty key="basedir" value="${plugins.dir}/${name}"/>
    <sysproperty key="dir" value="${plugins.dir}/${name}"/>
    <batchtest todir="${junit.output}">
        <fileset dir="${dir}"> 
            <include name="**\*AllTests.class" />
        </fileset>
    </batchtest>
</junit>

我用谷歌搜索过,但我发现的解决方法是设置“dir”、“sysproperty”或“jvmarg”。如您所见,我已经尝试了所有方法:)

有没有办法打印标签中的当前目录?它不支持。这将允许我验证目录是否实际更改以及更改为什么。

这个等式中的一个通配符是它在 Hudson 中运行,它启动了一个启动 antrunner 的 eclipse 进程。这样我们就可以同时运行 junit 和 eclipse 插件 junit 测试。应该与我认为的问题无关。

【问题讨论】:

  • 不可能简单地修复您的测试以使其独立吗?例如。如果您需要的资源放在类路径中的某个位置,则可以改为通过getClass().getResource(String) 加载它们。
  • @Mark peters,是的,这是可能的。但这涉及更新大约 400-500 个测试,所以我更愿意考虑 B 计划。

标签: java ant junit hudson


【解决方案1】:

我正在使用 NetBeans。当我添加到 Ant 属性(来自工具、选项、Java、Ant)work.dir=C:/MyWorkingDir/ 时,它会使用以下命令执行 ant 并将工作目录更改为 C:\MyWorkingDir

ant -f D:\\workspace\\lib\\project -Dfork=true -Djavac.includes=com/myapp/MyTest.java -Dtest.includes=com/myapp/MyTest.java "-Dwork.dir=C:/MyWorkingDir/" test-single

【讨论】:

    【解决方案2】:

    我有同样的情况,在我的情况下,我看到如果在同一个 jvm 中运行,dir="...." 会被忽略,所以我只是添加了fork='true' 并且它起作用了。

    引用 Apache 的文档站点“dir - 调用 VM 的目录。如果 fork 被禁用,则忽略。”。更多here

    【讨论】:

    • 并且不要忘记在批处理测试部分使用 fork="true",因为它会覆盖 junits fork 属性。这对我有用。
    【解决方案3】:

    我认为您设置 basedir 属性是正确的(请参阅projects attributes)。但是,因为它是 ANT(而不是 JVM)的属性,所以它是只读的!

    调用ant任务时设置basedir会影响其他目标吗?见Command Line reference

    ant -Dbasedir=somedir
    

    或者,跨越一个新的 ant 进程来调用您的 junit 目标。请参阅AntCall taskAnt task。以下示例假定 junit 目标包含您的 junit 任务。我将此任务用于其他属性(到目前为止从未需要 basedir 属性。

    <antcall target="junit">
      <param name="basedir" value="${plugins.dir}/${name}"/>
    </antcall>
    
    <ant dir="${plugins.dir}/${name}" target="junit" />
    

    【讨论】:

    • 谢谢。我还没有时间尝试这个,但它似乎至少可以解决我的一些问题,所以我将其标记为答案。
    猜你喜欢
    • 1970-01-01
    • 2014-12-06
    • 1970-01-01
    • 2011-04-03
    • 1970-01-01
    • 2011-10-05
    • 1970-01-01
    • 2019-01-11
    • 1970-01-01
    相关资源
    最近更新 更多