• 1. MySQL Test Run(MTR)介绍以及官方包安装


    MySQL Test Run

    官方文档

    MySQL Test Run 简称 mtr,称为 Mysql自动测试框架
    MySQL Test 是 MySQL 发行版本中集成 all-in-one 测试框架,用于做 mysql 服务的单元,回归和一致性测试,并提供了运行单元测试和创建新单元测试的工具。框架包括一组测试用例和用于运行它们的程序:perl 脚本(mysql-test-run.pl)和 c++ 二进制(mysqltest)。perl 脚本:负责控制流程,包括启停、识别执行哪些用例、创建文件夹、收集结果等操作。
    MySQL自动测试框架是一个以MySQL框架和内部引擎为测试对象的工具。主要执行脚本在发布路径的mysql-test目录下。自动测试框架的主要测试步骤,是通过执行一个case,将该case的输出结果,与标准的输出结果作diff。
    这里的“标准输出结果”指代在可信任的MySQL版本上的执行结果。

    主要目录介绍

    include
    包含.inc文件,用于测试开始时判断是否满足测试条件,在测试用通过source命令引入
    如have_innodb.inc
    如不满足,则会跳过需要该验证的测试。
    suite
    包含所有测试suite,每一个suite为一个测试用例集

    安装与使用

    1. 源码安装

    1.1 下载源码包
    下载地址
    下载 mysql-boost-8.0.26.tar.gz
    1.2 编译安装
    安装需要的包
    如果是deepin系统

    sudo apt install cmake make gcc g++ libncurses5-dev
    
    • 1

    如果是centos

    sudo yum -y install cmake make gcc g++ libncurses5-dev
    
    • 1

    创建一个目录

    mkdir /home/great/mysql_mtr
    
    • 1

    将下载好的包解压到该目录

    tar -xvf mysql-boost-8.0.26.tar.gz -C /home/great/mysql_mtr
    
    • 1

    进入该目录进行编译

    cd /home/great/mysql_mtr/mysql-8.0.26
    mkdir bld
    cd bld
    cmake ..
    
    • 1
    • 2
    • 3
    • 4

    请注意观察cmake的结果是否有报错,如果是第一次编译,将会有boost的报错提示

    You can download it with -DDOWNLOAD_BOOST=1 -DWITH_BOOST=<directory>
    
    • 1

    将目录位置替换为 /tmp 再次cmake

    cmake .. -DDOWNLOAD_BOOST=1 -DWITH_BOOST=/tmp
    
    • 1

    出现config 完成之后就可以make

    make -j 10
    
    • 1

    notes:
    Boost库是一个可移植、提供源代码的C++库,作为标准库的后备,是C++标准化进程的开发引擎之一。

    1.3 使用

    安装好了我们可以开始使用了。

    测试用例编写的规范

    • 尽可能避免每行超过80个字符 ;
    • 用#开头,作为注释;
    • 缩进使用空格,避免使用tab;
    • SQL 语句使用相同的风格,包括关键字大写,其它变量、表名、列名等小写;
    • 增加合适的注释。特别是文件的开头,注释出测试的目的、可能的引用或者修复的bug编号;
    • 为了避免可能的冲突,习惯上表命名使用 t1、t2…视图命名使用v1、v2…;

    处理预期错误
    在期望有返回错误的语句前面使用error指令

    --error 1690
    select add_months('2000--12-1',-1e40) from dual;
    
    • 1
    • 2

    mtr的位置

    cd /home/mysql_mtr/mysql-8.0.26/bld
    
    • 1

    t 和 r 文件的位置

    cd /home/great/mysql_mtr/mysql-8.0.26/mysql-test/
    
    • 1

    测试
    在t目录创建两个xx.test 文件

    cd  /home/great/mysql_mtr/mysql-8.0.26/mysql-test/t
    
    vim a.test
    select 1;
    
    vim b.test
    select 2;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    在mtr目录执行测试

    cd /home/great/mysql_mtr/mysql-8.0.26/bld/mysql-test
    great@great-PC:~/mysql_mtr/mysql-8.0.26/bld/mysql-test$ ./mtr a.test
    Logging: /home/great/mysql_mtr/mysql-8.0.26/mysql-test/mysql-test-run.pl  a.test
    MySQL Version 8.0.26
    Checking supported features
    Using 'all' suites
    Collecting tests
    Checking leftover processes
    Removing old var directory
    Creating var directory '/home/great/mysql_mtr/mysql-8.0.26/bld/mysql-test/var'
    Installing system database
    Using parallel: 1
    
    ==============================================================================
                      TEST NAME                       RESULT  TIME (ms) COMMENT
    ------------------------------------------------------------------------------
    [ 33%] main.a                                    [ fail ]
            Test ended at 2021-07-21 09:33:52
    
    Result file '/home/great/mysql_mtr/mysql-8.0.26/mysql-test/r/a.result' doesn't exist.
    Either create a result file or disable check-testcases and run the test case. Use --nocheck-testcases option to disable check-testcases.
    
    
    Mysqltest client output from logfile
    ----------- MYSQLTEST OUTPUT START -----------
    
    select 1;
    1
    1
    
    ------------ MYSQLTEST OUTPUT END -----------
    
     - the logfile can be found in '/home/great/mysql_mtr/mysql-8.0.26/bld/mysql-test/var/log/main.a/a.log'
    
    
    Only  1  of 2 completed.
    mysql-test-run: *** ERROR: Not all tests completed
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37

    此时是错误的,因为在对应的r目录,就是我们存放xx.result 文件没有 a.result文件,无法进行对比,因此是fail的。
    我们执行这个命令

    great@great-PC:~/mysql_mtr/mysql-8.0.26/bld/mysql-test$ ./mtr --record a.test
    Logging: /home/great/mysql_mtr/mysql-8.0.26/mysql-test/mysql-test-run.pl  --record a.test
    MySQL Version 8.0.26
    Checking supported features
    Using 'all' suites
    Collecting tests
    Checking leftover processes
    Removing old var directory
    Creating var directory '/home/great/mysql_mtr/mysql-8.0.26/bld/mysql-test/var'
    Installing system database
    Using parallel: 1
    
    ==============================================================================
                      TEST NAME                       RESULT  TIME (ms) COMMENT
    ------------------------------------------------------------------------------
    [ 33%] main.a                                    [ pass ]       
    [ 66%] zhangyuling.a                             [ pass ]       
    [100%] shutdown_report                           [ pass ]       
    ------------------------------------------------------------------------------
    The servers were restarted 0 times
    The servers were reinitialized 0 times
    Spent 0.000 of 5 seconds executing testcases
    
    Completed: All 3 tests were successful.
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    会将a.result 文件自动生成到r目录,这样就不会报错了。我们去r目录检查

    great@great-PC:~/mysql_mtr/mysql-8.0.26/mysql-test/r$ pwd
    /home/great/mysql_mtr/mysql-8.0.26/mysql-test/r
    great@great-PC:~/mysql_mtr/mysql-8.0.26/mysql-test/r$ ll a.result 
    -rw-r--r-- 1 great great 14 721 09:35 a.result
    
    • 1
    • 2
    • 3
    • 4

    mtr 命令行参数的介绍
    –force
    默认情况下,只要遇到一个用例出错,测试程序就会退出,在指定force的情况下,测试程序会继续执行下面的测试(但是最多发现10个错误还是会退出)
    –record
    假设测试产生了输出文件,此时测试的结果一定是fail的,因为判断用例是否通过是判断运行的输出与结果文件是否一致。失败后会产生一个文件 r/test_name.reject。检查reject文件的内容,如果里面是期望的输出,则将内容拷贝到.result文件中,作为以后判断运行结果是否通过的依据。Mysql-test还提供了一个参数—record实现自动生成result文件的方式
    –big-test
    执行标记为big的测试用例。因为用例较大、耗时较长,标记为big的用例默认不会执行。输入两遍big-test则只执行标记为big的测试用例
    连接远程的数据库执行 mysql_test用例命令:

    ./mysql-test-run.pl --extern host=10.8.30.1 --extern port=7788 --extern user=root --extern password='uddbtest7788' 
    
    • 1

    host :远程服务器地址

    port:远程服务器端口

    paasswd:连接密码

    user:连接用户

    –suite
    指定执行的测试用例套件,有时候我们要执行一套xx.test文件,这样可以在执行时候指定套件名称。

    2. 安装包安装

    2.1 安装环境

    本次安装环境是CentOS 8.5

    yum -y install perl* -y
    
    • 1
      2.2 下载安装包并解压
    
    • 1

    本次采用的MySQL版本是8.0.28,可根据需要自行选择版本。

    cd  /home/
    wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-test-8.0.28-linux-glibc2.12-x86_64.tar.xz
    tar -xvf mysql-test-8.0.28-linux-glibc2.12-x86_64.tar.xz
    mv mysql-8.0.28-linux-glibc2.12-x86_64 mysql_mtr_8.0.28
    cd /home/mysql_mtr_8.0.28/
    cp -r /path-to-db/* /home/mysql_mtr_8.0.28/  #将mysql安装包目录下的文件与mtr目录合并
    cd /home/mysql_mtr_8.0.28/mysql-test #进入mtr目录
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
  • 相关阅读:
    安利一款免费的GIF录制软件,好用到飞起,装机必备。
    Apache HTTPD 多后缀解析漏洞
    Kali Linux渗透测试的艺术
    动手写sql 《牛客网80道sql》
    i++的错误使用
    手把手教你5种方法实现Java判断字符串是否为数字
    Java配置42-配置redis高可用(sentinel监控)
    软件项目可行性研究报告
    运行Android Automotive模拟器
    企业防护墙管理,有什么防火墙管理工具?
  • 原文地址:https://blog.csdn.net/shunnianlv/article/details/126406769