目录
MySQL Test Run测试工具使用手册
一、前言
二、适用范围
三、MySQL Test Run简介
3.1框架介绍
3.2目录介绍
四、MTR安装部署
4.1获取安装包
4.2安装MTR测试工具
五、MTR使用方法
5.1编写MTR测试脚本
5.2执行MTR测试脚本
5.3查看result文件并再次执行测试用例
六、MTR测试工具常用的命令
6.1执行命令常用参数
6.2编写测例常用参数
6.3其他
七、MTR测例编写规范
八、MTR测试工具中常出现的问题
8.1执行MTR命令失败的可能原因
8.2编写的Case运行失败的可能原因
九、MTR测试工具总结
十、附录
10.1在GreatDB Cluster中部署官方MTR
一、前言
本文档介绍了MTR(MySQL Test Run)的架构、安装部署、测例编写方法、常用命令、参数以及常见问题解决方案等内容,测试方法为使用MTR进行远程连接集群测试,MTR构建集群进行本地测试内容有待后续完善。
此次是在现有的集群环境上使用MySQL MTR远程集群进行测试(利用MySQL MTR测试工具进行搭建集群等方法,有待后续补充完善)。
二、适用范围
ALL
三、MySQL Test Run简介
MySQL Test Run 简称MTR,是MySQL官方提供的自动化测试框架,执行脚本在发布路径的mysql-test目录下。 主要测试步骤,是通过执行一个case(.test)中的语句(包括sql语句和其他管理语句),将case的输出记录保存在结果文件(.result)中,或者是将语句执行结果与标准的输出结果作diff,如果出现偏差就会报错。 MySQL自动化框架包括一组测试用例和用于运行它们的程序:perl 脚本(mysql-test-run.pl)和 c++ 二进制(mysqltest)。 • perl 脚本:负责控制流程,包括启停、识别执行哪些用例、创建文件夹、收集结果等操作。 • mysqltest:负责执行测试用例,包括读文件,解析特定语法,执行用例。
3.1框架介绍
MTR全称mysql-test-run,是MySQL自带的黑盒测试工具,具体的执行程序是mysql-test-run.pl。mysql-test-run.pl典型执行命令如下:
上面执行了mysql-test/suite/greatdb/t/1st.test测例文件。
MTR测试框架的主要执行流程:
1、根据测例的配置文件*.cnf文件,启动mysqld数据库服务
2、启动bin/mysqltest程序 :
a.执行文件为1st.test测例文件
b.将执行结果写入临时文件tmp.result
c.将tmp.result与1st.result文件进行比对,已校验测例是否通过。
3、所以一个测例由两部分组成:
a、test文件:用于执行
b、result文件:用于结果比对
3.2目录介绍
执行程序:
1、mysql-test-run.pl : 测例启动程序
a、搜集测例
b、启动mysqld
c、启动mysqltest进行测例验证
2、mtr: mysql-test-run.pl 的软连接
3、mysqltest : 真正执行测例的程序
4、lib:供mysql-stress-test.pl 使用相关库。
5、Include: 用于编写测例的一些封装好的程序。可以直接在test测例中source相关的文件。
main test suite:
测试相关程序及测例文件都在mysql-test目录下。
1、mysql-test/t:main的test suite目录
2、mysql-test/r:main的test suite的结果文件
suite目录:
mysqltest按照不同的功能,将测例划分在不同的suite下面。即对应mysql-test/suite下面不同的目录。每个具体的suite下面会有t和r两个目录,分别存放test文件和result文件。
Greatdb suite目录:
1、Include: 针对greatdb cluster的定义好的一些测试文件,可以被test文件直接引用。最常用的是setup_cluster.inc和teardown_cluster.inc两个文件。
2、combinations: 针对相同的测例,可以测试不同的mysqld参数组合。
3、my.cnf, my_nine.cnf:mysqld的启动配置文件,可以一次启动多个mysqld。
4、t:test测例目录
a、suite.opt:mysqld的bootstrap相关参数。
5、r : result文件目录
四、MTR安装部署
4.1获取安装包
1、首先获取MySQL MTR安装包:
a、mtr-for-greatdb(此处是适配GreatDB Cluster版本的安装包,官方版本的使用方法,可以看文章末尾,使用方法都是大同小异的)
2、获取需要测试的集群安装包,因测试集群版本都不相同,此处就不附加链接。
4.2安装MTR测试工具
4.2.1现有的集群上进行安装
a、将安装包mv到集群安装目录中
mv mtr-for-greatdb-master.tar.gz /greatdb/svr/greatdb
b、进入到集群目录中:
cd /greatdb/svr/greatdb
c、解压mtr-for-greatdb-master.tar.gz
tar –zxvf mtr-for-greatdb-master.tar.gz
d、重命名解压文件
mv mtr-for-greatdb-master mysql-test
e、进入到mysql-test目录中,执行脚本,将greatsqld等程序修改为mysqld
sh mtr_prepare.sh
f、MySQL MTR测试工具安装完成
4.2.2无集群环境下安装
a、自定义集群安装包路径后,解压集群安装包
tar –zxvf 集群安装包
b、解压mtr-for-greatdb-master.tar.gz到集群目录中
tar –zxvf mtr-for-greatdb-master.tar.gz –C 集群解压目录
c、重命名MySQL MTR解压文件
mv mtr-for-greatdb-master mysql-test
d、进入到mysql-test目录中,执行脚本,将greatsqld等程序修改为mysqld
sh mtr_prepare.sh
e、MySQL MTR测试工具安装完成
五、MTR使用方法
这里只讲MySQL MTR基本的使用过程,更多实用的参数可以参考本文第七章节MySQL MTR测试工具常用的命令。
5.1编写MTR测试脚本
1、进入到mysql-test/suite/greatdb/t中
2、在进入目录中,不难发现已经存在了几个已经编写好的测试用例,可以进行编写的参考,现在开始进行测例的编写:
测试示例
在t目录下创建一个名为mytest.test的测试用例:
#vim mytest.test
这样一个简单的测试用例就已经创建完成了,内容也很简单进行表的创建,并往表中插入数据,如有更复杂的测试用例,按照逻辑进行一一的编写即可。
5.2执行MTR测试脚本
1、我们回到mysql-test目录下,在此目录下,有MTR的执行脚本
2、开始输入远程数据库的执行命令,并选择我们所需要执行的测试用例,如下:
./mtr --extern user=greatdb --extern password=‘greatdb’ --extern host=127.0.0.1 --extern port=3306 --extern socket=/PATH/mysql.sock --suite=greatdb mytest.test --record
3、执行上述的操作命令,查看测试用例执行情况。
提示successful,此测试脚本执行成功,并生成了result结果文件,可以在suite/greatdb/r/mytest.result查看。
5.3查看result文件并再次执行测试用例
1、查看mytest.result文件,是否符合预期
#vim suite/greatdb/r/mytest.result
2、将执行命令中的record参数删除,再次执行命令,查看执行情况
./mtr --extern user=greatdb --extern password=‘greatdb’ --extern host=127.0.0.1 --extern port=3306 --extern socket=/PATH/mysql.sock --suite=greatdb mytest.test
我们也是可以看到执行成功了,这次不加record是为了和之前生成的result文件进行对比,查看是否有区别,而回归测试便是和result文件进行对比,查看新版本是否有改动。
六、MTR测试工具常用的命令
这里也是我总结了一些,在日常的执行命令及编写测试用例中,比较实用的参数,可以尽量的提高我们的工作效率,和规避一些不知道怎么处理的地方,可能会有疏忽的地方,欢迎大家多多补充,想要查看更多的可以参考下面的链接:https://dev.mysql.com/doc/dev/mysql-server/latest/PAGE_MYSQL_TEST_COMMANDS.html。
如果想要知道一些现成写好的一些case文件的话,可以安装MySQL MTR的官方版本,在官方版本中,有很多已经写好的case可以进行参考。
6.1执行命令常用参数
1、–extern
一般情况下mtr是启动自己的MySQL服务来进行测试,如果在启动时指定参数—extern,则可以使用指定的MySQL服务进行测试, host | port :远程服务器地址 | 端口,
user | password: 对应数据库的用户名 | 密码。
#./mtr --extern user=greatdb --extern password=‘greatdb’ --extern host=127.0.0.1 --extern port=3306 --extern socket=/PATH/mysql.sock
(socket可以不用加,我的建议是远程的连接的话,在一些测试用例,不加socket参数下会有问题,因为会自动给你生成一个socket的路径,这个路径大概率和数据库的路径不一致,所以会导致出现问题)
2、–record 是否记录results结果,让其自动生成.results文件再修改成我们预期的结果文件,首次执行必须添加此参数,不然没有diff的对象。
若一个执行输出结果和testname.result文件不同,会生成一个testname.reject文件,该文件在下次执行成功之后被删除;检查reject文件的内容,如果里面是期望的输出,则将内容拷贝到.result文件中,作为以后判断运行结果是否通过的依据。
3、–suite=[dirname] 批量执行指定测试目录下的所有测试例,有时候我们要执行一套xx.test文件,这样可以在执行的时候指定套件名称。
4、–force 默认情况下,只要遇到一个用例出错,测试程序就会退出,加入该参数后,mtr会忽略错误并继续执行下一个case直到所有case执行结束再退出(但如果脚本存在太多错误还是会退出)。
5、–big-test 执行标记为big的测试用例,因为用例较大、耗时较长,标记为big的用例默认不会执行,输入两遍big-test则只执行标记为big的测试用例。
6、–do-test(支持正则表达式)
./mtr –do-test=events 执行以events开头的所有case,包括events_grant.test 等,等效于./mtr --do-test=events.* ,所以如果想测试所有的包括event的case,可以用 ./mtr --do-test=.event.。
7、–skip-test
./mtr --skip-test=events, 将以events打头的所有case跳过不执行,执行剩余的所有case。
8、–parallel
./mtr –parallel=auto 则可以多线程的执行我们所要执行的case。例如在跑多个case,则可以加上此参数,更快的进行测试,如下图:
但是需要注意的是,多个case之间尽量不要使用同一个数据进行测试,否则会出现问题,因为是同时在进行测试,所以尽量要区分开来,否则可能会单独跑没有问题,开并行跑就会报错。
9、–mysqld
./mtr --mysqld=–skip-innodb --mysqld=–key_buffer_size=16384向mysqld传递两个参数–skip-innodb和–key_buffer_size=16384,注意修改—mysqld需要写两次。
10、–combination
使用–combination传递,效果是连续运行两次,分别使用其中一行的参数传给mysqld。如果只有一行,那么与—mysqld是一样的,大概可以理解为,一个case测例,在不同的combination下,所测试的结果。
执行说明:
这两个参数的使用,可以是范围性的,从case文件的开头至结尾,也可以是单独针对一条SQL语句进行,具体的使用方法还需要结合实际情况。
3、–error
处理期望的错误输出,在期望有返回错误的前面使用error指令,例如创建一个已经存在的表名时,可以任选下面任一种方式:
–error 1050 --error ER_TABLE_EXISTS_ERROR 在其中数字对应错误码,ER_TABLE_EXISTS_ERROR对应错误的逻辑名。这样在mysqltest运行后,会将返回的错误信息一起写入结果文件,错误信息就作为期望结果的一部分。
也可以使用SQLSTATE来指示期望有错误返回,例如与Mysql错误码1050关联的SQLSTATE值是42S01,使用下面的方式,注意编码增加了S前缀: --error S42S01
在指令error后面是可以加入多个错误码作为参数的,使用逗号分隔即可。
错误码及逻辑值的对应关系参考Mysql源代码include目录下的mysqld_error.h 和sql_state.h。
4、–enable_info
打开输出执行SQL语句的结果信息,此参数默认是关闭的。
4、–disable_info
关闭输出执行SQL语句的结果信息,此参数默认是关闭的,如没有搭配enable_info的话,就不用单独开启此参数,例如下图:
5、–replace_column col_num value [col_num value] …
替换下一条语句的输出中的字符串。col_num中的值被相应的值替换。可以有多个col_num/value对,列号从 1 开始。请注意无需使用逗号分隔,如下图:
将输出列的值替换为XXXXXXXXXXXXXXXXXXX,当然也可以替换成其他的形式。
6、–sorted_result
如果生成结果集,则对下一条语句的输出进行排序。sorted_result 仅在显示结果之前应用,在可能已指定的任何其他结果修饰符之后应用,例如 replace_result 或replace_column 。如果下一条语句没有生成结果集,则 sorted_result 无效,因为没有要排序的内容。
7、–replace_result from_val to_val [from_val to_val] …
替换结果中的字符串。每次出现 from_val 都会被相应的 to_val 替换。可以有多个from_val/to_val对。参数可以用单引号或双引号引起来。参数中的变量引用在替换发生之前展开。值按字面意思匹配。要使用模式匹配,请使用replace_regex命令。
8、–replace_regex /pattern/replacement/ [i] …
在下一条语句的输出中,在结果集的列中查找匹配模式(正则表达式)的字符串,并将它们替换为replacement。列中与模式匹配的字符串的每个实例都将被替换。默认情况下,匹配区分大小写。指定可选的。i修饰符以使匹配不区分大小写。
9、–enable_query_log
如果想记录在测试文件中写的sql statements可以通过指令打开enable_query_log,默认是打开的。
10、–disable_query_log
如果不想记录在测试文件中写的sql statements可以通过指令打开disable_query_log,如下图:
11、–enable_query_log
如果想记录执行命令的输出,可以使用该参数,该参数是默认开启的,配合disable_query_log来使用。
12、–disable_query_log
如果不想记录执行命令的输出,可以使用该参数,配合enable_query_log来使用,如下图:
13、–source
使用include文件简化用例 在include目录下已经保存了不少文件,做为公共的文件,封装了各类复杂的操做,这样在执行用例时能够实现简单的调用,例如当咱们想验证是否支持csv类型的存储引擎时,能够在用例文件中增长以下引用:
测试用例中须要确保include的文件存在,不然测试会直接退出,能够将include文件看作是一个子程序模块,能够经过设定变量的方式向它传递参数,以及获取它们的返回值。
14、–sleep
如果在运行测例的过程中,想要短暂的停止5秒,则可以使用—sleep 5参数,此参数的使用方法等价于sleep 5;
6.3其他
1、使用mysqlimport、mysqldump、mysqlpump等数据库工具,这里举了几个例子可以参考下图进行引用,其余的工具可以参考官方的MTR中已经写好的测例文件,或者官方文档进行操作。
Mysqlimport:
Mysqldump:
MySQL:
Mysqlpump:
2、如果想调用Linux命令,则可以使用—exec 来进行调用,如下图:
3、存储过程的语法有所变动,变动为红圈的地方,其余地方没有任何的改动,如下图:
skip是一条command,后面是输出的skip原因,mtr在打印完message后退出,不再执行测试文件中的后续内容。
七、MTR测例编写规范
1、尽量避免每行超过80个字符。
2、使用#开头,做为注释。
3、缩进使用空格,避免使用tab。
4、SQL 语句使用相同的风格,包括关键字大写,其它变量、表名、列名等小写。
5、增加合适的注释。特别是文件的开头,注释出测试的目的、可能的引用或者修复的bug编号。
6、通常状况下,mysql-test-run.pl启动本身的Mysql服务来进行测试,除非在启动时指定参数—extern,来讲明使用的Mysql服务。为了不可能的冲突,习惯上表命名使用t1、t2… 视图命名使用v1、v2等。
八、MTR测试工具中常出现的问题
8.1执行MTR命令失败的可能原因
1、因MySQL MTR测试工具,所使用的初始数据库为test库,所以在执行开始测试时失败,可能时没有在数据库中创建test库,该选项在mysql-test-run.pl文件中的2684行,如果不想因为集群中没有test库而报错,可以改为任意一个已存在的库,eg:系统库。
2、在执行命令中的user、password等参数前,没有添加—extern参数,在没有添加此参数,MySQL MTR是无法进行识别的进而连接数据库的,如下图是标准的远程连接数据库的命令。
8.2编写的Case运行失败的可能原因
1、执行case失败有很多中可能,比如中间执行了某个非法的SQL语句,这个例子中的失败,指代的是执行结果与预期结果不同。
2、当前的执行结果会保存在r/mytest.reject中
3、如果mytest.reject中的结果才是正确的结果(错误出现在mytest.result中),可以用mytest.reject将result覆盖掉,这样正确的标准测试case就完成了。可以直接使用 ./mtr mytest –record命令生成mytest.result.
4、注意mtr在作diff的时候是直接文本比较,因此如果你的case中出现了多次执行结果可能不同的情况(比如时间相关),这不是一个好的case。当然处理的办法是有的,请参考关于 replace_column的描述。
九、MTR测试工具总结
MySQL MTR测试工具可以让我们的日常工作少了很多繁琐及重复性很强的工作,能够大大减少日常工作中所不必要的内容,让工作的效率更高,更精炼,从而有时间可以学习更多的知识。
本文所说的内容,还是有不全面的地方,有缺少的参数或命令等,可以去MySQL官网上更精准的进行查找,可以补充到此文档中,让测试的任务变得更加简单。
十、附录
10.1在GreatDB Cluster中部署官方MTR
前置条件:集群已经搭建好
集群的basedir(这个是ansible的自动目录,如果安装目录是别的目录请自行修改):
/greatdb/svr/greatdb/
1.在机器创建一个目录
mkdir /root/mtr
2.下载官方mtr包
wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-test-8.0.28-linux-glibc2.12-x86_64.tar.xz
3. 解压到集群的安装目录中
tar -xvf mysql-test-8.0.28-linux-glibc2.12-x86_64.tar.xz -C /greatdb/svr/greatdb
4. 进入集群的bin目录,创建软连接
cd /greatdb/svr/greatdb/bin
ln -s greatsql mysql
ln -s greatsql_config mysql_config
ln -s greatsql_config_editor mysql_config_editor
ln -s greatsql_migrate_keyring mysql_migrate_keyring
ln -s greatsql_secure_installation mysql_secure_installation
ln -s greatsql_ssl_rsa_setup mysql_ssl_rsa_setup
ln -s greatsql_tzinfo_to_sql mysql_tzinfo_to_sql
ln -s greatsql_upgrade mysql_upgrade
ln -s greatsqladmin mysqladmin
ln -s greatsqlbinlog mysqlbinlog
ln -s greatsqlcheck mysqlcheck
ln -s greatsqld mysqld
ln -s greatsqld_multi mysqld_multi
ln -s greatsqld_safe mysqld_safe
ln -s greatsqldump mysqldump
ln -s greatsqldumpslow mysqldumpslow
ln -s greatsqlimport mysqlimport
ln -s greatsqlpump mysqlpump
ln -s greatsqlrouter mysqlrouter
ln -s greatsqlrouter_keyring mysqlrouter_keyring
ln -s greatsqlrouter_passwd mysqlrouter_passwd
ln -s greatsqlrouter_plugin_info mysqlrouter_plugin_info
ln -s greatsqlshow mysqlshow
ln -s greatsqlslap mysqlslap
5. 此时就可以使用了
创建一个test文件
mkdir -p /greatdb/svr/greatdb/mysql-test/suite/huangwei/t
cd /greatdb/svr/greatdb/mysql-test/suite/huangwei/t
cat 1.test
select 1;
6. 执行
cd /greatdb/svr/greatdb/mysql-test
./mtr --record huangwei.1
7、可以直接进入到mysql-test目录中的t文件夹下,查看已经写好的case测例等,数量有很多,大概有1677个,大家可以尽情的参考哈。