在一篇里我们使用的是H2数据库,这是为了让你免去你去安装/配置一个数据库的工作,能够尽快的了解到集成测试的过程。
在文章里也说了:
在真实的开发环境中,集成测试用数据库应该和最终的生产数据库保持一致
那么很容易就能想到两种解决方案:
- 开发团队使用共用同一个数据库。这样做的问题在于:当有多个集成测试同时在跑时,会产生错误的测试结果。
- 每个人使用自己的数据库。这样做的问题在于让开发人员维护MySQL数据库挺麻烦的。
那么做到能否这样呢?
- 测试启动前,创建一个MySQL数据库
- 测试过程中连接到这个数据库
- 测试结束后,删除这个MySQL数据库
So, Docker comes to the rescue。
我们还是会以里的FooRepositoryImpl
来做集成测试()。下面来讲解具体步骤:
安装Docker
请查阅官方文档。并且掌握Docker的基本概念。
配置fabric8 docker-maven-plugin
顾名思义就是一个能够使用docker的maven plugin。它主要功能有二:
我们这里使用启动Docker container的功能。
大致配置如下
io.fabric8 docker-maven-plugin 0.28.0 mysql:8 docker-mysql.port:3306 123456 test foo bar MySQL init process done. Ready for start up. start pre-integration-test start stop post-integration-test stop
配置maven-failsafe-plugin
org.apache.maven.plugins maven-failsafe-plugin integration-test integration-test verify verify jdbc:mysql://localhost:${docker-mysql.port}/test foo bar
执行
三种常见用法:
-
mvn clean integration-test
,会启动docker container、运行集成测试。这个很有用,如果集成测试失败,那么你还可以连接到MySQL数据库查看情况。 -
mvn clean verify
,会执行mvn integration-test
、删除docker container。 -
mvn clean install
,会执mvn verify
,并将包安装到本地maven 仓库。
下面是mvn clean verify
的日志:
...[INFO] --- docker-maven-plugin:0.28.0:start (start) @ spring-test-examples-rdbs-docker ---[INFO] DOCKER> [mysql:8]: Start container f683aadfe8ba[INFO] DOCKER> Pattern 'MySQL init process done. Ready for start up.' matched for container f683aadfe8ba[INFO] DOCKER> [mysql:8]: Waited on log out 'MySQL init process done. Ready for start up.' 13717 ms[INFO][INFO] --- maven-failsafe-plugin:2.22.1:integration-test (integration-test) @ spring-test-examples-rdbs-docker ---[INFO][INFO] -------------------------------------------------------[INFO] T E S T S[INFO] -------------------------------------------------------...[INFO][INFO] Results:[INFO][INFO] Tests run: 2, Failures: 0, Errors: 0, Skipped: 0[INFO][INFO][INFO] --- docker-maven-plugin:0.28.0:stop (stop) @ spring-test-examples-rdbs-docker ---[INFO] DOCKER> [mysql:8]: Stop and removed container f683aadfe8ba after 0 ms[INFO][INFO] --- maven-failsafe-plugin:2.22.1:verify (verify) @ spring-test-examples-rdbs-docker ---[INFO] ------------------------------------------------------------------------[INFO] BUILD SUCCESS[INFO] ------------------------------------------------------------------------...
可以看到fabric8 dmp在集成测试前后start和stop容器的相关日志,且测试成功。
如何找到MySQL的端口开在哪一个呢?运行docker ps
查看端口(注意下面的0.0.0.0:32798->3306/tcp
):
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESa1f4b51d7c75 mysql:8 ... ... Up 19... 33060/tcp, 0.0.0.0:32798->3306/tcp mysql-1