`
hyw520110
  • 浏览: 218642 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

使用Profile和Resources Filter隔离测试环境

阅读更多

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 ,其中包含了这样的内容:

 

Xml代码 复制代码 收藏代码
  1. <property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"/>  
  2.   
  3. <property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/test"/>  
  4.   
  5. <property name="hibernate.connection.username" value="test"/>  
  6.   
  7. <property name="hibernate.connection.password" value="test"/>  
    <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,因为数据库链接是很多模块的测试都会用到的,定义如下:

 

Xml代码 复制代码 收藏代码
  1. <profiles>  
  2.   
  3.   <profile>  
  4.   
  5.     <id>myProfile</id>  
  6.   
  7.     <properties>  
  8.   
  9.       <mysql.url>jdbc:mysql://localhost:3306</mysql.url>  
  10.   
  11.       <mysql.username>test</mysql.username>  
  12.   
  13.       <mysql.password>test</mysql.password>  
  14.   
  15.       <mysql.dbname>test</mysql.dbname>  
  16.   
  17.     </properties>  
  18.   
  19.   </profile>  
  20.   
  21. </profiles>  
  22.   
  23. <activeProfiles>  
  24.   
  25.   <activeProfile>myProfile</activeProfile>  
  26.   
  27. </activeProfiles>  
<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>

 

此外,修改资源文件如下:

 

Xml代码 复制代码 收藏代码
  1. <property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"/>  
  2.   
  3. <property name="hibernate.connection.url" value="jdbc:mysql://${mysql.url}/${mysql.dbname}"/>  
  4.   
  5. <property name="hibernate.connection.username" value="${mysql.username}"/>  
  6.   
  7. <property name="hibernate.connection.password" value="${mysql.password}"/>  
    <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 功能:

 

Xml代码 复制代码 收藏代码
  1. [...]   
  2. <resource>  
  3.   <directory>src/test/resources</directory>  
  4.   <filtering>true</filtering>  
  5. </resource>  
  6. [...]  
      [...]
      <resource>
        <directory>src/test/resources</directory>
        <filtering>true</filtering>
      </resource>
      [...]

 

至此,运行 mvn install ,Maven 会让 Resources 插件首先根据 setttings.xml 文件中的值填充测试资源文件中的变量,然后再运行测试。这种解决方案不仅仅适用于数据库,任何外部环境配置都可以使用该方案,如对消息服务器的依赖。尽情享受Maven给你带来的便利吧!

分享到:
评论

相关推荐

    maven profile多环境配置

    同时,我们还可以在 Profile 中定义其他环境的配置,例如测试环境和生产环境。 在 Maven 中,我们可以使用资源文件来存储环境相关的配置信息。这些资源文件可以存储在 `src/main/resources` 目录下。为了区分不同的...

    profile和bashrc比较测试.

    profile和bashrc比较测试, 结论:bashrc文件可以在nologging状态下生效,而profile文件不可以

    使用maven Profile实现多环境构建

    -- 这里可以定义测试环境特有的依赖、插件和配置 --&gt; &lt;/profile&gt; &lt;profile&gt; &lt;id&gt;prod &lt;name&gt;env &lt;value&gt;prod &lt;!-- 这里可以定义生产环境特有的依赖、插件和配置 --&gt; &lt;/profile&gt; ``` 激活Profile的...

    idea下test自动测试profiles配置

    6. **helloProfile的用途**:通常,`helloProfile`可能用于配置特定的测试环境,比如连接不同的数据库,或者包含特定的测试数据集。你可以根据项目需求,自定义`helloProfile`来满足各种自动化测试场景。 总结来说...

    SpringBoot中的Profile配置的使用示例源码

    在Spring Boot中,Profile配置是一项强大的特性,它允许我们在不同的环境下使用不同的配置,例如开发、测试和生产环境。本文将深入探讨Spring Boot中Profile的使用,并通过源码示例进行详细解析。 首先,理解...

    浅谈Maven环境隔离应用

    在pom.xml文件中,可以使用profiles节点和resources节点来实现环境隔离。 Maven环境隔离的优点是可以避免人工修改的错误,轻松地进行环境编译、打包和部署。同时,也可以根据不同的环境选择不同的配置文件,使得...

    maven利用Profile构建不同环境的部署包

    比如,我们可以在生产环境中启用代码混淆插件,而在开发和测试环境中则不需要。 激活Profile有多种方式:通过命令行参数 `-P`,在POM.xml中使用`activeProfiles`,或者通过Maven的settings.xml文件。例如,如果我们...

    ADRV9008-x-ADRV9009-profile-config-tool-filter-wizard-v2.4.zip

    《ADRV9008-x-ADRV9009-profile-config-tool-filter-wizard-v2.4.zip》是一个关于ADRV9008和ADRV9009射频收发器配置工具的压缩包,其中包含了一份用户指南和一个名为“FilterWizard_v2.4”的软件。这个工具主要用于...

    springboot通过@Profile注解配置不同环境

    在本案例中,我们将深入探讨如何使用`@Profile`注解以及结合Maven来实现多环境配置。 首先,`@Profile`注解用于标记一个类或方法,表示该类或方法只在指定的环境中生效。例如,我们可以为开发环境创建一个`...

    蓝牙5.0及蓝牙5.0设计认证,RF测试 、Profile测试

    Profile测试则是对蓝牙设备进行的功能性测试,它基于各种蓝牙应用配置文件(Profile)进行测试,保证设备在特定功能和应用上符合蓝牙技术标准。Profile测试通常包括对蓝牙设备的配对、连接、数据传输等操作的测试,...

    使用maven profile指定配置文件打包适用多环境的方法

    首先,在pom.xml文件中添加profile节点信息,以指定不同的环境 Profile,例如开发环境、测试环境、预演环境和生产环境等。每个Profile都可以包括不同的配置信息,例如数据库连接信息、日志配置信息等。 其次,在...

    Springboot与Maven多环境配置文件夹解决方案.docx

    本文介绍了如何使用 SpringBoot 和 Maven 实现多环境配置文件夹解决方案,使用 Profile 功能来加载不同的配置文件,使用 Resources 和 Filter 来指定打包内容和替换变量,选择当前环境,加载对应的配置文件。

    android配置profile实现环境切换

    配置profile实现测试生产环境分离需要测试环境包时候gradlew assembleRelease-Dprofile=test (可加可不加) 如果需要别的环境gradlew assembleRelease -Dprofile=所对应的环境

    SpringBoot开发环境、测试环境、部署环境切换.pdf

    SpringBoot在开发过程中,往往需要面对多个环境,如开发环境(Development)、测试环境(Testing)和生产环境(Production)。为了方便地在这些环境中切换配置,避免频繁手动修改配置文件,SpringBoot结合Maven的`...

    PROFILE-测试及判读标准

    PROFILE-测试及判读标准,监测PCB元件的温度,保证焊锡炉以最佳的参数设定连续地工作运行

    Linux环境变量profile

    Linux 环境变量配置文件 profile。。

    profile\bashrc\bash_profile之间的区别和联系

    在Linux系统中,环境变量和命令的设置是通过配置文件来完成的,这些配置文件包括`/etc/profile`, `/etc/bashrc`, `~/.bash_profile`以及`~/.bashrc`。理解它们的区别和联系对于优化用户环境和个性化设置非常重要。 ...

    使用Photoshop编辑数码打样的ICC Profile

    ICC(International Color Consortium)Profile,即国际色彩联盟配置文件,是色彩管理的核心,它用于确保不同设备间颜色的一致性和准确性。在数码打样过程中,正确使用ICC Profile至关重要,因为它能够保证从显示器...

    C++6.0中profile的配置使用

    以下是一个简单的示例,展示如何使用Profile功能测试两个不同函数的执行时间: - **函数1**:`Print100Hello`,打印100次“Hello”。 - **函数2**:`Print1000Hello`,打印1000次“Hello”。 从上面的示例输出可以...

    Linux中profile、bashrc、bash_profile之间的区别和联系

    .profile(由Bourne Shell和Korn Shell使用)和.login(由C Shell使用)两个文件是.bash_profile的同义词,目的是为了兼容其它Shell。在Debian中使用.profile文件代 替.bash_profile文件。 2..bashrc文件会在bash shell...

Global site tag (gtag.js) - Google Analytics