Существует ли JUnit TestRunner для запуска групп тестов? - PullRequest
14 голосов
/ 30 сентября 2008

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

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

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

Ответы [ 9 ]

11 голосов
/ 30 сентября 2008

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

6 голосов
/ 30 сентября 2008

Проверьте Spring's SpringJUnit4ClassRunner . Я использовал его для опционального запуска тестов, основанных на свойстве System, используя аннотацию IfProfileValue .

Это:

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

Запустится, если системное свойство 'test-groups' установлено в 'unit-tests' или 'интеграционные тесты'.

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

3 голосов
/ 30 сентября 2008

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

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

Щелчок правой кнопкой мыши по пакету и выбор «запустить» запускает тесты в пакете; выполнение того же действия с исходной папкой запускает все тесты.

Подобный эффект можно получить, хотя вы проявили к нему интерес, с помощью 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>
1 голос
/ 30 сентября 2008

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

0 голосов
/ 12 января 2009

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

0 голосов
/ 30 сентября 2008

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

Я настоятельно рекомендую его вместо JUnit.

0 голосов
/ 30 сентября 2008

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

0 голосов
/ 30 сентября 2008

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

0 голосов
/ 30 сентября 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...