如何使用Ant在类别/套件中运行所有JUnit测试?

时间:2011-06-03 10:40:47

标签: java ant junit junit4

我在类似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注释的测试都会被执行,很好&平滑:

enter image description here

现在,我想用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)

2 个答案:

答案 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)。