前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Spring、Spring Boot和TestNG测试指南 - 集成测试中用Docker创建数据库

Spring、Spring Boot和TestNG测试指南 - 集成测试中用Docker创建数据库

作者头像
颇忒脱
发布2019-03-13 16:33:46
1.1K0
发布2019-03-13 16:33:46
举报
文章被收录于专栏:颇忒脱的技术博客

测试关系型数据库一篇里我们使用的是H2数据库,这是为了让你免去你去安装/配置一个数据库的工作,能够尽快的了解到集成测试的过程。

在文章里也说了:

在真实的开发环境中,集成测试用数据库应该和最终的生产数据库保持一致

那么很容易就能想到两种解决方案:

  1. 开发团队使用共用同一个数据库。这样做的问题在于:当有多个集成测试同时在跑时,会产生错误的测试结果。
  2. 每个人使用自己的数据库。这样做的问题在于让开发人员维护MySQL数据库挺麻烦的。

那么做到能否这样呢?

  1. 测试启动前,创建一个MySQL数据库
  2. 测试过程中连接到这个数据库
  3. 测试结束后,删除这个MySQL数据库

So, Docker comes to the rescue。

我们还是会以测试关系型数据库里的FooRepositoryImpl来做集成测试(代码在这里)。下面来讲解具体步骤:

安装Docker

请查阅官方文档。并且掌握Docker的基本概念。

配置fabric8 docker-maven-plugin

farbic8 docker-maven-plugin顾名思义就是一个能够使用docker的maven plugin。它主要功能有二:

  1. 创建Docker image
  2. 启动Docker container

我们这里使用启动Docker container的功能。

大致配置如下

代码语言:javascript
复制
 <plugin>
   <groupId>io.fabric8</groupId>
   <artifactId>docker-maven-plugin</artifactId>
   <version>0.28.0</version>

   <configuration>
     <images>
       <image>
         <!-- 使用mysql:8 docker image -->
         <name>mysql:8</name>
         <!-- 定义docker run mysql:8 时的参数 -->
         <run>
           <ports>
             <!-- host port到container port的映射
             这里随机选择一个host port,并将值存到property docker-mysql.port里 -->
             <port>docker-mysql.port:3306</port>
           </ports>
           <!-- 启动时给的环境变量,参阅文档:https://hub.docker.com/_/mysql -->
           <env>
             <MYSQL_ROOT_PASSWORD>123456</MYSQL_ROOT_PASSWORD>
             <MYSQL_DATABASE>test</MYSQL_DATABASE>
             <MYSQL_USER>foo</MYSQL_USER>
             <MYSQL_PASSWORD>bar</MYSQL_PASSWORD>
           </env>
           <!-- 设置判定container启动成功的的条件及timeout -->
           <wait>
             <!-- 如果container打出了这行日志,则说明容器启动成功 -->
             <log>MySQL init process done. Ready for start up.</log>
             <time>120000</time>
           </wait>
         </run>
       </image>
     </images>
   </configuration>

   <executions>
     <execution>
       <!-- 在集成测试开始前启动容器 -->
       <id>start</id>
       <phase>pre-integration-test</phase>
       <goals>
         <goal>start</goal>
       </goals>
     </execution>
     <execution>
       <!-- 在集成测试结束后停止并删除容器 -->
       <id>stop</id>
       <phase>post-integration-test</phase>
       <goals>
         <goal>stop</goal>
       </goals>
     </execution>
   </executions>
 </plugin>

配置maven-failsafe-plugin

代码语言:javascript
复制
<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-failsafe-plugin</artifactId>
  <executions>
    <execution>
      <id>integration-test</id>
      <goals>
        <goal>integration-test</goal>
      </goals>
    </execution>
    <execution>
      <id>verify</id>
      <goals>
        <goal>verify</goal>
      </goals>
    </execution>
  </executions>
  <configuration>
    <!-- 我们被测的是一个Spring Boot项目,因此可以通过System Properties把MySQL container的相关信息传递给程序
    详见文档:https://docs.spring.io/spring-boot/docs/1.5.4.RELEASE/reference/html/boot-features-external-config.html
    -->
    <systemPropertyVariables>
      <spring.datasource.url>jdbc:mysql://localhost:${docker-mysql.port}/test</spring.datasource.url>
      <spring.datasource.username>foo</spring.datasource.username>
      <spring.datasource.password>bar</spring.datasource.password>
    </systemPropertyVariables>
  </configuration>
</plugin>

执行

三种常见用法:

  • mvn clean integration-test,会启动docker container、运行集成测试。这个很有用,如果集成测试失败,那么你还可以连接到MySQL数据库查看情况。
  • mvn clean verify,会执行mvn integration-test、删除docker container。
  • mvn clean install,会执mvn verify,并将包安装到本地maven 仓库。

下面是mvn clean verify的日志:

代码语言:javascript
复制
...
[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):

代码语言:javascript
复制
CONTAINER ID  IMAGE     COMMAND  CREATED  STATUS    PORTS                                NAMES
a1f4b51d7c75  mysql:8   ...      ...      Up 19...  33060/tcp, 0.0.0.0:32798->3306/tcp   mysql-1

参考文档

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 安装Docker
  • 配置fabric8 docker-maven-plugin
  • 配置maven-failsafe-plugin
  • 执行
  • 参考文档
相关产品与服务
容器镜像服务
容器镜像服务(Tencent Container Registry,TCR)为您提供安全独享、高性能的容器镜像托管分发服务。您可同时在全球多个地域创建独享实例,以实现容器镜像的就近拉取,降低拉取时间,节约带宽成本。TCR 提供细颗粒度的权限管理及访问控制,保障您的数据安全。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档