Как обусловить тестирование GUI с использованием Netbeans/Maven и Maven при вызове командной строки
Я хотел бы иметь один проект pom, но мои GUI-тесты всегда запускаются при вызове JUnit в Netbeans, но они должны быть условными (для переменной среды?) При сборке в командной строке (обычно для производственной сборки) безголовая машина, но иногда просто для скорости сборки).
Я не возражаю против того, чтобы тестировать мои тесты JUnit для этого, так как мне уже нужно настроить инфраструктуру тестирования GUI, но как мне обусловить мой pom!
Netbeans 6.5 с плагином Maven.
Есть идеи, как мне это сделать?
Ilane
3 ответа
Чтобы добиться желаемого поведения в моем проекте Maven на Netbeans, я настроил профиль, определяющий переменную среды в pom моего проекта, и изменил действие Test file в свойствах моего проекта, чтобы активировать мой новый профиль. Таким образом, я мог проверить переменную окружения в моих тестах. (Это можно было бы сделать аналогично с системным свойством.)
Однако, чтобы избежать необходимости добавлять проверку к каждому тесту GUI, я обнаружил, что могу добавить фильтр JUnit, который будет автоматически игнорировать тесты UI в случае, когда я не хочу их запускать, и помещать число. пропущенных тестов в строке результатов теста.
Вот как выглядит мой профиль:
<Профиль> <Идентификатор> тест-гуй ID> <Построить> <Плагины> <Плагин> <Идентификатор_группы> org.apache.maven.plugins идентификатор_группы> <Артефакт> Maven-безошибочный-плагин артефакт> <Конфигурация>ложь skipTests> <> включает <Исключить> **/TestSuite.java исключить> > Включает True GUI_TEST> EnvironmentVariables> Конфигурация> Плагин> Плагины> Строительство> Профиль>
Вот описание того, как обновить действие Netbeans:
(Щелкните правой кнопкой мыши проект в окне "Проекты") -> Свойства В поле "Категории" выберите "Действия". В поле "Действия" выберите "Тестовый файл". В текстовом поле "Активировать профили" введите "test-gui" Нажмите кнопку "ОК", чтобы сохранить.
Чтобы добавить фильтр JUnit (и документация была редкой, так что я, возможно, не сделал это наиболее эффективным способом), я поместил в подкласс тестовый запускаемый по умолчанию TestClassRunner и заставил его вызвать мой фильтр, который проверяет имя теста и переменную среды, Чтобы JUnit позвонил в мой класс, я прокомментировал тестовый класс.
public class GUITestClassRunner extends TestClassRunner {
public GUITestClassRunner(Class klazz) throws InitializationError {
super(klazz);
}
public GUITestClassRunner(Class klazz, Runner runner)
throws InitializationError, NoTestsRemainException {
super(klazz, runner);
}
@Override
public void run(RunNotifier notifier) {
if (getDescription().testCount() > 0) {
try {
filter(new GUIFilter(notifier));
} catch (NoTestsRemainException ex) {
Description description = getDescription();
notifier.fireTestStarted(description);
notifier.fireTestIgnored(description);
notifier.fireTestFinished(description);
return;
}
}
super.run(notifier);
}
class GUIFilter extends Filter {
private boolean isGUI = false;
private RunNotifier notifier;
public GUIFilter(RunNotifier notifier) {
this.notifier = notifier;
isGUI = UI.isGUITestEnvironment();
}
@Override
public boolean shouldRun(Description desc) {
if (!isGUI && UI.isGUITest(desc.getDisplayName())) {
Description description = getDescription();
notifier.fireTestStarted(description);
notifier.fireTestIgnored(description);
notifier.fireTestFinished(description);
return false;
}
return true;
}
@Override
public String describe() {
return "all tests except GUI tests if headless";
}
}
}
Чтобы вызвать этого бегуна, тестовый класс должен быть аннотирован:
@RunWith(GUITestClassRunner.class)
public class MyJUnitTestClass
{
....
@Test
public void testAlpha() {...}
@Test
public void testBeta_UI() {...}
}
Итак, теперь из Netbeans я просто запускаю свой класс модульных тестов, и тесты GUI запускаются автоматически. Я могу запустить из командной строки без установленных переменных окружения или GUI_TEST со значением false, и мои тесты GUI пропускаются, или я могу запустить из командной строки с GUI_TEST со значением true, или использовать mvn -Ptest-gui
и все мои тесты GUI запускаются.
Я искренне благодарен Брайану и Паскалю за то, что они указали мне правильное направление.
Ilane
Одним из решений будет использование профиля (который действительно может быть активирован переменной среды) и исключение тестов GUI из Maven Surefire Plugin
конфигурация с использованием excludes
в этом профиле на основе соглашения об именах. Что-то вроде этого:
<profile>
<id>headless</id>
<activation>
<property>
<name>env.FOO</name>
<value>foo</value>
</property>
</activation>
...
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.5</version>
<configuration>
<excludes>
<exclude>**/*$*</exclude><!-- to exclude inner classes -->
<exclude>**/gui/**</exclude>
</excludes>
</configuration>
</plugin>
...
</plugins>
</build>
</profile>
Другой вариант будет использовать TestNG и использовать excludeGroups
параметр.