我在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
属性有什么区别?我看过写一个简单的构建文件(特别是路径结构部分),但在那个手册中,我看起来像location
比path
更具体。从经验来看,情况似乎并非如此,但我也不太明白为什么。
看起来路径和位置之间的区别是多个条目vs一个条目。位置可以是文件或目录,路径可以是列表。
来自手册
location属性指定一个相对的文件或目录到项目的基目录(或绝对文件名),而属性接受以冒号或分号分隔的的位置。path属性用于预定义的路径——在任何情况下,都是带有location属性的多个元素
注意,ant使用的JVM与java任务使用的JVM几乎没有关系。默认情况下,ant的环境与通过ant启动java任务的环境不同。当您想要使用与ant想要使用的JVM不同的JVM时,这实际上是有帮助的,并且使事情显式,有助于避免以后的意外。
查看java任务的文档,特别是clonevm
clonevm:如果设置为true,则所有系统属性和派生的Java虚拟机的bootclasspath将与运行Ant的Java虚拟机。默认为"false"(如果fork禁用)。Ant 1.7