这是一个Maven提高篇的系列,包含有以下文章:

  1. Maven提高篇系列之(一)——多模块 vs 继承
  2. Maven提高篇系列之(二)——配置Plugin到某个Phase(以Selenium集成测试为例)
  3. Maven提高篇系列之(三)——使用自己的Repository(Nexus)
  4. Maven提高篇系列之(四)——使用Profile
  5. Maven提高篇系列之(五)——处理依赖冲突
  6. Maven提高篇系列之(六)——编写自己的Plugin(本系列完)

持续交付要“自动化所有东西”,对于集成测试也是一样。集成测试和单元测试相比需要更多的环境准备工作,包括测试数据的准备和启动服务器等。在本篇中我们设想以下一种场景:

  • 你开发了一个web应用,集成测试使用了Selenium,你希望通过一个Maven命令跑完所有的测试,包括集成测试。

Maven的plugin包含了一个或多个goal,每一个goal表示plugin的一个操作单位,在plugin开发中,一个goal通常对应于Java类的一个方法(Mojo的execute方法,请参考本系列之六)。一个goal可以默认绑定到Mavan的某个phase,比如Jar plugin的jar这个goal便默认绑定在了package这个phase上。当Maven执行到package时,Jar的jar goal将自动执行。当然,在默认情况下plugin的goal也可以不绑定在任何一个phase上,此时Maven将不做任何操作。但是,我们可以显式地手动将某个plugin的某个goal绑定在一个phase中。

对于上面的场景,我们的解决方案是:在集成测试之前(对应Maven的phase为pre-integration-test),我们使用jetty-maven-plugin启动web应用,在集成测试时通过Selenium访问网站进行验证,集成测试完毕之后(对应Maven的phase为post-integration-test),同样使用jetty-maven-plugin关闭web应用。

Github示例代码:https://github.com/davenkin/maven-plugin-binding.git

通过上一篇的方式创建一个web工程,向其中添加一个helloworld.html用于测试:

<html>

<body>

<h2>Hello World!</h2>

</body>

</html>

添加Selelium Webdriver集成测试如下:

public class SafariIntegrationTest {

   @Test

   public void testHelloWorldIndexPage() {

       WebDriver driver = new HtmlUnitDriver();

       driver.get("http://localhost:8080/helloworld.html");

       WebElement element = driver.findElement(By.tagName("h2"));

       assertThat(element.getText(), is("Hello World!"));

   }

}

为了使用Selenium,我们需要将Selenium依赖加入pom.xml文件中:

       <dependency>

           <groupId>org.seleniumhq.selenium</groupId>

           <artifactId>selenium-java</artifactId>

           <version>2.33.0</version>

       </dependency>

接下来就可以配置jetty-maven-plugin了:

           <plugin>

               <groupId>org.mortbay.jetty</groupId>

               <artifactId>jetty-maven-plugin</artifactId>

               <version>8.1.12.v20130726</version>

               <configuration>

                   <scanintervalseconds>0</scanintervalseconds>

                   <stopKey>stop</stopKey>

                   <stopPort>9999</stopPort>

               </configuration>

               <executions>

                   <execution>

                       <id>start-jetty</id>

                       <phase>pre-integration-test</phase>

                       <goals>

                           <goal>run</goal>

                       </goals>

                       <configuration>

                           <scanintervalseconds>0</scanintervalseconds>

                           <daemon>true</daemon>

                       </configuration>

                   </execution>

                   <execution>

                       <id>stop-jetty</id>

                       <phase>post-integration-test</phase>

                       <goals>

                           <goal>stop</goal>

                       </goals>

                   </execution>

               </executions>

           </plugin>

可以看出,在pre-integration-test阶段,我们调用了jetty-maven-plugin的run,此时web服务器启动,在post-integration-test阶段,我们调用了jetty-maven-plugin的stop来关闭web服务器。

但是这里有个问题,在运行mvn clean install时,Maven会先运行单元测试,再运行集成测试,并且在默认情况下这两种测试都会运行以*Test.java结尾的测试类,结果在单元测试阶段也会运行上面的SafariIntegrationTest,结果还没有执行到集成测试阶段就挂了。

此时,我们需要将单元测试和集成测试分开,Maven使用maven-surefire-plugin执行测试,我们可以先将SafariIntegrationTest排除在测试之外,这样单元测试将不会运行该测试,然后在集成测试中,在将SafariIntegrationTest包含进来,此时我们需要修改maven-surefire-plugin的配置:

           <plugin>

               <groupId>org.apache.maven.plugins</groupId>

               <artifactId>maven-surefire-plugin</artifactId>

               <configuration>

                   <includes>

                       <include>**/unit/*Test.java</include>

                   </includes>

               </configuration>

               <executions>

                   <execution>

                       <id>surefire-it</id>

                       <phase>integration-test</phase>

                       <goals>

                           <goal>test</goal>

                       </goals>

                       <configuration>

                           <includes>

                               <include>**/*IntegrationTest.java</include>

                           </includes>

                       </configuration>

                   </execution>

               </executions>

           </plugin>

现在运行mvn clean install,成功。在上面的例子中,我们使用了一个小trick,先将只有在unit目录下的以*Test.java结尾的类看做测试类,此时不包含SafariIntegrationTest,而在itegration-test阶段,我们将运行以*IntegrationTest.java结尾的测试类。

你可能还是不怎么放心,除非自己看到了实际的页面为止。要达到这样的目的,我们可以将SafariIntegrationTest中的:

WebDriver driver = new HtmlUnitDriver();//使用HtmlUnit

修改为:

 WebDriver driver = new SafariDriver();//打开Safari浏览器

或者:

