• 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: 对应数据库的用户名 | 明码;

测试用例编写的标准

  1. 尽可能防止每行超过80个字符 ;
  2. 用#结尾,作为正文;
  3. 缩进应用空格,防止应用tab;
  4. SQL 语句应用雷同的格调,包含关键字大写,其它变量、表名、列名等小写;
  5. 减少适合的正文。特地是文件的结尾,正文出测试的目标、可能的援用或者修复的bug编号;
  6. 为了防止可能的抵触,习惯上表命名应用 t1、t2...视图命名应用v1、v2...;

case运行失败的起因

  1. 用例文件中的sql可能不非法;
  2. 产生的后果文件与冀望文件diff后果不统一;
  3. 具体谬误起因能够通过查看执行时的输入日志进行排查批改;

解决预期谬误

在冀望有返回谬误的语句后面应用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 公布!