- GreatSQL社区原创内容未经受权不得随便应用,转载请分割小编并注明起源。
介绍
MySQL Test Run 简称MTR,是MySQL官网提供的自动化测试框架,执行脚本在公布门路的mysql-test目录下。
次要测试步骤,是通过执行一个case(*.test)中的语句(包含sql语句和其余治理语句),将case的输入记录保留在后果文件(*.result)中,或者是将语句执行后果与规范的输入后果作diff,如果呈现偏差就会报错。
MySQL自动化框架包含一组测试用例和用于运行它们的程序:perl 脚本(mysql-test-run.pl)和 c++ 二进制(mysqltest)。
- perl 脚本:负责管制流程,包含启停、辨认执行哪些用例、创立文件夹、收集后果等操作。
- mysqltest:负责执行测试用例,包含读文件,解析特定语法,执行用例。
装置
- 装置依赖包
本次装置环境是CentOS 8.5
yum -y install perl* -y
- 下载安装包并解压
本文采纳的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.xztar -xvf mysql-test-8.0.28-linux-glibc2.12-x86_64.tar.xzmv mysql-8.0.28-linux-glibc2.12-x86_64 mysql_mtr_8.0.28cd /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目录
也可通过下载源码包进行编译装置,本次暂不进行介绍。
次要目录介绍
include
蕴含.inc文件,用于测试开始时判断是否满足测试条件,在测试用例中通过source命令引入,就像C/C++的头文件,在mtr的体系中,咱们能够将许多可反复利用的测试语句,提取到*.inc文件中,放到对应的include目录中,以便在*.test中间接调用。
suite
蕴含所有测试suite,每一个suite为一个测试用例集,个别地,咱们将若干个测试性能点同属于一个功能模块的testcase放在一个大目录下,这个蕴含了t和r目录的大目录被称为一个testsuite。其中a.test文件会放在t目录,而a.result放在r目录。
测试示例
咱们通过一个最简略的例子来阐明这个框架是怎么应用的。
创立测试用例
在 mysql-test/t 目录下创立一个文件名为 mytest.test的测试用例:
# vi mytest.test--disable_warningsDROP TABLE IF EXISTS t1;SET @@sql_mode='NO_ENGINE_SUBSTITUTION';--enable_warningsSET SQL_WARNINGS=1;CREATE TABLE t1 (a INT);INSERT INTO t1 VALUES (1);INSERT INTO t1 VALUES (2);DROP TABLE t1;
执行并查看后果
# ./mtr --record mytest.testLogging: ./mtr mytest.testMySQL Version 8.0.28Checking supported features... - SSL connections supportedCollecting tests...Checking leftover processes...Removing old var directory...Creating var directory '/usr/local/mysql/mysql-test/var'...Installing system database...Using parallel: 1==============================================================================TEST RESULT TIME (ms) or COMMENT--------------------------------------------------------------------------worker[1] Using MTR_BUILD_THREAD 300, with reserved ports 13000..13009worker[1] mysql-test-run: WARNING: running this script as _root_ will cause some tests to be skipped[100%] main.mytest [ pass ] 12--------------------------------------------------------------------------The servers were restarted 0 timesSpent 0.012 of 4 seconds executing testcasesCompleted: All 1 tests were successful.
看到successful阐明执行胜利。
执行阐明
1. mysql-test/mtr这个文件,是一个perl脚本。同目录下还有 mysql-test-run 和mysql-test-run.pl,这三个文件是截然不同的; 2. 执行case时会主动启动一个mysql服务,默认端口为13000。如果这个case波及到须要启动多个服务(比方主从),则端口从13000递增; 3. ./mtr的参数只须要指明测试case的前缀即可,当你执行./mtr mytest会主动到t/目录下搜寻 mytest.test文件来执行,也能够输出残缺的测试例名称如./mtr mytest.test。 如果要执行某个功能模块的所有测试用例,能够在suite目录下创立一个大目录如spTest而后再别离创立t和r目录,执行该目录的测试例能够写成:./mtr spTest.mytest; 4. mytest.test最初一行是删除这个创立的表。因为每个case都要求不要受别的case影响,也不要影响别的case,因而本人在case中创立的表要删除; 5.第一次执行倡议加上参数--record,执行完会在对应的r目录下生成mytest.result;mtr会将mytest.test的执行后果与r/mytest.result作diff。 若完全相同,则示意测试后果失常(如果须要和往期测试后果做比照,须要在r目录下先提供一份xx.result文件); 6.MTR提供了一套测试用例,如果不带任何参数间接执行./mtr,会运行t目录下的的所有case,包含下面刚新增的用例。
mtr 其余罕用参数介绍
--force
默认状况下,只有遇到一个用例出错,测试程序就会退出,退出该参数后,mtr会疏忽谬误并继续执行下一个case直到所有case执行完结再退出(但如何脚本存在太多谬误还是会退出);
--record
是否记录results后果,首次执行倡议带上,让其主动生成.results文件(再批改成咱们预期的后果文件);
若一个执行输入后果和testname.result文件不同,会生成一个testname.reject文件,该文件在下次执行胜利之后被删除;查看reject文件的内容,如果外面是冀望的输入,则将内容拷贝到.result文件中,作为当前判断运行后果是否通过的根据;
--big-test
执行标记为big的测试用例,因为用例较大、耗时较长,标记为big的用例默认不会执行,输出两遍big-test则只执行标记为big的测试用例;
--suite=[dirname]
批量执行指定测试目录下的所有测试例,有时候咱们要执行一套xx.test文件,这样能够在执行时候指定套件名称。
- 连贯近程的数据库进行mtr执行:
#./mtr --extern host=192.168.6.1 --extern port=3306 --extern user=root --extern password='123456' --record --force example.1
--extern:个别状况下mtr是启动本人的MySQL服务来进行测试,如果在启动时指定参数—extern,则能够应用指定的MySQL服务进行测试;host | port :近程服务器地址 | 端口;user | password: 对应数据库的用户名 | 明码;
测试用例编写的标准
- 尽可能防止每行超过80个字符 ;
- 用#结尾,作为正文;
- 缩进应用空格,防止应用tab;
- SQL 语句应用雷同的格调,包含关键字大写,其它变量、表名、列名等小写;
- 减少适合的正文。特地是文件的结尾,正文出测试的目标、可能的援用或者修复的bug编号;
- 为了防止可能的抵触,习惯上表命名应用 t1、t2...视图命名应用v1、v2...;
case运行失败的起因
- 用例文件中的sql可能不非法;
- 产生的后果文件与冀望文件diff后果不统一;
- 具体谬误起因能够通过查看执行时的输入日志进行排查批改;
解决预期谬误
在冀望有返回谬误的语句后面应用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
- MTR其余具体用法能够参考官网:官网文档
Enjoy GreatSQL :)
文章举荐:
GreatSQL季报(2021.12.26)
https://mp.weixin.qq.com/s/FZ...
技术分享|sysbench 压测工具用法浅析
https://mp.weixin.qq.com/s/m1...
故障剖析 | linux 磁盘io利用率高,剖析的正确姿态
https://mp.weixin.qq.com/s/7c...
技术分享|闪回在MySQL中的实现和改良
https://mp.weixin.qq.com/s/6j...
万答#20,索引下推如何进行数据过滤
https://mp.weixin.qq.com/s/pt...
对于 GreatSQL
GreatSQL是由万里数据库保护的MySQL分支,专一于晋升MGR可靠性及性能,反对InnoDB并行查问个性,是实用于金融级利用的MySQL分支版本。
Gitee:
https://gitee.com/GreatSQL/Gr...
GitHub:
https://github.com/GreatSQL/G...
Bilibili:
https://space.bilibili.com/13...
微信&QQ群:
可搜寻增加GreatSQL社区助手微信好友,发送验证信息“加群”退出GreatSQL/MGR交换微信群
QQ群:533341697
微信小助手:wanlidbc
本文由博客一文多发平台 OpenWrite 公布!