Запуск всех тестов из категории @ с помощью Maven - PullRequest
6 голосов
/ 11 февраля 2011

Я хочу запустить только подмножество моих модульных тестов, определенных определенным @Category.

Итак, я прочитал несколько ТАК вопросов, таких как этот (именно это я и ищу), а также этот .

Похоже, что решение моей проблемы обеспечивается проектом ClasspathSuite . Поэтому я начал писать интерфейсы NewTest и OldTest, которые будут определять мои тестовые категории. Затем я создал AllTests suite:

@RunWith(ClasspathSuite.class)
public class AllTests { }

После этого я создал AllNewTests suite:

@RunWith(Categories.class)
@IncludeCategory(NewTest.class)
@SuiteClasses( { AllTests.class })
public class AllNewTests { }

Наконец, я создаю два класса JUnit, по одному на категорию:

@Category(NewTest.class)
public class SomeNewTests {
    // some tests...
}

@Category(OldTest.class)
public class SomeOldTests {
    // some tests...
}
<Ч />

Теперь, если я запускаю AllTests , Eclipse запускает все тесты моего проекта, в то время как Maven дает сбой, так как тесты не найдены:

mvn test -Dtest=AllTests

...
-------------------------------------------------------
 T E S T S
-------------------------------------------------------
Running my.company.AllTests
Tests run: 0, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.093 sec
There are no tests to run.

Если я запускаю AllNewTests (что правильно делать, верно?), В Eclipse все нормально (то есть он запускает только тесты, помеченные @Category(NewTest.class)), но Maven возвращает ошибка :

mvn test -Dtest=AllNewTests

...
-------------------------------------------------------
 T E S T S
-------------------------------------------------------
Running my.company.AllNewTests
Tests run: 1, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 0.125 sec <<< FAILURE!

Results :

Tests in error:
  initializationError(my.company.AllNewTests)

Tests run: 1, Failures: 0, Errors: 1, Skipped: 0

[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------

Исключением является следующее:

org.junit.runner.manipulation.NoTestsRemainException
    at org.junit.runners.ParentRunner.filter(ParentRunner.java:256)
    at org.junit.experimental.categories.Categories.<init>(Categories.java:142)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
    at org.junit.internal.builders.AnnotatedBuilder.buildRunner(AnnotatedBuilder.java:35)
    at org.junit.internal.builders.AnnotatedBuilder.runnerForClass(AnnotatedBuilder.java:24)
    at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57)
    at org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:29)
    at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57)
    at org.junit.internal.requests.ClassRequest.getRunner(ClassRequest.java:24)
    at org.apache.maven.surefire.junit4.JUnit4TestSet.execute(JUnit4TestSet.java:33)
    at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:146)
    at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:97)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.apache.maven.surefire.booter.ProviderFactory$ClassLoaderProxy.invoke(ProviderFactory.java:103)
    at $Proxy0.invoke(Unknown Source)
    at org.apache.maven.surefire.booter.SurefireStarter.invokeProvider(SurefireStarter.java:145)
    at org.apache.maven.surefire.booter.SurefireStarter.runSuitesInProcess(SurefireStarter.java:70)
    at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:69)
<Ч />

Мой вопрос, что я сделал не так?

<Ч />

Технические подробности: Java 6, Maven 3.0.2, JUnit 4.8.1, плагин Surefire 2.7.1, cpsuite-1.2.5

Ответы [ 3 ]

6 голосов
/ 16 декабря 2011

В качестве обновления: начиная с плагина Surefire v2.11, теперь поддерживаются категории стилей JUnit 4.8+.

В примечаниях к выпуску для Surefire v2.11 упоминается новая функция. Цели теста «Верный огонь:» настраиваются с использованием групп .

4 голосов
/ 15 апреля 2011

Я решил свою проблему, создав свой собственный JUnit Runner, который расширяет Suite.

Идея близка к принципу проекта Classpath Suite, то есть поиск классов, существующих в classpath, и сохранение только тех, которые снабжены данной аннотацией (например, @NewTest).

Если вам интересно, вы можете прочитать полный текст в моем блоге .

1 голос
/ 23 апреля 2014

После прочтения некоторых постов в блоге и вопросов о stackoverflow, я наконец смог выполнить эту работу с плагином surefire, как ответил пользователь 1034382.В моем случае с версией 2.17 maven-surefire-plugin.

Просто чтобы добавить мои два цента, более свежее объяснение можно найти здесь: Использование категорий JUnit для группировки тестов

Но вы можете запустить со следующей проблемой плагинов безошибочного:

[ERROR] java.lang.RuntimeException: Unable to load category:

Это может быть исправлено с помощью этого другого вопроса / ответа стекопотока: Где я должен поместить класс интерфейса для Junit@Category?

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

...