Как использовать тесты maven и jUnit вместе? - PullRequest
6 голосов
/ 29 декабря 2010

У меня есть приложение gwt, созданное в Maven, теперь я попытался запустить простой тест GWT, как показано ниже:

public class GwtTestLaughter extends GWTTestCase {

  /**
   * Specifies a module to use when running this test case. The returned
   * module must include the source for this class.
   * 
   * @see com.google.gwt.junit.client.GWTTestCase#getModuleName()
   */
    @Override
    public String getModuleName() {
        return "com.sample.services.joker.laughter.Laughter";
    }

    /**
     * Add as many tests as you like
     */
    public void testSimple() {
        assertTrue(true);
    }
}

и в файле pom.xml сконфигурировали gwt-maven-plugin и maven-surefire-plugin как показано ниже:

  <plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>gwt-maven-plugin</artifactId>
    <version>2.1.0-1</version>
    <configuration>
      <!-- Use the 'war' directory for GWT hosted mode -->
      <output>${basedir}/war</output>
      <webXml>${basedir}/war/WEB-INF/web.xml</webXml>
      <runTarget>index.html</runTarget>
      <!-- Make sure the GWT compiler uses Xerces -->
  <extraJvmArgs>
    -Dgwt.style=DETAILED -Xmx512M -Xss1024k -XX:MaxPermSize=128m -Djavax.xml.parsers.DocumentBuilderFactory=org.apache.xerces.jaxp.DocumentBuilderFactoryImpl -Djavax.xml.parsers.SAXParserFactory=org.apache.xerces.jaxp.SAXParserFactoryImpl -Dlogback.configurationFile=./src/test/resources/logback-test.xml
  </extraJvmArgs>
</configuration>
<executions>
  <execution>
    <goals>
      <goal>compile</goal>
      <goal>test</goal>
    </goals>
  </execution>
