- 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.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 目录
也可通过下载源码包进行编译装置,本次暂不进行介绍。
次要目录介绍
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_warnings
DROP TABLE IF EXISTS t1;
SET @@sql_mode='NO_ENGINE_SUBSTITUTION';
--enable_warnings
SET SQL_WARNINGS=1;
CREATE TABLE t1 (a INT);
INSERT INTO t1 VALUES (1);
INSERT INTO t1 VALUES (2);
DROP TABLE t1;
执行并查看后果
# ./mtr --record mytest.test
Logging: ./mtr mytest.test
MySQL Version 8.0.28
Checking supported features...
- SSL connections supported
Collecting 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..13009
worker[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 times
Spent 0.012 of 4 seconds executing testcases
Completed: 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 公布!