Чтобы добиться желаемого поведения в моем проекте Maven на Netbeans, я настроил профиль, определяющий переменную среды в pom моего проекта, и изменил действие Test file в свойствах моего проекта, чтобы активировать мой новый профиль. Таким образом, я мог проверить переменную окружения в моих тестах. (Это можно было бы сделать аналогично с системным свойством.)
Чтобы избежать необходимости добавлять проверку к каждому тесту GUI, я обнаружил, что могу добавить фильтр JUnit, который будет автоматически игнорировать тесты UI в случае, когда я не хочу их запускать, и укажите количество пропущенных тестов в строке результатов теста.
Вот как выглядит мой профиль:
<profile>
<id>test-gui</id>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<skipTests>false</skipTests>
<excludes>
<exclude>**/TestSuite.java</exclude>
</excludes>
<environmentVariables>
<GUI_TEST>true</GUI_TEST>
</environmentVariables>
</configuration>
</plugin>
</plugins>
</build>
</profile>
Вот описание того, как обновить действие Netbeans:
(Right click on project in Projects window)->Properies
In Categories box, select 'Actions'
In Actions box, select 'Test file'
In Activate Profiles textfield, enter 'test-gui'
Click 'OK' button to save.
Чтобы добавить фильтр 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