前文中我们成功使用 ANT + Maven2 + Cruise 搭建了持续集成环境,实现了 compile 、 test 、 tag 、 deploy 、 publish 等自动化环境。今天我们再接再厉,为其加入 Selenium 集成测试。
关于 Selenium 的介绍和使用方法,在此不做赘述,各位可以借助万能的 google 来入门一下,下面我们直切主题。
集成测试前
部署工程
因为在执行集成测试时,需要工程在 web 容器下正常运行,所以,在 maven 的 pre-integration-test 阶段,我们需要将工程部署到 web 服务器下:
启动 selenium server
使用 maven 调用 selenium ,是通过 selenium-maven-plugin 这个插件实现的,配置如下:
我们需要在 pre-integration-test 阶段使用 start-server 目标启动 selenium 服务器,执行完集成测试,则需要在 post-integration-test 阶段使用 stop-server 目标停掉之。
Xvfb
对于 linux 下的集成测试, cruise 可能运行在纯字符界面,因此,当 selenium 启动浏览器时,会报无 xserver 的错误,这时,我们就需要使用 xvfb 这个界面模拟程序来搞定这个问题了。正如下面这个链接所述
http://mojo.codehaus.org/selenium-maven-plugin/examples/headless-with-xvfb.html
我们会在 pre-integration-test 阶段启动 xvfb ,然后 selenium 就可以在模拟的 xserver 中启动浏览器了。
但是,我们这样配置之后,虽然 linux 下可以正常运行集成测试,但是在 windows 下,我们的测试失败了。
原因就出在这个 xvfb 上。在 windows 下,没有这个程序来运行, pre-integration-test 阶段自然就失败了 …
我们使用 ${noxvfb} 变量,来决定是否运行 xvfb ,变量的值来自外部。那么我们就可以用类似 mvn integration-test –Dnoxvfb=true 的命令来关闭 xvfb 了。
不过本地频繁的输入这个参数是一个很大的浪费(起码键盘会折寿的说 … ),而且还要人工判断是否是 windows 系统。所以,再次请出 ant 大神:
使用 <contains string="${os.name}" substring="nux"/> 标签来判断系统是否为 linux ,以便决定是否启动 xvfb 。
执行集成测试
Selenium 的 maven 扩展支持两种调用方式:使用使用 surefire 的 junit 调用和 selenese 。
surefire 的 junit 调用
Maven2 为我们提供了 integration-test 阶段来进行集成测试,而一般我们会使用 maven-surefire-plugin 这个插件来调用 junit ,进一步调用 Selenium 的测试用例( Selenium 支持多种语言进行),这一做法也可以找到一箩筐的解决方案,比如这里:
http://blog.csdn.net/dqatsh/archive/2009/02/20/3913306.aspx
和官方示例:
http://mojo.codehaus.org/selenium-maven-plugin/examples/using-with-surefire.html
正如文中所述, maven-surefire-plugin 已经被默认注册到了 test 阶段,因此我们会使用如下的显示定义来在集成测试阶段调用 junit :
注意:由于 cruise 已经支持分阶段执行,因此我们不希望在 integration-test 阶段重复进行 unit-test ,因此,在 utest 目标中,使用了 ${skiput} 变量来由命令行传入 unit-test 开关。
Selenese
除了使用 surefire 的 junit 调用,我们还可以使用 selenium-maven-plugin 的 selenese 目标,它可以脱离 junit ,直接使用浏览器端的 selenium 测试代码进行集成测试。