我如何一起使用maven和jUnit测试?

时间:2010-12-28 22:08:14

标签: gwt maven junit

我在Maven中构建了一个gwt应用程序,现在我尝试运行一个简单的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 integration-test'时,我仍然看到所有运行测试,包括正常的Junit测试和Gwt测试(具有GwtTest .java文件名的测试)。

问题1:

如何在集成测试期间完全排除运行正常的Junit测试?或那是不可能的?因为在默认的maven生命周期中,测试阶段被定义为在集成测试之前存在,所以没有办法跳过测试阶段来运行纯粹的集成测试吗?

由于我混合了/ src / test / java文件夹下的所有测试代码,当我运行'mvn integration-test'并在命令行窗口中观察输出时,我看到了以下内容:

[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-plugin并坚持使用经典的Juint测试?

4 个答案:

答案 0 :(得分:7)

您好我理解您的问题,可能的解决方案就在这个gwt-maven-plugin文档页面上:https://gwt-maven-plugin.github.io/gwt-maven-plugin/user-guide/testing.html

根据插件文档:

意图:          &#39;测试&#39;目标是默认绑定到集成测试阶段,GWTTestCase不被视为单元测试,因为它们需要整个GWT模块运行。

要运行基于Surefire和gwt-maven-plugin的测试(对于使用Surefire的常规服务器端JUnit测试,以及使用GWT进行客户端模型和控制器测试),您需要将这些测试彼此区分开来。这是使用命名约定完成的。

您可以配置Surefire插件(负责在maven构建期间运行测试)以使用某些命名模式跳过GwtTests。

分离经典和GWT测试的一种更简单的方法是命名最后的GwtTest&#34; Something&#34; .java。由于surefire在默认情况下会查找名为Something&#34; Test&#34; .java的测试,因此在测试阶段将忽略它们。

默认情况下,gwt-maven-plugin使用GwtTest * .java作为包含模式,以便此类测试与标准Surefire模式不匹配。使用此约定,您无需更改配置。

答案 1 :(得分:2)

您应该将src文件添加到类路径中,如下所示:

<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>

Reference

答案 2 :(得分:1)

我可以帮助解答问题1.跳过运行测试:

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

这将使它忽略JUnit测试。

对于问题2,经典的JUnit可能是最佳选择。我对GWT不太熟悉,但是它有测试注释(@test)吗?第42行的错误是什么?

答案 3 :(得分:1)

对于您而言,在我参与的大多数非平凡项目中,有一个 对JUnit的极端偏见 有两个原因。首先,与JUnit测试相比,GWTUnit需要调整javascript上下文,这种上下文速度慢,速度慢。其次,根据您的设计和代码结构,您需要根据需要使用Javascript上下文进行测试,这应该不会太多;主要是因为问题1,但还要记住你现在正在用GWT视图编写一些东西,但你真的希望尽可能不知道视图技术。这样,当Swing让它获得胜利时,您可以更轻松地将其移植到其中。我在开玩笑,更可能的情况是移植到Android或谁知道未来还有什么。

基本上,GWTUnit运行起来非常慢,因为它必须启动环境,而且在所有现实中,你应该(IMHO)将你的业务逻辑分解出来,这样你就不会永远耦合到任何一个视图渲染技术。在我看来,大多数可以从小部件和面板的纯UI世界中分离出来的逻辑应该是,无论是控制流类型逻辑,验证逻辑,还是除了将内容放在屏幕上以及获取值之外的任何其他内容他们其他所有内容都应该在较大项目中的那些类之外,并且将对象作为输入,以任何方式与GWT无关。如果你这样做,你可以JUnit你的绝大多数应用程序,这是非常快的,你不必永远等待(在一个大型项目中,GWTUnit的大量覆盖需要数小时,甚至几天)。我不会继续讨论有关代码库的强大单元测试的维护效果。

这个咆哮是由我在当前工作中完成的最后一项任务所预测的,有一组业务逻辑与视图层结合(在展开结束时构建一个完整的单元)测试套件)所有必须正确执行的178种不同场景。这是一个永远不应该知道它在GWT中运行的东西,但它是短截线的,并且充斥着对视图技术类的引用。实际上,这已经是为早期版本的软件编写的并没有太大变化,但是它们将逻辑包装在该视图层(即Swing)中。新团队刚刚重复了早期团队的罪行,因此这个代码部分需要手工进行数小时的测试,我确信这不会100%覆盖场景,而不是快速的几秒钟单元测试它们全部运行。