Есть ли JUnit TestRunner для запуска групп тестов?

В настоящее время я использую JUnit 4 и мне нужно разделить мои тесты на группы, которые могут выполняться выборочно в любой комбинации. Я знаю, что TestNG имеет функцию аннотировать тесты, чтобы назначить их группам, но я не могу перейти на TestNG прямо сейчас. Кажется, это легко можно сделать в JUnit с некоторыми пользовательскими аннотациями и пользовательским JUnit TestRunner. Я проверил документы JUnit и обыскал в Интернете, но не смог найти такую ​​вещь. Кто-нибудь знает о таком TestRunner?

Обновление: Спасибо за ваши ответы в отношении наборов тестов. Я должен был рассмотреть их в моем первоначальном вопросе. Здесь мы идем: я не хочу использовать тестовые пакеты, потому что они потребуют от меня ручного создания и управления ими, что означает касаться ВСЕХ моих тестов и упорядочивать их в сюиты вручную (слишком много работы и кошмар для обслуживания). Все, что мне нужно сделать, это запустить все модульные тесты, за исключением нескольких, которые действительно являются интеграционными тестами. Поэтому я хочу аннотировать их и запускать все остальные. В других случаях я хочу просто запустить интеграционные тесты. Мне также нужно поставить unit test в несколько групп, что невозможно с наборами. Надеюсь, это поможет расчистить вещи.

Обновление 2: Если JUnit не имеет этого OOB, я ищу библиотеку с открытым исходным кодом, которая добавляет ее в JUnit (аннотации + пользовательский JUnit Test Runner).

Ответ 1

Отъезд Spring SpringJUnit4ClassRunner. Я использовал его для необязательного запуска тестов на основе свойства System, используя аннотацию IfProfileValue.

Это:

@IfProfileValue(name="test-groups", values={"unit-tests", "integration-tests"})
  public void testWhichRunsForUnitOrIntegrationTestGroups() {
      // ...
 }

Будет выполняться, если для тестовых групп свойств системы установлено значение "unit-tests" или "тесты интеграции".

Обновление: JUnitExt имеет аннотации @Category и @Prerequisite и выглядит так, как будто он должен делать то, что вам нужно. Тем не менее, я никогда не использовал его сам, поэтому я не могу ручаться за него.

Ответ 2

На данный момент у JUnit нет такого бегуна. Для решения основной проблемы необходимость получения разумной уверенности в тестовом наборе за ограниченный промежуток времени является нашим самым высоким приоритетом в области развития для следующего выпуска. Тем временем, реализация фильтра, который работает через аннотации, кажется, что это не будет большой проект, хотя я предвзятый.

Ответ 3

Во-первых, вы решаете две проблемы - модульные тесты (часто в том же пакете, что и тестируемый блок) и тесты интеграции. Обычно я использую свои интеграционные тесты в отдельном пакете, например com.example.project.tests. В eclipse мои проекты выглядят так:

project/
  src/
    com.example.project/
  tsrc/
    com.example.project/
    com.example.project.tests/

Щелчок правой кнопкой мыши по пакету и выбор 'run' запускают тесты в пакете; то же самое в исходной папке запускает все тесты.

Вы можете получить аналогичный эффект, хотя вы выразили в нем незаинтересованность, используя Suite runner. Однако это нарушает DRY - вы должны постоянно копировать имена тестов в классы классов. Однако вы можете легко выполнить один и тот же тест в нескольких наборах.

@RunWith(Suite.class)
@Suite.SuiteClasses( { 
    TestAlpha.class, 
    TestBeta.class })
public class GreekLetterUnitTests {
}

Конечно, я действительно должен держать эти вещи в автоматическом режиме. Хорошим способом для этого является использование задачи Ant.

<target name="tests.unit">
  <junit>
    <batchtest>
      <fileset dir="tsrc">
        <include name="**/Test*.java"/>
        <exclude name="**/tests/*.java"/>
      </fileset>
    </batchtest>
  </junit>
</target>
<target name="tests.integration">
  <junit>
    <batchtest>
      <fileset dir="tsrc">
        <include name="**/tests/Test*.java"/>
      </fileset>
    </batchtest>
  </junit>
</target>

Ответ 4

Нет, аналогичная концепция для групп TestNG, к сожалению, не существует. Это было запланировано для JUnit4, но по какой-то непонятной причине он был исключен из планирования.

Ответ 5

Вы можете создавать сюиты, хотя это ставит всю конфигурацию в набор, а не в аннотации.

Ответ 6

JUnit 3 позволяет создавать тестовые пакеты, которые можно запускать, как и любой другой тест. Не имеет ли аналогичная концепция JUnit 4?

Ответ 7

Если вы используете ANT или maven, вы можете контролировать, какие тесты запускаются, фильтруя тесты по имени. Немного неудобно, но это может сработать для вас.

Ответ 8

TestNG имеет мой голос. Он основан на аннотации, может работать как группы, одиночные тесты и т.д., Может быть связан с Maven и может запускать все тесты JUnit как часть его тестовых прогонов.

Я очень рекомендую его по JUnit.

Ответ 9

Мой совет - просто вырезать JUnit и использовать TestNG. Как только вы привыкнете к TestNG, Junit выглядит как каменный век.