Как обусловить тестирование GUI с использованием Netbeans / Maven и Maven при вызове командной строки - PullRequest
1 голос
/ 25 мая 2010

Я хотел бы иметь один проект pom, но мои GUI-тесты всегда запускаются при вызове JUnit в Netbeans, но они должны быть условными (для переменной среды?) При сборке в командной строке (обычно для работы сборка - на машине без головы, но иногда только для скорости сборки).

Я не против оборудовать свои тесты JUnit для этого, так как мне уже нужно настроить инфраструктуру для тестирования GUI, но как мне обусловить мой pom!

Netbeans 6.5 с плагином Maven.

Есть идеи, как мне это сделать?

Ilane

Ответы [ 3 ]

0 голосов
/ 25 мая 2010

Одним из решений будет использование профиля (который действительно может быть активирован переменной среды) и исключение тестов 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.

0 голосов
/ 05 июня 2010

Чтобы добиться желаемого поведения в моем проекте 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

0 голосов
/ 25 мая 2010

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

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

...