我在TestNG中使用Ant Java任务运行Selenium单元测试,如下所示:
<java classpathref="runtime.classpath"
classname="org.testng.TestNG"
failonerror="false">
<arg value="-d" />
<arg value="${grid.location}/target/reports" />
<arg value="${lib.location}/testng.xml"/>
</java>
runtime.classpath
是一个包含<pathelement path="${basedir}/target/classes/" />
的路径式结构,我认为需要让TestNG知道要运行哪些类。
<path id="runtime.classpath">
...
<!-- Target classes -->
<pathelement path="${basedir}/target/classes/" />
</path>
但是,我在日志中一直看到TestNG找到了0个适用的类。
我最终得到了一位同事的帮助,看来这是关键变化:
<path id="runtime.classpath">
...
<!-- path attribute changed to location -->
<pathelement location="${basedir}/target/classes/" />
</path>
这也正确地引入了测试类:
<java classpathref="runtime.classpath"
classname="org.testng.TestNG"
failonerror="false">
<arg value="-d" />
<arg value="${grid.location}/target/reports" />
<arg value="${lib.location}/testng.xml"/>
<classpath>
<pathelement location="${basedir}/target/classes/" />
</classpath>
</java>
path
和location
属性有什么区别?我查看了Writing a Simple Buildfile(特别是类路径结构部分),但在该手册中,我认为location
比path
更具体。这似乎不是凭经验,但我无法弄清楚原因。
答案 0 :(得分:8)
看起来路径和位置之间的差异是许多条目与一个条目。位置是文件或目录,路径可以是列表。
来自manual
location属性指定单个文件或目录相对 到项目的基目录(或绝对文件名),而 path属性接受以冒号或分号分隔的列表 位置。 path属性旨在与预定义一起使用 paths - 在任何其他情况下,具有位置属性的多个元素 应该是首选。
请注意,ant使用的JVM与java任务使用的JVM几乎没有关系。默认情况下,ant的环境与通过ant的java任务启动的环境不同。当你想要使用一个蚂蚁想要使用的不同JVM并使事情变得明确时,这实际上是有用的,有助于避免以后出现意外。
查看java task的文档,特别是clonevm
clonevm:如果设置为true,则表示所有系统属性和 分叉的Java虚拟机的bootclasspath将是相同的 那些运行Ant的Java VM。默认为“false”(如果fork则忽略) 被禁用)。自Ant 1.7