使用Profile和Resources Filter隔离测试环境
转自:http://juvenshun.iteye.com/blog/206825
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 ,其中包含了这样的内容:
<property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"/>
<property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/test"/>
<property name="hibernate.connection.username" value="test"/>
<property name="hibernate.connection.password" value="test"/>
我们看到这个资源文件绑定到了本机的mysql数据库上,我们需要从Maven传入这些参数,包括url, username和password。可问题是,通过Profile传输的个性化变量,我们能在pom.xml里面引用,我们如何在src/test /resources 下的资源文件里引用它们呢?
先别急,先让我们把Profile定义好,这里我选择在%M2_HOME%/conf 下的settings.xml 里定义全局的Profile,因为数据库链接是很多模块的测试都会用到的,定义如下:
<profiles>
<profile>
<id>myProfile</id>
<properties>
<mysql.url>jdbc:mysql://localhost:3306</mysql.url>
<mysql.username>test</mysql.username>
<mysql.password>test</mysql.password>
<mysql.dbname>test</mysql.dbname>
</properties>
</profile>
</profiles>
<activeProfiles>
<activeProfile>myProfile</activeProfile>
</activeProfiles>
此外,修改资源文件如下:
<property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"/>
<property name="hibernate.connection.url" value="jdbc:mysql://${mysql.url}/${mysql.dbname}"/>
<property name="hibernate.connection.username" value="${mysql.username}"/>
<property name="hibernate.connection.password" value="${mysql.password}"/>
至此,我们已经把环境相关的变量隔离开了,每个用户都有自己的settings.xml 文件,所以每个人都能配置自己的settings.xml 来使用他想要使用的数据库。针对我们上面的场景,美国的团队只要在本地配置一个数据库,他们也就可以运行测试了,皆大欢喜!
最后,不要忘了配置 Maven Resources 插件让它开启 filtering 功能:
<resource>
<directory>src/test/resources</directory>
<filtering>true</filtering>
</resource>
至此,运行 mvn install ,Maven 会让 Resources 插件首先根据 setttings.xml 文件中的值填充测试资源文件中的变量,然后再运行测试。这种解决方案不仅仅适用于数据库,任何外部环境配置都可以使用该方案,如对消息服务器的依赖。尽情享受Maven给你带来的便利吧!
使用Profile和Resources Filter隔离测试环境的更多相关文章
- Maven Filter与Profile隔离生产环境与开发环境
Maven Filter与Profile隔离生产环境与开发环境 在不同的开发阶段,我们一般用到不同的环境,开发阶段使用开发环境的一套东西,测试环境使用测试环境的东西,可能有多个测试环境,生产环境使用的 ...
- maven 根据profile,resources,filters来区分部署环境
项目过程中,在不同的阶段,分别需要部署开发环境,测试环境,线上环境.如果都用一套配置文件,很容易弄乱,所以维持多套配置文件很有必要. maven提供了一组属性以供开发人员灵活搭配,可以根据环境来打包, ...
- maven根据profile,resources,filters来区分部署环境
项目过程中,在不同的阶段,分别需要部署开发环境,测试环境,线上环境.如果都用一套配置文件,很容易弄乱,所以维持多套配置文件很有必要. maven提供了一组属性以供开发人员灵活搭配,可以根据环境来打包, ...
- 【Spring】使用@Profile注解实现开发、测试和生产环境的配置和切换,看完这篇我彻底会了!!
写在前面 在实际的企业开发环境中,往往都会将环境分为:开发环境.测试环境和生产环境,而每个环境基本上都是互相隔离的,也就是说,开发环境.测试环境和生产环境是互不相通的.在以前的开发过程中,如果开发人员 ...
- 转 通过 spring 容器内建的 profile 功能实现开发环境、测试环境、生产环境配置自动切换
软件开发的一般流程为工程师开发 -> 测试 -> 上线,因此就涉及到三个不同的环境,开发环境.测试环境以及生产环境,通常 ...
- maven profile切换正式环境和测试环境
有时候,我们在开发和部署的时候,有很多配置文件数据是不一样的,比如连接mysql,连接redis,一些properties文件等等 每次部署或者开发都要改配置文件太麻烦了,这个时候,就需要用到mave ...
- 【POM】maven profile切换正式环境和测试环境
有时候,我们在开发和部署的时候,有很多配置文件数据是不一样的,比如连接mysql,连接redis,一些properties文件等等 每次部署或者开发都要改配置文件太麻烦了,这个时候,就需要用到mave ...
- Dubbo测试环境服务调用隔离这么玩对么
背景阐述 前几天,有位同学问我一个关于 Dubbo 的问题.他的诉求是这样子的: 诉求一 第一个诉求是本地开发的时候想自己调用自己的服务,比如自己在改 A 服务,然后出问题了,本地再启动一个 B 服务 ...
- spring boot使用profile来区分正式环境配置文件与测试环境配置文件
转载请在页首注明作者与出处 一:前言 经常在开发的时候,项目中的配置文件,在个人开发的时候有一套配置文件,在测试环境有一套配置文件,在正式环境有一套配置文件,这个时候如果配置文件复杂,需要改的东西就特 ...
随机推荐
- 安卓开发-Activity中finish() onDestroy() 和System.exit()的区别(转)
Activity.finish()Call this when your activity is done and should be closed. 在你的activity动作完成的时候,或者Act ...
- 安装 jenkins
1. 将jenkins.war包放在 tomcat 的 webapps 目录下即可 2 重启 tomcat 3. 通过浏览器访问 IP:8080/jenkins
- redis简记
redis学习笔记 http://doc.redisfans.com/ 键空间通知(keyspace notification) 键空间通知,客户端可以通过订阅频道或者模式来接收redis改动的数据集 ...
- 全景分割pipeline搭建
全景分割pipeline搭建 整体方法使用语义分割和实例分割结果,融合标签得到全景分割结果: 数据集使用:panoptic_annotations_trainval2017和cityscapes; p ...
- (转)Render Path
Render Path定义Render Path,就是采取的光照流程. Render Path设置可以在Edit-> Project Settings->Player 里设定,见下图.也可 ...
- minipad2
minipad2 是一款小巧的纯文本笔记软件,系统资源占用少,集笔记 / 便笺.计算器.备忘录.电子词典.快启面板.通讯录.文字模板.多重剪贴板等多种功能于一体,所有内容自动保存,关闭时自动记忆最后的 ...
- 理解TIME_WAIT
理解TIME_WAIT http://www.firefoxbug.com/index.php/archives/2795/ 理解TIME_WAIT(2) http://www.firefoxbug. ...
- [转]BLAS简介
BLAS(Basic Linear Algebra Subprograms)是一组线性代数计算中通用的基本运算操作函数集合[1] .BLAS Technical (BLAST) Forum负责规范BL ...
- String s = new String("xyz");产生了几个对象?
面试官Q1:请问String s = new String("xyz");产生了几个对象? 对于这个问题,老套路先上代码: public class StringTest { pu ...
- Tomcat 七 HTTP 连接器
摘要 本文尝试翻译Tomcat官方文档Apache Tomcat 7连接器,不足之处敬请指正.该文先介绍了Tomcat7 HTTP连接器的属性,包括:公共属性.标准实现.Java TCP套接字属性.B ...