首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Travis:如何针对不同的MySQL后端运行测试?

问Travis:如何针对不同的MySQL后端运行测试?
EN

Stack Overflow用户
提问于 2018-05-08 16:06:12
回答 2查看 1.3K关注 0票数 0

如何使用一个.travis.yml文件对不同的MySQL后端运行测试?

类似于这里,使用matrix->include。例如:

  • 在MySQL 5.5上运行测试
  • 在MySQL 5.6上运行测试
  • 在MySQL 5.7上运行测试
  • 在MySQL 8.0上运行测试

我目前发现的是:

后一种说法

您还可以在支持sudo的Ubuntu上可靠地安装MySQL 5.7。

但没有提到如何使用5.6和5.7,例如。

可能的解决办法是(如果没有"Travis“方法来解决它):

  1. 方法:创建不同的Docker设置,每个设置都有一个特定的MySQL版本,并手动测试我的脚本。但是这会大大增加我的开发环境,而且很费时。
  2. 根据相关环境变量(例如,MySQL == 5.5),从源/通过apt安装所需的==服务器。使用某些配置来访问它。

感谢您的反馈!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-05-13 12:06:10

我将回答我自己的问题,但对其他方法持开放态度。

解决方案

以下解决方案基于来自.travis.yml项目的PyMySQL:https://github.com/PyMySQL/PyMySQL/blob/master/.travis.yml

您需要一个脚本和.travis.yml配置的组合。

脚本

如果要重用以下代码,请在项目中使用以下路径:.travis/install-and-init-db.sh

以下脚本以所需的版本安装数据库:

代码语言:javascript
复制
# debug
set -x
# verbose
set -v

if [ ! -z "${DB}" ]; then
    # disable existing database server in case of accidential connection
    sudo service mysql stop

    docker pull ${DB}
    docker run -it --name=mysqld -d -e MYSQL_ALLOW_EMPTY_PASSWORD=yes -p 3306:3306 ${DB}
    sleep 10

    mysql() {
        docker exec mysqld mysql "${@}"
    }
    while :
    do
        sleep 5
        mysql -e 'select version()'
        if [ $? = 0 ]; then
            break
        fi
        echo "server logs"
        docker logs --tail 5 mysqld
    done

    mysql -e 'select VERSION()'

    if [ $DB == 'mysql:8.0' ]; then
        WITH_PLUGIN='with mysql_native_password'
        mysql -e 'SET GLOBAL local_infile=on'
        docker cp mysqld:/var/lib/mysql/public_key.pem "${HOME}"
        docker cp mysqld:/var/lib/mysql/ca.pem "${HOME}"
        docker cp mysqld:/var/lib/mysql/server-cert.pem "${HOME}"
        docker cp mysqld:/var/lib/mysql/client-key.pem "${HOME}"
        docker cp mysqld:/var/lib/mysql/client-cert.pem "${HOME}"
    else
        WITH_PLUGIN=''
    fi

    mysql -uroot -e 'create database testdb DEFAULT CHARACTER SET utf8mb4'
else
    cat ~/.my.cnf

    mysql -e 'select VERSION()'
    mysql -e 'create database testdb DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;'
fi

.travis.yml

你必须使用矩阵->包含块。对于PHP,请参见以下代码。在上面提到的PyMySQL中,您将找到一种用于Python的方法。

代码语言:javascript
复制
sudo: required

language: php

services:
  - docker

matrix:
    fast_finish: true
    include:
        #
        # Define versions of MySQL and MariaDB to test against.
        #
        # mysql 5.5
        - php: 5.6
          env: DB=mysql:5.5
        - php: 7.0
          env: DB=mysql:5.5
        - php: 7.1
          env: DB=mysql:5.5
        - php: 7.2
          env: DB=mysql:5.5
        # mysql 5.6
        - php: 5.6
          env: DB=mysql:5.6
        # ...
        # mariadb 10.0
        - php: 5.6
          env: DB=mariadb:10.0
        - php: 7.0
          env: DB=mariadb:10.0
        - php: 7.1
          env: DB=mariadb:10.0
        - php: 7.2
          env: DB=mariadb:10.0
        # ...

before_script:
    #
    # install and init database (see matrix => include => env)
    #
    - ./.travis/install-and-init-db.sh

    #
    # setup and run tests
    #
    # Install composer packages, will also trigger dump-autoload
    - travis_retry composer install --no-interaction

script:
    - vendor/bin/phpunit --coverage-clover gen/coverage/clover.xml

创建和使用连接

使用以下参数创建到数据库服务器的连接:

代码语言:javascript
复制
$dbConfig = array(
    'db_name' => 'testdb',
    'db_user' => 'root',
    'db_pwd'  => '',
    'db_host' => '127.0.0.1',
);
票数 1
EN

Stack Overflow用户

发布于 2019-01-19 15:32:25

我以@k00ni链接到的脚本中的示例为例,并将其简化为一些简单的例子,因为我的测试不需要TLS或自定义用户。这是脚本

代码语言:javascript
复制
#!/bin/bash

if [ $MYSQL = 'system' ]; then
    exit
fi

# Derived from https://github.com/PyMySQL/PyMySQL/blob/master/.travis/initializedb.sh
set -e
sudo service mysql stop
docker pull ${MYSQL}
RUN_MYSQL="docker run -it --name=mysqld -d -e MYSQL_ALLOW_EMPTY_PASSWORD=yes -p 3306:3306"
export MYSQL_URI=db:mysql://root@127.0.0.1/information_schema

if [ $MYSQL == 'mysql:8.0' ]; then
    ${RUN_MYSQL} ${MYSQL} --default-authentication-plugin=mysql_native_password
else
    ${RUN_MYSQL} ${MYSQL}
fi

它导出MYSQL_URI,因此测试没有如何连接;根据您自己的测试进行适当修改。

这个脚本不需要等待MySQL完成启动,因为Sqitch测试需要一两分钟才能运行连接到数据库的测试。如果您的项目需要等待MySQL启动,请将其附加到脚本的末尾:

代码语言:javascript
复制
while ! docker exec mysqld mysqladmin ping --host localhost --silent &> /dev/null ; do
    echo "Waiting for database connection..."
    sleep 2
done

无论哪种方式,`.travis.yml如何创建一个构建阶段来运行多个版本的MySQL:

代码语言:javascript
复制
jobs:
  include:
    # https://hub.docker.com/_/mysql
    # https://hub.docker.com/_/mariadb
    - &mysql
      stage:  MySQL
      if: branch = master
      services: docker
      env: MYSQL=mysql:8.0
      before_install:
        - source dev/linux-mysql
        - source dev/linux-prereqs
      script:
        - LIVE_MYSQL_REQUIRED=1 prove -lr --directives --comments t/mysql.t
    - <<: *mysql
      env: MYSQL=mysql:5.7
    - <<: *mysql
      env: MYSQL=mysql:5.6
    - <<: *mysql
      env: MYSQL=mysql:5.5
    - <<: *mysql
      env: MYSQL=mariadb:10.4
    - <<: *mysql
      env: MYSQL=mariadb:10.3
    - <<: *mysql
      env: MYSQL=mariadb:10.2
    - <<: *mysql
      env: MYSQL=mariadb:10.1
    - <<: *mysql
      env: MYSQL=mariadb:10.0
    - <<: *mysql
      env: MYSQL=mariadb:5.5

有关它是如何结束的,请参阅这个建筑 (以及许多其他数据库测试)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50237943

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档