首页 » Maven实战 » Maven实战全文在线阅读

《Maven实战》12.4 使用jetty-maven-plugin进行测试

关灯直达底部

在进行Web开发的时候,我们总是无法避免打开浏览器对应用进行测试,比如为了验证程序功能、验证页面布局,尤其是一些与页面相关的特性,手动部署到Web容器进行测试似乎是唯一的方法。近年来出现了很多自动化的Web测试技术如Selenium,它能够录制Web操作,生成各种语言脚本,然后自动重复这些操作以进行测试。应该说,这类技术方法是未来的趋势,但无论如何,手动的、亲眼比对验证的测试是无法被完全替代的。测试Web页面的做法通常是将项目打包并部署到Web容器中,本节介绍如何使用jetty-maven-plugin,以使这些步骤更为便捷。

在介绍jetty-maven-plugin之前,笔者要强调一点,虽然手动的Web页面测试是必不可少的,但这种方法绝不应该被滥用。现实中常见的情况是,很多程序员即使修改了一些较底层的代码(如数据库访问、业务逻辑),都会习惯性地打开浏览器测试整个应用,这往往是没有必要的。可以用单元测试覆盖的代码就不应该依赖于Web页面测试,且不说页面测试更加耗时耗力,这种方式还无法自动化,更别提重复性了。因此Web页面测试应该仅限于页面的层次,例如JSP、CSS、JavaScript的修改,其他代码修改(如数据访问),请编写单元测试。

传统的Web测试方法要求我们编译、测试、打包及部署,这往往会消耗数10秒至数分钟的时间,jetty-maven-plugin能够帮助我们节省时间,它能够周期性地检查项目内容,发现变更后自动更新到内置的Jetty Web容器中。换句话说,它帮我们省去了打包和部署的步骤。jetty-maven-plugin默认就很好地支持了Maven的项目目录结构。在通常情况下,我们只需要直接在IDE中修改源码,IDE能够执行自动编译,jetty-maven-plugin发现编译后的文件变化后,自动将其更新到Jetty容器,这时就可以直接测试Web页面了。

使用jetty-maven-plugin十分简单。指定该插件的坐标,并且稍加配置即可,见代码清单12-13。

代码清单12-13 配置jetty-maven-plugin

jetty-maven-plugin并不是官方的Maven插件,它的groupId是org.mortbay.jetty,上述代码中使用了Jetty 7的最新版本。在该插件的配置中,scanIntervalSeconds顾名思义表示该插件扫描项目变更的时间间隔,这里的配置是每隔10秒。需要注意的是,如果不进行配置,该元素的默认值是0,表示不扫描,用户也就失去了所谓的自动化热部署的功能。上述代码中webappConfig元素下的contextPath表示项目部署后的context path。例如这里的值为/test,那么用户就可以通过http://hostname:port/test/访问该应用。

下一步启动jetty-maven-plugin。不过在这之前需要对settings.xml做个微小的修改。前面介绍过,默认情况下,只有org.apache.maven.plugins和org.codehaus.mojo两个groupId下的插件才支持简化的命令行调用,即可以运行mvn help:system,但mvn jetty:run就不行了。因为maven-help-plugin的groupId是org.apache.maven.plugins,而jetty-maven-plugin的groupId是org.mortbay.jetty。为了能在命令行直接运行mvn jetty:run,用户需要配置settings.xml如下:

现在可以运行如下命令启动jetty-maven-plugin:

jetty-maven-plugin会启动Jetty,并且默认监听本地的8080端口,并将当前项目部署到容器中,同时它还会根据用户配置扫描代码改动。

如果希望使用其他端口,可以添加jetty.port参数。例如:

现在就可以打开浏览器通过地址http://localhost:9999/test/测试应用了。要停止Jetty,只需要在命令行输入Ctrl+C即可。

启动Jetty之后,用户可以在IDE中修改各类文件,如JSP、HTML、CSS、JavaScript甚至是Java类。只要不是修改类名、方法名等较大的操作,jetty-maven-plugin都能够扫描到变更并正确地将变化更新至Web容器中,这无疑在很大程度上帮助了用户实现快速开发和测试。

上面的内容仅仅展示了jetty-maven-plugin最核心的配置点,如果有需要,还可以自定义web.xml的位置、项目class文件的位置、web资源目录的位置等信息。用户还能够以WAR包的方式部署项目,甚至在Maven的生命周期中嵌入jetty-maven-plugin。例如,先启动Jetty容器并部署项目,然后执行一些集成测试,最后停止容器。有兴趣进一步研究的读者可以访问该页面:http://wiki.eclipse.org/Jetty/Feature/Jetty_Maven_Plugin。