</executions>

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <configuration>
       <useFile>false</useFile>
       <forkMode>once</forkMode>
       <argLine>-Xmx128m</argLine>
       <systemPropertyVariable>
        <property>
          <name>log4j.configuration</name>
          <value>log4j.properties</value>
        </property>
       </systemPropertyVariables>
    </configuration>
    <executions>
       <execution>
          <id>unit-test</id>
          <phase>test</phase>
          <goals>
             <goal>test</goal>
          </goals>
          <configuration>
              <skip>false</skip>
              <includes>
                 <include>**/*Test.java</include>
              <includes>
              <excludes>
                 <exclude>**/GwtTest*.java</exclude>
              </excludes>
          </configuration>
        </execution>
   <execution>
      <id>integration-test</id>
      <phase>integration-test</phase>
      <goals>
         <goal>test</goal>
      </goals>
      <configuration>
          <skip>true</skip>
          <includes>
             <include>**/GwtTest*.java</include>
          <includes>
          <excludes>
             <exclude>**/*Test.java</exclude>
          </excludes>
      </configuration>
    </execution>
    <executions>
  </plugin>

Когда я запускал 'mvn test' в командной строке, я вижу только те обычные тесты Junit, которые были запущены (те, у которых имя файла Test.java), когда я запускал mvn интеграционный тест, я все еще вижу все выполнялись тесты, включая обычный тест Junit и тест Gwt (те, которые имеют имя файла GwtTest .java).

Вопрос 1:

Как полностью исключить запуск обычного теста Junit во время интеграционного теста? или это невозможно? Поскольку в жизненном цикле maven по умолчанию определена фаза тестирования перед интеграционным тестом, невозможно пропустить фазу теста для запуска чистого интеграционного теста?

Поскольку я смешал весь код тестов в папке / src / test / java, когда я запустил mvn интеграции-тест и увидел результат в окне командной строки, я увидел следующее:

[INFO] running com.sample.services.joker.laughter.client.GwtTestLaughter 
..
[INFO] Validating newly compiled units
[INFO]    [ERROR] Errors in 'file:...src/test/java/com/sample/joker/laughter/client/file1Test.java'..
[INFO]    [ERROR] Line 42: No source code is available for type...; did you forget to inherit a required module?
...

Вопрос 2:

Я не понимаю этого, тест gwt очень прост, поэтому он проверяет несвязанный * Test.java и ищет его исходный код. хотя в конце концов сборка прошла успешно с пройденным тестом, как я могу избавиться от этих неприятных сообщений об ошибках?

Может быть, я должен забыть о плагине gwt-mavin и придерживаться классических тестов Juint?

Ответы [ 4 ]

7 голосов
/ 19 октября 2012

Здравствуйте, я понимаю вашу проблему, и вероятное решение находится на этой странице документации gwt-maven-plugin: https://gwt -maven-plugin.github.io / gwt-maven-plugin / user-guide / testing.html

Согласно документации по плагину:

Намерение: цель «test» связана по умолчанию с фазой интеграционного теста, а GWTTestCase не считается модульным тестом, посколькудля их работы требуется весь модуль GWT.

Для запуска тестов на основе Surefire и gwt-maven-plugin (для регулярных тестов JUnit на стороне сервера с Surefire и для клиентских моделей и тестов контроллера с GWT) вам необходимоотличить эти тесты друг от друга.Это делается с использованием соглашения об именах.

Вы можете настроить плагин Surefire (отвечающий за запуск тестов во время сборки maven), чтобы пропустить GwtTests с использованием некоторых шаблонов имен.

Более простой способ отделить классическийи GWT тесты это назвать последние GwtTest "Something" .java.Так как по умолчанию выполняется поиск тестов с именем Something «Test» .java по умолчанию, они будут игнорироваться на этапе тестирования.

По умолчанию gwt-maven-plugin использует GwtTest * .java в качестве шаблона включения, так чтотакие тесты не будут соответствовать стандартному шаблону Surefire.Используя это соглашение, вам не нужно менять свою конфигурацию.

2 голосов
/ 05 июня 2012

Вы должны добавить файлы src в classpath следующим образом:

<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.6</version>
<configuration>
  <additionalClasspathElements>
    <additionalClasspathElement>
       ${project.build.sourceDirectory}
    </additionalClasspathElement>
    <additionalClasspathElement>
       ${project.build.testSourceDirectory}
    </additionalClasspathElement>
  </additionalClasspathElements>
  <useManifestOnlyJar>false</useManifestOnlyJar>
  <forkMode>always</forkMode>
  <systemProperties>
    <property>
      <name>gwt.args</name>
      <value>-out \${webAppDirectory}</value>
    </property>
  </systemProperties>
</configuration>

Ссылка

1 голос
/ 15 августа 2012

Для вас, в большинстве нетривиальных проектов, в которых я принимал участие, существует крайнее предубеждение в отношении JUnit по двум причинам. Во-первых, GWTUnit требует ускорения контекста javascript, который является медленным, мучительно медленным по сравнению с тестом JUnit. Во-вторых, на самом деле не должно быть слишком много написанного, для которого требуется контекст Javascript для тестирования на основе вашего дизайна и структуры кода; в первую очередь из-за проблемы 1, но также помните, что вы пишете что-то с помощью представления GWT прямо сейчас, но вы действительно хотите, чтобы это было как можно более независимым от технологии представления. Таким образом, когда Swing добьется своего триумфального возвращения к возвышению, вам будет гораздо проще перенести его. Я шучу, более вероятным сценарием будет портирование на Android или кто знает, что еще в будущем.

Таким образом, GWTUnit работает очень медленно из-за среды, в которой он должен развиваться, и во всей реальности вы должны (ИМХО) выделять свою бизнес-логику, чтобы вы не были вечно связаны ни с одним представлением Технология рендеринга. По моему мнению, большая часть вашей логики, которая может быть отделена от мира UI, состоящего из виджетов и панелей, должна быть, будь то логика типа потока управления, логика валидации или что-то иное, чем просто вывод объектов на экран и получение и вывод значений из них. Все остальное должно быть вне этих классов в более крупном проекте и принимать объекты в качестве входных данных, которые никак не связаны с GWT. Если вы сделаете это, вы можете JUnit подавляющее большинство вашего приложения, которое смехотворно быстро, и вам не придется ждать вечно (в большом проекте интенсивное освещение с GWTUnit займет часы, может быть, дни). Я не буду рассказывать о том, насколько хороша поддержка кодового кода для сильных юнит-тестов.

Эта напыщенность основана на последней задаче, которую я выполнил здесь на моей текущей работе, там был набор бизнес-логики, который был связан со слоем представления, который имел (в конце раскручивания и создания полного модуля набор тестов) 178 различных сценариев, чтобы все должны были выполняться правильно. Это было то, что никогда не следовало знать, что оно работает в GWT, но оно было кратким и пронизано ссылками на классы технологии представления. Фактически, это было то, что уже было написано для более ранней версии программного обеспечения и не сильно изменилось, но они обернули логику в этом слое представления (который был Swing). Новая команда только что повторила грехи предыдущей команды, и из-за этого этот участок кода потребовал нескольких часов ручного тестирования, которое, я уверен, не охватило 100% сценариев, в отличие от быстрого нескольких секундного юнит-теста это управляет ими всеми.

1 голос
/ 24 августа 2011

Я могу помочь с вопросом 1. Чтобы пропустить запущенные тесты:

mvn (goals) -Dmaven.test.skip=true

Это позволит игнорировать тесты JUnit.

Что касается вопроса 2, классическим JUnit может быть путь. Я не слишком знаком с GWT, но есть ли у него аннотации к тестам (@test)? И что в строке 42, что ошибка?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...