Maven实现Web应用集成测试自动化 -- 部署自动化(WebTest Maven Plugin)

上篇:Maven实现Web应用集成测试自动化 -- 测试自动化(WebTest Maven Plugin)

之前介绍了如何在maven中使用webtest插件实现web的集成测试,这里有个遗留问题,就是在执行maven的intergation测试时候web应用已经部署在容器中处于in service的状态,那么web应用的部署是否可以自动化呢?在我们公司的系统中,由于使用了weblogic的cluster,自己写了脚步来实现部署,花费了不少人力物力,其实java web应用早就有福音了,是一款自动安装容器和部署应用的插件神器:cargo-maven2-plugin,这插件可以兼容所有目前主流的服务器如jboss、tomcat、glassfish、jetty等。

它的配置很简单,在build里面加入cargo-maven2-plugin,为了实现集成测试自动化,声明集成测试阶段之前调用cargo:start启动容器和部署应用,集成测试结束后调用cargo:stop关闭容器。默认start启动的容器在maven生存周期结束之后就会结束,有时候为了调试方便,可以调用cargo:run来启动容器和部署应用,在需要的时候再通过Ctrl+C结束容器运行。

为了实现容器启动和部署自动化,还需要提供一些配置参数给插件,下面给出个示例,Cargo还有很多其它的功能,具体可以参考:Cargo自动部署官方网站

                     <plugin>                        
                       <groupId>org.codehaus.cargo</groupId>
                       <artifactId>cargo-maven2-plugin</artifactId>
                        <version>${project.cargoPluginVersion}</version>
                        <configuration>        
                            <!-- 定义container -->
                            <container>
                                <!-- container类型 jetty/tomcat/weblogic/jboss etc -->
                                <containerId>${project.cargo.container}</containerId> 
                                <!-- 指定容器下载路径,保存路径,解压路径,放在target目录可以在clean的时候自动清除--> 
                                <zipUrlInstaller> 
                                    <url>${project.cargo.container.url}</url> 
                                    <downloadDir>${project.build.directory}/${project.cargo.container}/downloads</downloadDir> 
                                    <extractDir>${project.build.directory}/${project.cargo.container}/extracts</extractDir> 
                                </zipUrlInstaller> 
                                <!-- cargo log 存储 -->
                                <log>${project.build.directory}/logs/cargo.log</log>         
                                <!-- container log 存储 -->
                                <output>${project.build.directory}/logs/container.out</output> 
                            </container>
                            <!-- 添加container相关的配置信息 -->
                            <configuration>
                                <!-- 设置deploy home -->
                                <home>${project.build.directory}/${project.cargo.container}/container</home>
                                <!-- <type>existing</type> existing type是使用已有的容器,在开放环境中使用,集成测试
                                      一般使用默认的install type,每次重新创建所有资源,保证每次测试环境OK,还有一种
                                      远程部署runtime type (见下面注释),方便远程部署测试-->
                                <properties>
                                    <!-- -->
                                    <project.cargo.hostname>${project.cargo.host}</project.cargo.hostname>
                                    <cargo.servlet.port>${project.cargo.port}</cargo.servlet.port>
                                    <cargo.servlet.uriencoding>${project.build.sourceEncoding}</cargo.servlet.uriencoding>
                                    <!-- 
                                        为了防止和环境中其他节点冲突,可以设置容器专门属性,
                                        <cargo.tomcat.ajp.port>8123</cargo.tomcat.ajp.port>
                                         <cargo.tomcat.manager.protocol>http</cargo.tomcat.manager.protocol>
                                        <cargo.tomcat.manager.hostname>127.0.0.1</cargo.tomcat.manager.hostname>
                                        <cargo.tomcat.manager.port>8080</cargo.tomcat.manager.port>
                                        <cargo.tomcat.manager.username>admin</cargo.tomcat.manager.username>
                                        <cargo.tomcat.manager.password>1234</cargo.tomcat.manager.password> -->
                                </properties>
                                <!-- for remote deploy, also container type should be remote
                                    <type>runtime</type>
                                    <properties>
                                      <cargo.remote.username>username</cargo.remote.username>
                                      <cargo.remote.password>password</cargo.remote.password>
                                    </properties> -->
                            </configuration>
<pre>                            <!-- 需要部署的应用配置 -->
                            <deployables>
                                   <deployable>
                                     <!-- group/artifact使用默认值部署本应用,默认从maven output获取部署包,可以在location中指定
                                      <groupId>war group id</groupId>
                                      <artifactId>war artifact id</artifactId>
                                      <location> war location</location>
                                     -->
                                     <type>war</type>
                                     <properties>
                                        <context>optional root context</context>
                                     </properties>
                                     <pingURL>optional url to ping to know if deployable is done or not</pingURL>
                                     <pingTimeout>optional timeout to ping (default 20000 milliseconds)</pingTimeout>
                                   </deployable>
                            </deployables>
                            <!-- 定义打包路径 -->                                    
                            <packager>
                                    <outputLocation>${project.build.directory}/packaged</outputLocation>
                            </packager>
                        </configuration>
                        <executions>
                            <!--为了完成集成测试,在开始集成测试之前启动容器和部署应用 -->                             
                           <execution> 
                               <id>start-container</id> 
                               <phase>pre-integration-test</phase> 
                               <goals> <goal>start</goal> </goals> 
                           </execution> 
                           <!--测试完成后,关闭容器 -->                             
                           <execution> 
                               <id>stop-container</id> 
                               <phase>post-integration-test</phase> 
                               <goals> <goal>stop</goal> </goals> 
                           </execution>
                           <!--关闭容器后打包容器留作日后分析 -->
                           <execution> 
                               <id>package-container</id> 
                               <phase>post-integration-test</phase> 
                               <goals> <goal>package</goal> </goals> 
                           </execution>
                         </executions> 
                      </plugin>

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。