WebDriver driver = new InternetExplorerDriver();//打开IE浏览器

此时再运行mvn clean install,浏览器窗口将打开。

下一篇中,我们将讲到如何使用自己的repository——Nexus

Maven提高篇系列之(二)——配置Plugin到某个Phase(以Selenium集成测试为例)的更多相关文章

  1. Maven提高篇系列之(六)——编写自己的Plugin(本系列完)

    这是一个Maven提高篇的系列,包含有以下文章: Maven提高篇系列之(一)——多模块 vs 继承 Maven提高篇系列之(二)——配置Plugin到某个Phase(以Selenium集成测试为例) ...

  2. Maven提高篇系列之(五)——处理依赖冲突

    这是一个Maven提高篇的系列,包含有以下文章: Maven提高篇系列之(一)——多模块 vs 继承 Maven提高篇系列之(二)——配置Plugin到某个Phase(以Selenium集成测试为例) ...

  3. Maven提高篇系列之(四)——使用Profile

    这是一个Maven提高篇的系列,包含有以下文章: Maven提高篇系列之(一)——多模块 vs 继承 Maven提高篇系列之(二)——配置Plugin到某个Phase(以Selenium集成测试为例) ...

  4. Maven提高篇系列之(三)——使用自己的Repository(Nexus)

    这是一个Maven提高篇的系列,包含有以下文章: Maven提高篇系列之(一)——多模块 vs 继承 Maven提高篇系列之(二)——配置Plugin到某个Phase(以Selenium集成测试为例) ...

  5. Maven提高篇系列之(一)——多模块 vs 继承

    这是一个Maven提高篇的系列,包含有以下文章: Maven提高篇系列之(一)——多模块 vs 继承 Maven提高篇系列之(二)——配置Plugin到某个Phase(以Selenium集成测试为例) ...

  6. Maven提高篇系列之五——处理依赖冲突

    个人分类: Maven 不知道你在使用Maven时是否遇到过诸如"NoSuchMethodError"或"ClassNotFoundException"之类的问 ...

  7. chessy 提高篇系列 阅读笔记

    java提高篇(一)—–理解java的三大特性之封装 封装的好处, 汇聚属性和方法 减少修改对 其他处的影响 控制get和set方法. java提高篇(二)—–理解java的三大特性之继承 继承的好处 ...

  8. java提高篇(十七)-----异常(二)

          承接上篇博文:java提高篇-----异常(一) 五.自定义异常 Java确实给我们提供了非常多的异常,但是异常体系是不可能预见所有的希望加以报告的错误,所以Java允许我们自定义异常来表 ...

  9. Java提高篇(三二)-----List总结

    前面LZ已经充分介绍了有关于List接口的大部分知识,如ArrayList.LinkedList.Vector.Stack,通过这几个知识点能够对List接口有了比較深的了解了.仅仅有通过归纳总结的知 ...

随机推荐

  1. Request中的各种方法

    前言 Request中方法众多,对于Java Web程序员来说,种种方法都会在工作中常常用到.Request由于不是JDK的一部分,这些方法的用法也没有专门的API可以查,所以在工作中遇到Reques ...

  2. [.net 面向对象编程基础] (14) 重构

    [.net 面向对象编程基础] (14) 重构 通过面向对象三大特性:封装.继承.多态的学习,可以说我们已经掌握了面向对象的核心.接下来的学习就是如何让我们的代码更优雅.更高效.更易读.更易维护.当然 ...

  3. 淘宝code—— 最给力的国内免费SVN(不限语言),异地团队开发、打造个人开源项目不再是梦

    相信大家都听说过GitHub,也有很多人在用,但是GitHub毕竟在国外,速度不是很给力,而且安装过程也是很漫长.今天来给大家介绍一个国内的免费的开源项目平台,当然也是一个SVN版本控制器,名字叫ta ...

  4. 《OOC》笔记(1)——C语言const、static和extern的用法

    <OOC>笔记(1)——C语言const.static和extern的用法 C语言中const关键字用法不少,我只喜欢两种用法.一是用于修饰函数形参,二是用于修饰全局变量和局部变量. 用c ...

  5. java 堆栈分析4

    jprofiler ,又是一款好工具... —— 不过显然,我觉得有了jvisualvm就足够了,难道它会比jvisualvm还强大很多!?? 什么时候需要它呢?它有什么特别好用的地方吗? 带来什么方 ...

  6. osgi 1

    Helloworld入门 准备: eclipse 3.4 需要jar,—— eclipse 自带的,plugin下面有很多,抛开里面的jar,很多都是当前项目不需要的,如果不适用eclipse而是直接 ...

  7. 自己封装个ajax

    你是否发现项目中有很多页面只用到了框架不到十分之一的内容,还引了压缩后还有70多kb的jquery库 你是否发现项目中就用了两三个underscore提供的方法,其他大部分的你方法你甚至从来没有看过 ...

  8. CSS的样式表基本概念

    一.样式表分类 1.内联样式表 <p style="fint-size:24px;">直接在标签内部进行样式设置</style> 2.内嵌样式表 <h ...

  9. Atitit 深入了解UUID含义是通用唯一识别码 (Universally Unique Identifier),

    Atitit 深入了解UUID含义是通用唯一识别码 (Universally Unique Identifier), UUID1 作用1 组成1 全球唯一标识符(GUID)2 UUID 编辑 UUID ...

  10. Atitit 基于图片图像 与文档混合文件夹的分类

    Atitit 基于图片图像 与文档混合文件夹的分类 太小的文档(txt doc csv exl ppt pptx)单独分类 Mov10KminiDoc 但是可能会有一些书法图片迁移,因为他们很微小,需 ...