Проводим тесты JUnit параллельно

Если вы используете тесты Selenium или другие тесты на основе JUnit, для проведения которых необходим длительный период времени и немного ресурсов ЦП, однажды вы захотите сделать так, чтобы их можно было проводить одновременно. Хорошая новость в том, что это очень просто сделать, используя Apache Ant.

Именно поэтому меня очень удивляет то, что еще никто этого не делает. Большинство людей пытаются изобретать колесо и пробуют использовать другие фреймворки, например TestNG, пишут новые экспериментальные компьютерные классы для JUnit, или даже конфигурируемые версии этих классов. Все это – пустая трата времени для тех, кто просто хочет проводить несколько тестов сразу.

Вот как это можно сделать:

  1. Убедитесь, что у вас установлен пакет "ant-contrib". Как правило, достаточно, если соответствующий JAR файл находится в класспасе ant.
  2. Преобразуйте задачи библиотеки "ant-contrib". Вы можете сделать это, добавив следующие линии к вашему файлу "build.xml".
    {syntaxhighlighter brush: xml;fontsize: 100; first-line: 1; }<taskdef resource="net/sf/antcontrib/antcontrib.properties"/>{/syntaxhighlighter}
  3. Добавьте новую target, которая выполнит точно один тест. У вас будет что-то типа следующего.
    {syntaxhighlighter brush: xml;fontsize: 100; first-line: 1; }<target name="execute.test">

    <!-- we need to have relative path –>
    <pathconvert property=“test.source.relative”>
    <fileset file=“${test.source.absolute}” />
    <map from=“${test.sources}/” to=“” />
    </pathconvert>

    <!-- run one particular test –>
    <junit fork=“true” printsummary=“true”>

    &lt;classpath&gt;
      &lt;path refid="${test.classes}" /&gt;
    &lt;/classpath&gt;
    
    &lt;formatter type="xml" /&gt;
    
    &lt;batchtest todir="${test.reports}"&gt;
      &lt;fileset dir="${test.sources}"&gt;
        &lt;filename name="${test.source.relative}" /&gt;
      &lt;/fileset&gt;
    &lt;/batchtest&gt;
    

    </junit>

    </target>{/syntaxhighlighter}

  4. Теперь используйте встроенные возможности “foreach” для одновременного выполнения для того, чтобы выполнить эту цель. Вам понадобиться добавить что-то типа следующего к вашей другой цели.
    {syntaxhighlighter brush: xml;fontsize: 100; first-line: 1; }<foreach
    target=“execute.test”
    maxthreads=“5”
    inheritall=“true”
    inheritrefs=“true”
    parallel=“true”
    param=“test.source.absolute”>
    <path>
    <fileset dir=“${test.sources}”>
    <include name=“**/*.java”/>
    </fileset>
    </path>
    </foreach>{/syntaxhighlighter}
  5. Ну вот и все. Легко и просто. Все ваши тесты будут выполняться в 5 потоков. Вы можете использовать такое количество потоков, которое заходите. Нет никакой необходимости в дополнительных конфигурациях, классах, кодах.