转自: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隔离测试环境的更多相关文章

  1. Maven Filter与Profile隔离生产环境与开发环境

    Maven Filter与Profile隔离生产环境与开发环境 在不同的开发阶段,我们一般用到不同的环境,开发阶段使用开发环境的一套东西,测试环境使用测试环境的东西,可能有多个测试环境,生产环境使用的 ...

  2. maven 根据profile,resources,filters来区分部署环境

    项目过程中,在不同的阶段,分别需要部署开发环境,测试环境,线上环境.如果都用一套配置文件,很容易弄乱,所以维持多套配置文件很有必要. maven提供了一组属性以供开发人员灵活搭配,可以根据环境来打包, ...

  3. maven根据profile,resources,filters来区分部署环境

    项目过程中,在不同的阶段,分别需要部署开发环境,测试环境,线上环境.如果都用一套配置文件,很容易弄乱,所以维持多套配置文件很有必要. maven提供了一组属性以供开发人员灵活搭配,可以根据环境来打包, ...

  4. 【Spring】使用@Profile注解实现开发、测试和生产环境的配置和切换,看完这篇我彻底会了!!

    写在前面 在实际的企业开发环境中,往往都会将环境分为:开发环境.测试环境和生产环境,而每个环境基本上都是互相隔离的,也就是说,开发环境.测试环境和生产环境是互不相通的.在以前的开发过程中,如果开发人员 ...

  5. 转 通过 spring 容器内建的 profile 功能实现开发环境、测试环境、生产环境配置自动切换

                                      软件开发的一般流程为工程师开发 -> 测试 -> 上线,因此就涉及到三个不同的环境,开发环境.测试环境以及生产环境,通常 ...

  6. maven profile切换正式环境和测试环境

    有时候,我们在开发和部署的时候,有很多配置文件数据是不一样的,比如连接mysql,连接redis,一些properties文件等等 每次部署或者开发都要改配置文件太麻烦了,这个时候,就需要用到mave ...

  7. 【POM】maven profile切换正式环境和测试环境

    有时候,我们在开发和部署的时候,有很多配置文件数据是不一样的,比如连接mysql,连接redis,一些properties文件等等 每次部署或者开发都要改配置文件太麻烦了,这个时候,就需要用到mave ...

  8. Dubbo测试环境服务调用隔离这么玩对么

    背景阐述 前几天,有位同学问我一个关于 Dubbo 的问题.他的诉求是这样子的: 诉求一 第一个诉求是本地开发的时候想自己调用自己的服务,比如自己在改 A 服务,然后出问题了,本地再启动一个 B 服务 ...

  9. spring boot使用profile来区分正式环境配置文件与测试环境配置文件

    转载请在页首注明作者与出处 一:前言 经常在开发的时候,项目中的配置文件,在个人开发的时候有一套配置文件,在测试环境有一套配置文件,在正式环境有一套配置文件,这个时候如果配置文件复杂,需要改的东西就特 ...

随机推荐

  1. 用一颗学美术的心来理解PID调节

    用一颗学美术的心来理解PID调节 泡利 3 个月前 相信大家小时候都画过美术作品吧?(什么?你还是宝宝?)没关系,不管你是文科.理科.工科.艺术还是家里蹲的,这篇文章对你来说一定会简单到爆炸的. 这种 ...

  2. Linux中ls -l(ll)返回结果中的文件访问权限-rw-r--rw-

    linux文件访问权限(像rw-r--rw-是什么意思)   Linux的文件访问权限分为 读.写.执行三种 r:可读(4) w:可写(2)对目录来说则可新建文件 x:可执行(1)对目录来说则可进入该 ...

  3. [原创]zabbix工具介绍,安装及使用

    [原创]zabbix工具介绍,安装及使用 http://waringid.blog.51cto.com/65148/955939/

  4. IAAS、SAAS 和 PAAS 的区别、理解

    通俗的讲: 如果你是一个网站站长,想要建立一个网站.不采用云服务,你所需要的投入大概是:买服务器,安装服务器软件,编写网站程序.现在你追随潮流,采用流行的云计算,如果你采用IaaS服务,那么意味着你就 ...

  5. Java虚拟机的最大内存是多少

    天分析了当前比较流行的几个不同公司不同版本JVM的最大内存,得出来的结果如下: 公司 JVM版本 最大内存(兆)client 最大内存(兆)server SUN 1.5.x 1492 1520 SUN ...

  6. AngularJS中监视Scope变量以及外部调用Scope方法

    在AngularJS中,有时候需要监视Scope中的某个变量,因为变量的改变会影响一些界面元素的显示.有时,也希望通过jQuery调用Scope的某个方法. 比如以下场景: <div> & ...

  7. IntelliJ IDEA2018.1、2017.3破解教程

    (1)下载破解补丁 把下载的破解补丁放在你的idea的安装目录下的bin的目录下面(如下图所示),本文示例为G:\idea\IntelliJ IDEA 2017.3.4 破解补丁下载:http://i ...

  8. App架构师实践指南四之性能优化一

    App架构师实践指南四之性能优化一     1.性能维度常见用来衡量App性能的维度如图9-1所示.其中,性能指标包括电池(电量/温度).流量(上行流量/下行流量等).CPU(平均/最大/最小).内存 ...

  9. Android典型界面设计(3)——访网易新闻实现双导航tab切换

    一.问题描述 双导航tab切换(底部区块+区域内头部导航),实现方案底部区域使用FragmentTabHost+Fragment, 区域内头部导航使用ViewPager+Fragment,可在之前博客 ...

  10. 微信小程序 多个视频播放器

    大致思路就是,wx:for="{{ list }}"下两个view,一个视频video,另一个封面image(客户需求,要可以自定义封面).主要控制变量是playIndex,当点击 ...