如何为功能测试设置MySQL数据库

44次阅读
没有评论

问题描述

在开发中面临一个需求,他们有三个不同的开发环境:sandbox、staging和production。每个环境都有自己的MySQL数据库(AWS RDS),以为相应的代码库提供支持。每个环境的数据库URL都在对应的application-<environment>.yaml属性文件中定义。例如,sandbox环境的数据库URL位于application-sandbox.yaml文件中,格式如下,这是我们RDS实例的URL。

spring:
  datasource:
    url: jdbc:mysql://sbox.rds.mycompany.com:3306/my_db?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true

他们的ECS集群中也有每个环境的实例,当容器在ECS环境中启动时,它们会使用一个变量让Spring Boot知道它在哪个环境中,并在启动时加载相应的application-<environment>.yaml文件。因此,sandbox容器将加载包含上述URL的application-sandbox.yaml文件,以了解要连接哪个数据库。

现在,他们希望实现功能测试,每个功能将拥有自己的环境,以将其与其他功能和上述3个环境隔离开来。他们希望每个功能都有自己的数据库,但不希望使用RDS,而是希望在容器中安装MySQL,并在其中拥有sandbox数据库的副本。每个功能的数据库将具有其自己的唯一URL。

用户的问题是,如何在每个功能中以编程方式设置这个数据库URL,而不必每次为每个功能更改application-<environment>.yaml文件的值?

解决方案

请注意以下操作注意版本差异及修改前做好备份。

方案1

在这个情况下,可以考虑在每个功能环境中使用不同的Spring配置文件,而不必每次更改application-<environment>.yaml文件。以下是一种实现方式:

  1. 针对每个功能,创建一个单独的Spring配置文件,例如:application-feature1.yamlapplication-feature2.yaml等,每个文件中包含对应功能的数据库URL,以及其他配置。
  2. 在启动功能测试时,指定要使用的功能配置文件,这样Spring Boot将根据指定的配置文件加载相应的配置。
  3. 将配置文件的路径或名称作为一个环境变量传递给功能测试的容器,容器启动时读取这个环境变量并使用对应的配置文件。

以下是一个示例的Docker Compose配置,用于启动功能测试容器,并传递功能配置文件路径作为环境变量:

version: '3'
services:
  feature_test:
    image: your_feature_test_image:latest
    environment:
      - SPRING_CONFIG_LOCATION=/path/to/your/application-feature1.yaml
    # 其他容器配置

在这个示例中,我们通过SPRING_CONFIG_LOCATION环境变量指定了要使用的功能配置文件的路径。在功能测试容器内,Spring Boot将根据这个配置文件来加载数据库URL以及其他配置。

方案2

另一种方式是在功能测试容器启动时,通过脚本修改application-<environment>.yaml文件中的数据库URL。以下是一个示例的bash脚本,可以在功能测试容器启动时动态修改application-sandbox.yaml文件中的数据库URL:

#!/bin/bash
# 获取传递给脚本的功能名称
feature_name=$1
# 修改sandbox配置文件中的数据库URL
sed -i "s|jdbc:mysql://sbox.rds.mycompany.com:3306/my_db|jdbc:mysql://feature-${feature_name}.sandbox.mycompany.com:3306/feature_db|g" /path/to/your/application-sandbox.yaml
# 启动功能测试容器
docker run -d --name feature_test_${feature_name} -v /path/to/your/application-sandbox.yaml:/path/to/your/application-sandbox.yaml your_feature_test_image:latest

在这个示例中,我们通过传递功能名称作为脚本参数,然后使用sed命令修改sandbox配置文件中的数据库URL,将其替换为与功能名称相关的唯一URL。然后使用docker run命令启动功能测试容器,并将修改后的sandbox配置文件挂载到容器中。

请根据具体的环境和需求选择适合的方案,确保每个功能拥有独立的数据库URL,以实现功能测试的目标。

正文完