Как запустить все тесты JUnit в категории/наборе с помощью Ant?

Я использую категории JUnit и 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 {
    //  ...
}

Когда я запускаю "FastTestSuite" в моей среде IDE, все тесты с аннотацией FastTests выполняются, приятные и гладкие:

enter image description here

Теперь Я хочу сделать то же самое с Ant. (К моему удивлению, я не мог легко найти инструкции для этого на SO.) Другими словами, мне нужна цель Ant, которая запускает все тесты с помощью аннотации FastTests.

Я пробовал некоторые упрощенные подходы, используя <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)

Ответ 1

Правильно, я просто работал с <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" (т.е. запустить тесты в отдельной виртуальной машине); в противном случае это также даст "initializationError" в java.lang.reflect.Constructor.newInstance(Constructor.java:513), например <test> (см. комментарии к вопросу). Однако я не мог заставить <test> работать даже с fork="yes".

только недостаток заключается в том, что это создает только один файл отчета JUnit XML (TEST-fi.foobar.FastTestSuite.xml), который делает его похожим на то, что все (сотни) тестов находятся в одном классе (FastTestSuite). Если кто-нибудь знает, как настроить это, чтобы показать тесты в своих оригинальных классах и пакетах, пожалуйста, дайте мне знать.

Ответ 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>

Выполните тест, предоставив свойство category.name для ant следующим образом:

ant -Dcategory.name=FastTests test

Использование batchtest также приведет к отдельным отдельным файлам отчета JUnit XML для каждого теста (например, TEST-fi.foobar.FastTestClassN.xml).