我在类似this answer中描述的设置中使用JUnit Categories和ClassPathSuite。回顾一下:
public interface FastTests {
}
@RunWith(Categories.class)
@Categories.IncludeCategory(FastTests.class)
@Suite.SuiteClasses(AllTests.class)
public class FastTestSuite {
}
@RunWith(ClasspathSuite.class)
public class AllTests {
}
... AllTests使用ClasspathSuite库。
属于FastTests类别的测试类看起来像这样:
@Category(FastTests.class)
public class StringUtilsTest {
// ...
}
当我在IDE中运行“FastTestSuite”时,所有使用FastTests注释的测试都会被执行,很好&平滑:
现在,我想用Ant做同样的事情。 (令我惊讶的是,我无法在SO上轻松找到相关说明。)换句话说,我需要一个使用FastTests注释运行所有测试的Ant目标。
我使用<test>
或<batchtest>
...
<junit showoutput="true" printsummary="yes">
<test name="fi.foobar.FastTestSuite"/>
<formatter type="xml"/>
<classpath refid="test.classpath"/>
</junit>
...但到目前为止没有运气。
编辑:除了IDE之外,它在命令行上与JUnitCore一起正常工作:
$ java -classpath "classes:WebContent/WEB-INF/lib/*" org.junit.runner.JUnitCore fi.foobar.FastTestSuite
.............
Time: 0.189
OK (13 tests)
答案 0 :(得分:14)
是的,我很简单地使用<batchtest>
:
<junit showoutput="true" printsummary="yes" fork="yes">
<formatter type="xml"/>
<classpath refid="test.classpath"/>
<batchtest todir="${test.reports}">
<fileset dir="${classes}">
<include name="**/FastTestSuite.class"/>
</fileset>
</batchtest>
</junit>
之前我曾尝试<batchtest>
,但在"**/FastTestSuite.java"
元素中使用"**/FastTestSuite.class"
代替<include>
犯了愚蠢的错误...抱歉:-)
NB :必须设置 fork="yes"
(即在单独的VM中运行测试);否则这也会在java.lang.reflect.Constructor.newInstance(Constructor.java:513)中产生“initializationError”,如<test>
(参见问题评论)。但是,即使使用<test>
,我也无法fork="yes"
工作。
唯一的缺点是这只产生一个JUnit XML报告文件(TEST-fi.foobar.FastTestSuite.xml),这使得它看起来像一个类中的所有(数百个)测试(FastTestSuite)。如果有人知道如何调整它以显示其原始类中的测试&amp;包裹,请告诉我。
答案 1 :(得分:2)
我找到了一种解决方法,可以使用ant的junit任务来运行特定Category
的测试:
<target name="test" description="Run Selenium tests by category">
<fail unless="category.name" message="Please specify 'category.name' property"/>
<junit showoutput="true" printsummary="true" fork="true">
<formatter type="xml"/>
<classpath refid="test.classpath"/>
<batchtest todir="${test.reports}" haltonfailure="false">
<fileset dir="${classes}">
<!-- regex '^\s*@Category' part added to ensure @Category annotation is not commented out -->
<containsregexp expression="^\s*@Category.*${category.name}"/>
</fileset>
</batchtest>
</junit>
</target>
通过向{ant}提供category.name
属性来执行测试:
ant -Dcategory.name=FastTests test
使用batchtest
还将为每个测试生成单独的JUnit XML报告文件(例如TEST-fi.foobar.FastTestClassN.xml)。