MySQL Test Run 测试框架介绍

2023-11-20

 

介绍:

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 --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


最后:

 为了回馈铁杆粉丝们,我给大家整理了完整的软件测试视频学习教程,朋友们如果需要可以自行免费领取 【保证100%免费】 

软件测试面试文档

我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

  资料获取方式:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • 从数据库中给定时间起经过的时间

    我有一个 HTML 表 其中包含从数据库中提取的记录 我正在使用 PHP MySQL 我的表中名为 Timer 的列未从数据库中检索 我需要在此处显示经过的时间 从数据库中的特定时间开始 例如 假设现在的时间是2013年2月21日下午6点2
  • 如何使组合键唯一?

    I am making a database of students in one school Here is what I have so far 如果您不喜欢阅读 请跳至 简而言之 部分 问题是我对这个设计并不满意 我想要的组合gra
  • Selenium Webdriver - 单击多个下拉菜单时出现陈旧元素异常,而 HTML DOM 不会更改

    我尝试自动化一个场景 其中条件是我必须从下拉列表中选择一个选项 然后它旁边有另一个下拉列表 我必须单击下一个下拉列表中的一个选项才能启用按钮 我尝试使用代码 但它仅单击第一个选项 并显示错误为过时的元素引用 元素未附加到页面文档 请帮忙 如
  • 如何在 PHP MYSQL 中将数据库表和每条记录从一台数据库服务器复制到另一台数据库服务器?>

    您好 我编写了一段代码 可以将数据库表从一个服务器复制到另一个服务器 但是每个表的记录没有复制 如何编写一个可以将表和每个记录从一个数据库服务器复制到另一个数据库服务器的函数 这是我的示例代码
  • 表已满(使用 MEMORY 引擎)

    我想将生产数据库传输到我的开发机器上进行测试 它有 6 张桌子MEMORY出于性能目的的引擎 I did mysqldump routines hxxx uxxx pxxx prod database gt prod dump sql 当我
  • PHP实现的机票预订系统

    如何防止预订系统中的座位被重复预订 我正在用 PHP 和 MYSQL 制作一个航空旅行预订系统模型作为一个项目 我有一个小问题 仅在付款后 门票和座位详细信息才会永久存储在此处 座位号在付款前分配 假设人 1 预订了飞机上的座位 x 并支付
  • grails/mysql 时区更改

    完成更改应用程序时区的最佳方法是什么 在我看来 必须发生以下情况 服务器 TZ 已被系统管理员更改 mysql必须重新启动 数据库中每个基于时间的列都必须使用convert tz 或等效方法更新所有值 因此 要么必须编写一个 mysql 脚
  • mysql 在 sum() 函数上使用 concat,例如 concat(sum(col1),"%")

    我正在尝试合并多个查询 但其中一个查询使用 sum 当我尝试在此列上应用 concat 时 我得到不需要的 blob 结果 我如何在聚合列上应用 concat 和 union 我期待这个结果 SELECT row 1 col1 UNION
  • MYSQL:SQL查询获取自增字段的值

    我有一张桌子 主键是id及其自动递增 现在 当我插入新记录时 我需要获取更新记录的 id 我怎样才能做到这一点 如果我使用查询 select max id from table name 执行后我可以获得id 但我能确定它是刚刚插入的记录的
  • Mysql获取特定表的最后一个id

    我必须从特定的插入表中获取最后的插入 ID 可以说我有这个代码 INSERT INTO blahblah test1 test 2 VALUES test1 test2 INSERT INTO blahblah2 test1 test 2
  • CakePHP - 获取上次运行的查询

    我想获取 CakePHP 运行的最后一个查询 我无法在 core php 中打开调试 也无法在本地运行代码 我需要一种方法来获取最后一个 sql 查询并将其记录到错误日志中而不影响实时站点 该查询失败但正在运行 像这样的事情会很棒 this
  • 将 Python Selenium 输出写入 Excel

    我编写了一个脚本来从在线网站上抓取产品信息 目标是将这些信息写入 Excel 文件 由于我的Python知识有限 我只知道如何在Powershell中使用Out file导出 但结果是每个产品的信息都打印在不同的行上 我希望每种产品都有一条
  • 无需 cron 在后台发送邮件

    我想知道是否有一种方法可以运行 PHP 循环 以便在后台向订阅者发送几百封电子邮件 我的目标是格式化新闻通讯 单击发送 然后关闭浏览器或更改页面 当然 发送电子邮件的实际过程将在后台运行 不会因浏览器关闭而中断 我知道这可以通过 cron
  • MySQL #1093 - 您无法在 FROM 子句中指定用于更新的目标表“赠品”

    I tried UPDATE giveaways SET winner 1 WHERE ID SELECT MAX ID FROM giveaways 但它给出了 1093 您无法指定目标表 赠品 进行更新FROM clause 本文 ht
  • 无法删除数据库 mysql:错误 3664 (HY000)

    我的应用程序中有一个名为X Files 我想要drop它 但每当我运行命令时drop database X Files我收到以下错误 mysql gt drop database X Files ERROR 3664 HY000 Faile
  • MySQL 跨表计数(*) 查询帮助

    SELECT name COUNT AS count FROM t1 t2 WHERE t2 id t1 id GROUP BY t2 id 我想从 t1 获取名称以及 t2 中 id 与 t1 相同的行数 到目前为止我已经得到了上面的内容
  • 使用数据库进行日志记录

    大多数日志似乎都是纯文本形式 而不是放入 MySQL 其他类型的数据库中 这是否有原因 在我看来 将它们放入数据库将使分析变得非常非常容易 但这会以牺牲速度还是其他什么为代价 我不太关心可移植性 显然你会有数据库连接的文本日志 我能想到两大
  • IN 子查询中的 GROUP_CONCAT

    SELECT A id A title FROM table as A WHERE A active 1 AND A id IN SELECT GROUP CONCAT B id from B where user 3 如果我启动子查询SE
  • MySQL 复制是双向的

    我们已经成功设置了 MySQL 文献中描述的主从复制 不过 我很好奇是否有人设置了双向复制 例如 如果安装了 Drupal 或 Wordpress 第一个 主 数据库服务器出现故障 第二个 从属 数据库服务器恢复正常 与此同时 用户不断进行
  • 如何使用 dql 从数据表中获取唯一值?

    我有一个表 其中有一列存储了各种值 我想使用 dql 从该表中检索唯一值 Doctrine Query create gt select rec school gt from Records rec gt where rec city ci

