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

测试用例编写的规范

  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

Enjoy GreatSQL

文章推荐:

GreatSQL季报(2021.12.26)

https://mp.weixin.qq.com/s/FZ_zSBHflwloHtZ38YJxbA

技术分享|sysbench 压测工具用法浅析

https://mp.weixin.qq.com/s/m16LwXWy9bFt0i99HjbRsw

故障分析 | linux 磁盘io利用率高,分析的正确姿势

https://mp.weixin.qq.com/s/7cu_36jfsjZp1EkVexkojw

技术分享|闪回在MySQL中的实现和改进

https://mp.weixin.qq.com/s/6jepwEE0DnYUpjMYO17VtQ

万答#20,索引下推如何进行数据过滤

https://mp.weixin.qq.com/s/pt6mr3Ge1ya2aa6WlrpIvQ

关于 GreatSQL

GreatSQL是由万里数据库维护的MySQL分支,专注于提升MGR可靠性及性能,支持InnoDB并行查询特性,是适用于金融级应用的MySQL分支版本。

Gitee:

https://gitee.com/GreatSQL/GreatSQL

GitHub:

https://github.com/GreatSQL/GreatSQL

Bilibili:

https://space.bilibili.com/1363850082/video

微信&QQ群:

可搜索添加GreatSQL社区助手微信好友,发送验证信息“加群”加入GreatSQL/MGR交流微信群

QQ群:533341697

微信小助手:wanlidbc

本文由博客一文多发平台 OpenWrite 发布!

MySQL Test Run 测试框架介绍的更多相关文章

  1. python pytest测试框架介绍二

    在介绍一中简单介绍了pytest的安装和简单使用,接下来我们就要实际了解pytest了 一.pytest的用例发现规则 pytest可以在不同的函数.包中发现用例,发现的规则如下 文件名以test_开 ...

  2. spring boot应用测试框架介绍

    一.spring boot应用测试存在的问题 官方提供的测试框架spring-boot-test-starter,虽然提供了很多功能(junit.spring test.assertj.hamcres ...

  3. 【Tavern】1.tavern测试框架介绍

    目录 1. Tavern 和 Postman 2. 安装Python 3. 安装Tavern 4. 第一个测试用例 1. Tavern 和 Postman Tavern是一个用Python实现的接口自 ...

  4. 【转】Java学习---10个测试框架介绍

    [原文]https://www.toutiao.com/i6594302925458113027/ JAVA 程序员需要用到 10 个测试框架和库 Java 程序员需要用到十大单元测试和自动化集成测试 ...

  5. 【pytest系列】- pytest测试框架介绍与运行

    如果想从头学起pytest,可以去看看这个系列的文章! https://www.cnblogs.com/miki-peng/category/1960108.html 前言​ ​ 目前有两种纯测试的测 ...

  6. 『德不孤』Pytest框架 — 1、Pytest测试框架介绍

    目录 1.什么是单元测试框架 2.单元测试框架主要做什么 3.单元测试框架和自动化测试框架有什么关系 4.Pytest测试框架说明 5.Pytest框架和Unittest框架区别 (1)Unittes ...

  7. python pytest测试框架介绍三

    之前介绍了pytest以xUnit形式来写用例,下面来介绍pytest特有的方式来写用例 1.pytest fixture实例1 代码如下 from __future__ import print_f ...

  8. CDS测试框架介绍:如何为ABAP CDS Entities写测试

    动机 现在大家都知道单元测试对我们代码的好处.并且我们都承认它是开发过程中不可或缺的一部分.但是在把代码切换到数据库的模式下的时候,我们被粗暴地打回了软件测试的黑暗年代...我们现在面临着逻辑下推到A ...

  9. python pytest测试框架介绍四----pytest-html插件html带错误截图及失败重测机制

    一.html报告错误截图 这次介绍pytest第三方插件pytest-html 这里不介绍怎么使用,因为怎么使用网上已经很多了,这里给个地址给大家参考,pytest-html生成html报告 今天在这 ...

随机推荐

  1. [CSP-S 2019 Day2]Emiya家今天的饭

    思路: 这种题目就考我们首先想到一个性质.这题其实容易想到:超限的菜最多只有一个,再加上这题有容斥那味,就枚举超限的菜然后dp就做完了. 推式子能力还是不行,要看题解. 式子还需要一个优化,就是废除冗 ...

  2. Java有根儿:Class文件以及类加载器

    JVM 是Java的基石,Java从业者需要了解.然而相比JavaSE来讲,不了解JVM的一般来说也不会影响到工作,但是对于有调优需求或者系统架构师的岗位来说,JVM非常重要.JVM不是一个新的知识, ...

  3. JAVA学习之第一个HelloWorld程序

    第一个HelloWorld程序 第一步,创建java类型的文件 第二步,在创建文件的目录中打开cmd窗口 第三步,使用javac 命令将java文件编译为.class类型的字节码文件 第四步,使用ja ...

  4. 轻量级多级菜单控制框架程序(C语言)

    1.前言 作为嵌入式软件开发,可能经常会使用命令行或者显示屏等设备实现人机交互的功能,功能中通常情况都包含 UI 菜单设计:很多开发人员都会有自己的菜单框架模块,防止重复造轮子,网上有很多这种菜单框架 ...

  5. java8 Stream新特性

    import lombok.Getter; import lombok.Setter; @Setter @Getter public class Person { private String nam ...

  6. JS:自增和自减

    自增自减是一元操作符运算 1.++: 前置++:先把取值,再把变量的值加1 后置++:先把变量的值加1,再取值 2.--: 前置--:先把取值,再把变量的值加1 后置--:先把变量的值加1,再取值 v ...

  7. 简单ELK配置实现生产级别的日志采集和查询实践

    概述 生产问题 集群规模如何规划? 集群中节点角色如何规划? 集群之脑裂问题如何避免? 索引分片如何规划? 分片副本如何规划? 集群规划 准备条件 先估算当前系统的数据量和数据增长趋势情况. 现有服务 ...

  8. C#/VB.NET 将PDF转为Excel

    PDF文档可以避免可防⽌他⼈⽆意中触到键盘修改⽂件内容.但是在避免他人⽆意修改的同时也妨碍了正常的修改.如果你想处理或修改PDF文档中的数据,不妨试试用Excel来实现.Excel拥有强大的数据处理功 ...

  9. C#.NET笔试题-基础

    1.C#中堆和栈的区别? 栈:由编译器自动分配.释放.在函数体中定义的变量通常在栈上. 堆:一般由程序员分配释放.用new.malloc等分配内存函数分配得到的就是在堆上. 存放在栈中时要管存储顺序, ...

  10. 2m高分辨率土地利用分类数据

    数据下载链接:百度云下载链接 土地利用数据是在根据影像光谱特征,结合野外实测资料,同时参照有关地理图件,对地物的几何形状,颜色特征.纹理特征和空间分布情况进行分析,建立统一解译标志的基础之上,依据多源 ...