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 下载源码包
下载地址
下载 mysql-boost-8.0.26.tar.gz
1.2 编译安装
安装需要的包
如果是deepin系统
sudo apt install cmake make gcc g++ libncurses5-dev
如果是centos
sudo yum -y install cmake make gcc g++ libncurses5-dev
创建一个目录
mkdir /home/great/mysql_mtr
将下载好的包解压到该目录
tar -xvf mysql-boost-8.0.26.tar.gz -C /home/great/mysql_mtr
进入该目录进行编译
cd /home/great/mysql_mtr/mysql-8.0.26
mkdir bld
cd bld
cmake ..
请注意观察cmake的结果是否有报错,如果是第一次编译,将会有boost的报错提示
You can download it with -DDOWNLOAD_BOOST=1 -DWITH_BOOST=<directory>
将目录位置替换为 /tmp 再次cmake
cmake .. -DDOWNLOAD_BOOST=1 -DWITH_BOOST=/tmp
出现config 完成之后就可以make
make -j 10
notes:
Boost库是一个可移植、提供源代码的C++库,作为标准库的后备,是C++标准化进程的开发引擎之一。
1.3 使用
安装好了我们可以开始使用了。
测试用例编写的规范
处理预期错误
在期望有返回错误的语句前面使用error指令
--error 1690
select add_months('2000--12-1',-1e40) from dual;
mtr的位置
cd /home/mysql_mtr/mysql-8.0.26/bld
t 和 r 文件的位置
cd /home/great/mysql_mtr/mysql-8.0.26/mysql-test/
测试
在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;
在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
此时是错误的,因为在对应的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.
会将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 7月 21 09:35 a.result
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'
host :远程服务器地址
port:远程服务器端口
paasswd:连接密码
user:连接用户
–suite
指定执行的测试用例套件,有时候我们要执行一套xx.test文件,这样可以在执行时候指定套件名称。
2.1 安装环境
本次安装环境是CentOS 8.5
yum -y install perl* -y
2.2 下载安装包并解压
本次采用的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目录