随机推荐

  • LeetCode 面试16.18 模式匹配

    你有两个字符串 即pattern和value pattern字符串由字母 a 和 b 组成 用于描述字符串中的模式 例如 字符串 catcatgocatgo 匹配模式 aabab 其中 cat 是 a go 是 b 该字符串也匹配像 a a
  • Vue项目分包打包配置(包含dev)全过程

    今天领导要求支援某项目的分包配置 emmm 在参考了公司其他项目的分包操作后 依葫芦画瓢 中间也踩了好几个坑 简单记录下过程 一 拉代码 安装依赖 哈哈哈 上来就踩坑了 我拉了代码后 直接哐哐整 然后一堆依赖报错 我才发现 同事新增了依赖包
  • yyyy-MM-dd‘T‘HH:mm:ssZ的T是什么意思?为什么要用单引号引着

    背景 Java里的日期格式 通常我们看到 yyyy MM dd T HH mm ssZ 的写法是什么意思 尤其这个T作为分隔符为什么左右有单引号 这个单引号会打印出来吗 这个Z又是什么意思 是时区吗 如果是时区 输出的格式是什么 是类似于这
  • java上传图片、文件和富文本内容到服务器上,查看和删除文件

    1 上传富文本内容 前端的富文本内容传到后端 将富文本内容拼接成html页面代码 将内容转换成html文件上传到服务器指定位置进行存储 String profile data xiangmu linux服务器上项目文档存放目录 String
  • python导入excel模块_Python利用Psycopg2模块将Excel表格数据导入Postgressql

    import os import numpy as np import pandas as pd import xlrd import psycopg2 import redis conn redis Redis host localhos
  • python利用bs4获取网络小说

    所选定的小说网址 https www shicimingju com book xiyouji html 如果想更换其他小说资源 在上一级网址就行 https www shicimingju com book 代码如下 from bs4 i
  • jeecgboot问题解决方案

    常见问题Q A JEECG老版在线文档 点击进入 1 后台访问提示token错误 报错截图 解决方案 JeecgBoot后台的所有请求访问 增加了token机制 所以不能直接访问后台 而需要通过前台登录才能访问 默认前台访问地址 http
  • 探查Weblogic JDBC Multipool 问题

    问题描述 WebLogic Server MultiPool 有两种不同的类型 高可用性 MultiPool 和负载平衡 MultiPool 这两种算法互不相容 分别用于达成不同的目标 本模式提供有关这两种算法的信息 了解不同类型的 Web
  • 5.sklearn之转换器(划分训练集和测试集、以及标准化、归一化数据会用transform,独热编码也会用到)

    文章目录 1 什么是转换器 2 测试集和训练集 2 1 训练集 测试集 验证集 2 2 拆分训练集测试集有个问题 2 3 代码 3 标准化 3 1 上离差标准化代码 举一反三就好了 其他几个用法一样 3 2 sklearn 其他标准化函数
  • SDL检查

    SDL检查 在用 Visual Studio 编译比较早的代码时 经常会遇到错误 错误 C4996 wcscpy This function or variable may be unsafe Consider using wcscpy s
  • Python+selenium+pytest 自动化测试环境搭建

    Python Selenium Pytest 自动化测试环境搭建 一 安装Python及解释器 二 安装浏览器及对应浏览器驱动 1 安装谷歌浏览器 浏览器安装之后 关闭浏览器的自动更新 因为如果浏览器自动更新了 你的浏览器驱动没有更新 那么
  • Web渗透入侵流程思路

    什么是web渗透入侵呢 渗透测试能够独立地检查你的网络策略 换句话说 就是给你的系统安了一双眼睛 而且 进行这类测试的 都是寻找网络系统安全漏洞的专业人士 下面就来一起学习分享一下web入侵渗透流程中的思路 首先献出一张宝贵的图 这张图上写
  • Fiddler 教程

    Fiddler是最强大最好用的Web调试工具之一 它能记录所有客户端和服务器的http和https请求 允许你监视 设置断点 甚至修改输入输出数据 使用Fiddler无论对开发还是测试来说 都有很大的帮助 阅读目录 Fiddler的基本介绍
  • 异常:java.lang.ArrayIndexOutOfBoundsException

    java lang ArrayIndexOutOfBoundsException 一种运行时异常 常出现在数组下标越界中 称为下标出界异常 代码演示 下面异常报错 就是因为我的数组arr只能有arr 0 arr 1 两个元素 而我的循环中多
  • 番茄钟工作法:你真的了解番茄钟么?

    1 什么是番茄工作法 番茄工作法的发明者 意大利人弗朗西斯科 西里洛于1992年创立了番茄工作法 他和我们大多数人一样 是一个重度拖延症患者 他在大学生活的头几年 曾一度苦于学习效率低下 于是他做了个简单的实验 我就不信我不能专注10分钟
  • MATLAB+JAVA的混合开发

    近期项目中需要使用matlab跟java做混合开发 主要记录一下 此次开发遇到的问题点 环境 使用的matlab版本是 R2018b 当前状况 MATLAB代码已经编写好 且运行成功 需要打成jar包才可以被java调用 步骤一 按照教程安
  • electron 下载过慢解决

    elecetron 起步 根据elecetron 官网上 试了下初始安装 结果第一步安装依赖就挂了 2个命令都试过了不行 npm install save dev electron yarn add dev electron 安装cnpm
  • Linux -安装MySQL

    一 步骤 1 下载 一 查询下本机mysql是否卸载干净 二 下载与安装 2 配置 一 步骤 1 下载 一 查询下本机mysql是否卸载干净 查看mysql情况 rpm qa grep mysql 完全卸载mysql rpm e nodep
  • element-plus中 el-image :src属性发送get请求

    项目场景 Element plus 中
  • MySQL Test Run 测试框架介绍

    介绍 MySQL Test Run 简称MTR 是MySQL官方提供的自动化测试框架 执行脚本在发布路径的mysql test目录下 主要测试步骤 是通过执行一个case test 中的语句 包括sql语句和其他管理语句 将case的输出记