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和bashrc比较测试, 结论:bashrc文件可以在nologging状态下生效,而profile文件不可以
配置profile实现测试生产环境分离需要测试环境包时候gradlew assembleRelease-Dprofile=test (可加可不加) 如果需要别的环境gradlew assembleRelease -Dprofile=所对应的环境
PROFILE-测试及判读标准,监测PCB元件的温度,保证焊锡炉以最佳的参数设定连续地工作运行
蓝牙5.0的测试以及认证测试的详细过程,细分 蓝牙资格认证 蓝牙技术联盟 基本情况 设计认证 RF测试 Profile测试
在maven中实现多环境的构建可移植性需要使用profile,通过不同的环境激活不同的profile来达到构建的可移植性。
.profile(由Bourne Shell和Korn Shell使用)和.login(由C Shell使用)两个文件是.bash_profile的同义词,目的是为了兼容其它Shell。在Debian中使用.profile文件代 替.bash_profile文件。 2..bashrc文件会在bash shell...
Linux 环境变量配置文件 profile。。
VsCode配置-profile
C++6.0中profile选项为灰色的解决办法,及profile的使用
SpringBoot中的Profile配置的使用示例源码
使用Profile Prism生成打印机配置文件的简单步骤 由于扫描仪及扫描软件,打印机及打印软件的品牌众多,设置也相互不同。建议在阅读完下面简单步骤后,继续了解后面的详细说明。 1.运行打印软件(能识别色彩配置文件...
软件软件性能测试-profile软件测试1.Profile的作用帮助你分析并发现程序运行的瓶颈,找到耗时所在,同时也能帮助你发现不会被执行的代码。从而最终实现程序的优化。2.Profile的组成Profile包括3个命令行工具:PREP,...
使用maven Profile实现多环境构建,详细请参考 :http://blog.csdn.net/u011781521/article/details/77899467
如何在Flex中使用profile的教程
linux配置jdk环境变量的文件。
主要介绍了使用maven profile指定配置文件打包适用多环境的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
基本介绍了如何使用 VC6.0的profile
/etc/profile 每个用户,首次登录时被执行; /etc/bashrc 每个运行bash shell的用户都执行此文件,当bsh被打开时,该文件被读取; ~/.bash_profile 专用于本用户的shell信息,仅被执行一次; ~/.bashrc 文件包含本...
这些配置文件可以根据不同的环境进行分离和管理,Spring Boot提供了多种灵活的方式来实现多环境配置。 1. 配置文件的命名 默认配置文件:application.properties(或application.yml) 环境特定配置文件:...
2.这个程序具体的内容我忘了,只知道使用@Profile@Configuration@RestController@Autowired(设置环境配置类控制类)等方法写的,具体实现的功能就是新建一些.yml和.java以及接口类文件,实现在.yml文件中配置指定要...