1

我需要执行的目标很少。我创建了一个目标来命名所有这些,但我认为这不是这样做的方法吗?这是调用所有其他目标的目标运行:

<target name="test.all" depends="build
echolaunching agent /echo
antcall target="RunJtfTests" /
antcall target="launchOpenAgent" /
antcall target="run.test" //target
target name="run.test" depends="build, launchOpenAgent, runJtfTests"
echo Launching test/echo
echo message="${toString:iControlSilk4J.classpath}" /
  <java classname="com.miranda.icontrol.silk4j.installation.AdministrationCtrl"
classpath><fileset dir="${lib.dir}"
include name="**/*.jar" />
/fileset
pathelement path="${iControlSilk4J.classpath}" /
pathelement location="${jarPath}/Admin.jar" /
/classpath
  </java>
</target>

它没有运行,我这样做是为了得到报告,但我什么也没得到?怎么了 ?根据我的阅读,antcall 就像一个不好的 goto 循环。我想改为调用测试。

-> 以下是我要执行的所有测试:

  • 在里面
  • 干净的
  • AdministrationCtrl.Rollback
  • AdministrationCtrl.LatestInstallation
  • AdministrationCtrl.BackupiControl,
  • AdministrationCtrl.ChangeService
  • AdministrationCtrl.DefaultSetting
  • AdministrationCtrl.InitFailOver
  • AdministrationCtrl.RunDensite2Service
  • AdministrationCtrl.RunDensiteService
  • AdministrationCtrl.RunGSMService
  • AdministrationCtrl.RunLoudnessAnalyzerService
  • AdministrationCtrl.RunLoudnessLoggerService
  • AdministrationCtrl.RunRouterManagerService
  • AdministrationCtrl.RunttyR0Service
  • AdministrationCtrl.RunVirtualService
  • AdministrationCtrl.RestoreBkp

但这可以更通用(关于我将在 Silk4J 中添加的测试)。有没有更通用的方法?

4

1 回答 1

8

跟着我重复:

Ant 不是一种编程语言。它是一种依赖矩阵语言。

这是一个重要的区别。你不告诉 Ant 执行什么。你告诉 Ant 你需要什么,Ant 会弄清楚该怎么做。

我可以告诉你在所有这些方面都无法理解 Ant <antcall/>。这是一个禁忌,因为它可以让你多次执行任务。您的构建文件也没有任何意义。

使用目标的dependency参数。例如,这是一个骨架build.xml文件:

<project>
    <target name="clean"/>

    <target name="prepare"/>

    <target name="compile"
        depends="prepare"/>

    <target name="package"
         depends="compile"/>

    <target name="test-compile
         depends="compile"/>

    <target name="test"
         depends="test-compile"/>

    <target name="deploy"
         depends="package"/>

    <target name="post-test-results"
         depends="test"/>

    <target name="all"
         depends="clean,post-test-results,deploy"/>
</project>

当我想运行我的目标all时,我主要是指我想做一个干净的构建,发布我的测试结果,然后部署构建。Makefile 也是如此。我没有列出我所有的任务。我为什么要关心我是否为编译做准备工作?这不关我的事。

所以我打电话给 , all,那将调用clean,post-test-resultsdeploy。除了调用这三个目标之外,我不知道 Ant 会做什么。

等等...我需要做什么才能发布我的测试结果?好吧,我可能需要运行我的测试。test因此,我对我的post-test-results目标有依赖。但是,为了运行我的测试,我可能必须编译它们。所以,test-compile对我的test目标有依赖性。

为了编译我的测试,我依赖于常规的 Java 代码。因此,test-compile将取决于compile. 为了编译,我必须准备。也许那是构建必要的结构,或者下载所需的 jar。之前就是这么叫的compile。现在,我可以部署了。但是,在我可以部署之前,我需要打包我的部署。所以,deploy取决于package.

包本身取决于compile,但我的compile-test. 由于我已经调用了compile,我的package目标不必这样做。它所要做的就是打包已经编译好的类文件。

因此,我可能会按此顺序执行以下目标:

  • 干净的
  • 准备
  • 编译
  • 测试编译
  • 后测结果
  • 包裹
  • 部署

我的all目标确实命中了我所有的其他目标,但我不必将它们全部列为依赖项或强制它们通过<antcall/>s 构建。

看来您需要了解 Ant 及其工作原理。您的示例 Ant 文件根本无效。Ant 使用 XML 样式结构。所有任务都是 XML 样式的实体。

幸运的是,有很多关于 Ant 的好书。我会推荐 Manning 的Ant in Action作为一个很好的起点。

您会发现其中一件事是您可以在单个<junit>任务中指定成批的 junit 测试。这可以通过任务上<batchtest>的一个或多个子实体来<junit>完成。将<batchtest>运行与特定条件匹配的所有分类。您还可以在任务上使用<test>子实体。子实体允许您指定要运行的单个类文件<junit><test>很多时候,这些类文件可能只是简单地调用一组指定的其他 Junit 分类。这样,开发人员可以指定要运行哪些测试以及要跳过哪些测试。

您可以通过使用属性而不是通过创建数十个测试任务来控制运行或不运行哪些测试。这允许您指定测试集,而无需生成多个 JUnit 进程。

于 2013-10-29T21:56:55.217 回答