Maven能够帮我们很好的管理测试,我们可以在src/test/java
和 src/test/resources
下面使用JUnit或者TestNG 编写单元测试和集成测试,然后在命令行运行 mvn test
,测试就会自动运行,同时产生详细的测试报告。对只有一两个人的项目来说,不会碰到本文将提到的问题。
我们考虑以下场景(这也是我在实际项目中碰到的问题):有一个大概30人团队的项目,其中一半在美国,另一半在中国,要知道两个地方的网络连接速度不是很快,也就是说从地球的一端连接地球另一端的数据库十分耗时。中国的团队开发了一些模块,也很积极的编写了大量单元测试和集成测试(我这里说的单元测试使指不对外部任何环境有依赖),这些代码完全由Maven管理,所以在中国团队这里,持续集成服务器上只有简单的一条 mvn clean install
命令,一切都很好!但是,当美国团队签出同样的源代码,运行同样的命令时,问题出现了,测试在他们那里总是过不去,经过检查,发现代码中有太多的硬编码的数据库链接,以及其它的对外部环境的依赖。于是他们抱怨:How can you hardcode database link? 中国的同事很委屈:我们已经从代码里把这些东西抽取到配置文件里了,这不算Hardcode吧。大家暂时没办法,于是只能在build命令后加上-Dtest -DfailIfNoTests
,build可以过了,但是美国团队心里总是不舒服,尤其是当他们代码把测试弄坏时,他们经常不知道。
问题总是要解决的,更何况现在的问题也不小。让我们看看Maven为我们提供了什么,大家首先会想到的肯定是Profile,通过Profile,我们可以通过Maven传入一些个性化变量。考虑一下我们的情况下什么需要个性化?也就是说什么东西在不同的地方值是不一样的?答案是src/test/resources
下的一些资源文件,如JPA用到的 persistence.xml
,其中包含了这样的内容:
我们看到这个资源文件绑定到了本机的mysql数据库上,我们需要从Maven传入这些参数,包括url, username和password。可问题是,通过Profile传输的个性化变量,我们能在pom.xml里面引用,我们如何在src/test /resources
下的资源文件里引用它们呢?
先别急,先让我们把Profile定义好,这里我选择在%M2_HOME%/conf
下的settings.xml
里定义全局的Profile,因为数据库链接是很多模块的测试都会用到的,定义如下:
myProfile
jdbc:mysql://localhost:3306
test
test
test
myProfile
此外,修改资源文件如下:
至此,我们已经把环境相关的变量隔离开了,每个用户都有自己的settings.xml
文件,所以每个人都能配置自己的settings.xml
来使用他想要使用的数据库。针对我们上面的场景,美国的团队只要在本地配置一个数据库,他们也就可以运行测试了,皆大欢喜!
最后,不要忘了配置 Maven Resources 插件让它开启 filtering 功能:
[...]
src/test/resources
true
[...]
至此,运行 mvn install
,Maven 会让 Resources 插件首先根据 setttings.xml
文件中的值填充测试资源文件中的变量,然后再运行测试。这种解决方案不仅仅适用于数据库,任何外部环境配置都可以使用该方案,如对消息服务器的依赖。尽情享受Maven给你带来的便利吧!
分享到:
2008-06-22 12:46
浏览 10483
评论
谢谢分享!
5 楼
axlfu
2010-08-05
hi,我用filter做配置替换,设置了filter的文件,编码采用GB18030,但替换后的文件有些乱码(大部分是正确的),导致应用无法启动
源文件:
替换后:
请教下该如何解决?
4 楼
juvenshun
2008-11-03
imcaptor 写道
我的问题,settings里面大小写有问题。<activeProfiles> <activeProfile>development</activeProfile> <activeprofile>sqlProfile</activeprofile> </activeProfiles>应该是:<activeProfiles> <activeProfile>development</activeProfile> <activeProfile>sqlProfile</activeProfile> </activeProfiles>我用mvn help:active-profiles看了一下有效的profile。
sorry, 大小写问题已修复
3 楼
imcaptor
2008-11-02
我的问题,settings里面大小写有问题。
development
sqlProfile
应该是:
development
sqlProfile
我用mvn help:active-profiles看了一下有效的profile。
2 楼
imcaptor
2008-11-02
我试了,好像不管用啊,settings.xml设置了,但是没有起作用。
1 楼
lovefly_zero
2008-08-05
很好的东西 收藏了