Как обусловить тестирование 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 в случае, когда я не хочу их запускать, и помещать число. пропущенных тестов в строке результатов теста.

Вот как выглядит мой профиль:

      <Профиль>
          <Идентификатор> тест-гуй 
          <Построить>
              <Плагины>
                  <Плагин>
                    <Идентификатор_группы> org.apache.maven.plugins 
                    <Артефакт> Maven-безошибочный-плагин 
                    <Конфигурация>
                       ложь 
                      <> включает
                        <Исключить> **/TestSuite.java 
                       Включает
                       
                         True 
                      
                    
                  
                
              
      

Вот описание того, как обновить действие 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 параметр.

Плагин Surefire может указывать, какие тесты запускать.

Вы можете указать разные наборы для запуска для разных профилей и выбрать свой профиль с помощью -P{profilename},

Другие вопросы по тегам