MySQL自动测试框架Test Framework工具实践

news2024/11/6 7:24:02

导读

之前的文章(《MySQL自动测试框架Test Framework浅析》)从源码级别对MySQL自动测试框架Test Framework进行了简要分析,本文接下来从实践的角度介绍Test Framework工具的使用方法。

1 简介

Test Framework主要应用于MySQL等相关数据库项目开发测试,对单个功能点或者模块进行正确性和功能性测试,该工具在SQL级别对MySQL进行单元测试。Test Framework不仅仅测试MySQL服务器和客户端的正确性,也能根据实际需要测试不同启动参数配置的MySQL服务器和客户端,同时支持mysqltest、innochecksum、mysql_upgrade、mysqladmin、mysqlpump等工具的验证方法。方便开发者模拟某一场景,验证数据库功能是否达到预期。

它的位置在MySQL源码同级的目录./mysql-test下,使用perl脚本编写。在编译MySQL源码完毕即可使用。

在mysql-test/目录下还有其他目录,列出其中几个常用的目录:

include目录:一些头文件,这些文件在*.test文件中调用,使用source命令引入;

lib目录:是一些库函数,主要被mtr脚本调用;

std_data目录:一些标准数据,某些测试用例可以直接拷贝使用即可。

suite目录保存套装组件的测试用例,方便测试同一类测试用例。

extra目录:一些binlog、rpl测试相关的文件。

t目录:默认main套件测试用例

r目录:默认main套件测试用例结果文件

2 Test Framework使用方法

Test Framework通过执行一个测试用例文件,将该测试用例的实际测试结果,与预期结果文件作对比。如果一致,则认为测试通过,无问题;否则,不一致,则测试失败,可以根据输出结果查找问题。

接下来首先介绍如何编写一个测试用例以及相应的文件,其次介绍如何使用Test Framework执行测试用例。

2.1编写测试用例和预期测试结果文件方法

测试用例的输入存储在一个文件中,运行测试的预期结果存储在另一个文件中。每个单独的测试用例后重启服务器并要求之前的数据是清空的。

测试用例文件主要由SQL语句组成,也可以使用测试语言结构来控制如何运行测试和验证它们的结果。测试用例文件统一放在t/文件夹下,文件名以.test为后缀。测试用例文件支持脚本语言函数。

预期结果文件与测试用例文件的大部分代码几乎一致,只是在文件中增加了输出结果。在有输出结果的语句后面(如查询语句select),还将输出结果写在预期结果文件中。预期结果文件统一放在r/文件夹下,文件名以.result为后缀。

测试用例文件应与预期结果文件同名,仅以后缀区分是测试用例文件还是预期结果文件,使用时加不加.test后缀执行都可以。

按照如上要求,下面是一个简单的测试用例文件,和一个与测试用例相对应的预期结果文件,为了对比内容的差异,特意用空行和虚线进行了标注:

测试用例.test文件内容:

预期结果.result文件内容:

--echo ---开始测试用例---

---开始测试用例---

--source include/xxxxx.inc

--disable_info

use test;

use test;

create table stu(id int(4), name varchar(10))charset=utf8 engine=innodb;

create table stu(id int(4), name varchar(10))charset=utf8 engine=innodb;

--enable_info

insert into stu values(1, “zhangsan”);

insert into stu values(1, “zhangsan”);

affected rows: 1

select * from stu;

select * from stu;

id      name

1       zhangsan

affected rows: 1

drop table stu;

drop table stu;

affected rows: 0 

--echo 错误情况的示例

错误情况的示例

#--error 1049

--error ER_BAD_DB_ERROR

use a;

use a;

ERROR 42000: Unknown database 'a'

affected rows: 1

#use aaaaa;

--echo ---结束测试用例---

---结束测试用例---

可以看到,除了熟悉的SQL语句,还有一些以--开头的参数,这些参数起着很大的作用,可以根据实际需要在编写测试用例文件时进行增加。

关于更多的参数的介绍,可以到官网Testing Tools模块查看,这里列出比较常用的一些参数的含义,以供参考:

参数名称

描述

--source include/xxxx,inc

等效于将目标文件的内容全部拷贝到当前位置,mysql-test/include目录下有很多这样的文件,他们提供了类似函数的功能,以简化每个测试用例的代码。注意souce前面的 --,大多数的非SQL语句都要求加--。

--enable_warnings

打开警告信息的输出

--disable_warnings

关闭警告信息的输出

--enable_info

打开输出信息,在结果中多输出影响行数

--disable_info

关闭输出信息

--enable_query_log

输出原语句

--disable_query_log

默认情况下,r/testname.result中会包含原语句和执行结果,若不想输出原语句,需要在t/testname.test文件头中加此参数。

--COMMAND

可以使用部分Linux系统命令,COMMAND可以替换为如mkdir、rmdir、echo、exec等命令。执行效果同要替换的命令一样。

--exec xxx

继续执行参数后面的某些命令。

--echo

向标准输出回显输出信息。

--error N

如果要测试出错语句,必须在testname.test文件中,会出错的语句之前加此参数。N为错误号或者宏。

--replace_column

指定要用字符串替换给定列中的任何内容。特别适合处理每次测试运行得到不同的输出的情况。如因为时间因素而影响输出结果的。

--initialize

初始化

--disable_abort_on_error

禁用中止,可以在每次测试运行中看到更多的错误。

--enable_reconnect

重连服务器

--shutdown_server N

关闭服务器

--copy_file

拷贝文件

--remove_file

移除文件

--write_file

往文件中写数据。

--cat_file

查看文件内容。

--sorted_result

对result文件进行排序。也可以使用SQL语句中的order by。

--replace_result

替换result文件。

--repeat

连续运行输入测试n次。非常适合诊断随机故障。

--nowarnings

忽略整个验证server日志的过程,可以在文件头增加此参数。

注意:

如果需要在server启动前执行一些脚本或者配置文件,可以写在 t/目录下,*.opt文件是选项文件,指在这个测试中mysql以.opt文件的内容作为测试参数启动;*.sh文件是在执行启动mysql-server之前提前执行的脚本,由mtr自动执行。

每个测试用例会启动一个mysql服务,默认端口为13000。如果这个测试用例涉及到需要启动多个服务(比如主从),则端口从13000递增。关于主从:主库的配置写在testname-master.opt, 从库的写在testname-slave.opt。

如果服务端输出中有warning或error信息,则会导致退出,除非已经抑制特定的warnings和errors信息。

如果要指定忽略某些行,可以使用语句call mtr.add_suppression("xxxxxxx");,这样能够忽略""中的内容,""内允许使用正则表达式。

可以使用let进行赋值,如给变量赋值,let $ret= xxx,给sql语句的返回值赋值,如let $tmp=’select name from stu where id = 1’,也可以使用let给系统变量赋值let $path=$PATH。

测试文件中可以使用if、else、while等条件循环语句。如:

--disable_query_log  
if ($debug)  
{  
   --enable_query_log  
}  

在mysql-test-run.pl脚本中保存有运行的环境变量,如MTR_PORT_BASE、MYSQL_TEST_DIR等,这些环境变量可以在测试用例文件中直接使用,如果在测试用例中定义的环境变量,只可以在本测试用例或测试用例包含的文件中使用。

如果想要在测试用例中临时执行某些perl脚本语句,可以使用以perl;开头,中间为要执行的perl脚本语句,最后以EOF结尾,如:

perl;

print “This is a test\n”   #perl脚本语句

……

EOF

通过用相应的值替换对文本中变量的引用来评估语句。然后将结果语句发送到服务器上执行。使用“$name”指定“$name”变量中的内容。使用eval statement相对于statement语句的优势在于eval提供了变量扩展。如:

let $DB=test

eval USE $DB;

使用popen()库调用执行shell命令,命令中对变量的引用将替换为相应的值,使用格式为:

exec command [arg] ...

如:

--exec $MYSQL_DUMP --xml --skip-create test

--exec rm $MYSQLTEST_VARDIR/tmp/t1

exec $MYSQL_SHOW test -v -v;

关于更多的编写测试用例方法,可以查看MySQL官网关于mysqltest命令参数的介绍。

2.2 Test Framework执行方法

语法:

shell> mysql-test-run.pl [options] [test_name] ...

mysql-test-run、mysql-test-run.pl、mtr三个文件一模一样,选择任一文件来执行即可,如./mtr。mtr实际上是调用的mysqltest来进行测试的。

常用选项参数解释:

参数名称

描述

[什么参数都不加]

执行t/目录和suits/目录下所有以.test为后缀的测试用例文件(测试时间较长),并且,任何一个测试用例执行失败都导致整个执行计划推出。

--mysqld =--key_buffer_size=16384

将启动参数传给mysql服务器。每个选项必须有一个--mysqld打头,不能连在一起写。

所有的参数传递进去后执行一次。

--combination =xxxx,xxxxx,xx

类似于--mysqld,但行为不同。执行多个测试运行。每一个combination参数传递进去参数执行一次,然后继续下一个参数执行。

如果有一个combination参数相当于--mysqld。

--do-test=events

执行所有以events为前缀的测试用例文件(搜索范围为t/和所有的suite)

--do-test的参数支持正则表达式,左边的命令等效于./mtr –do-test=events.*

所以如果想测试所有的包括innodb的case,可以用 ./mtr –do-test=.*innodb.*

--skip-test=events

将以events开头的所有测试用例跳过,支持正则表达式。

--vardir

mtr允许并行执行,需要特别指定不同的日志目录。

--suite=suite_name

suits目录下有多个目录,是一些测试的套餐。此命令单独执行suits/suite_name目录下的所有测试用例文件(其他的目录不执行)。

t/目录下的所有文件组成了默认的套餐main。 因此 ./mtr --suite=main则只执行t/*.test.

--force

忽略错误并继续执行直到所有的测试用例执行结束。

--parallel=auto

以多线程执行测试用例

--record

生成.result文件。将.test的实际测试结果.reject作为预期结果.result

--result-file=file_name

此选项指定测试用例预期结果的文件。-- result-file与-- record一起决定了mysqltest如何处理测试用例的测试实际结果和预期结果。

注意:

测试过程生成的所有数据都保存在var/目录下,其中var/install.db/目录在首次初始化后生成,后续直接拷贝给后续服务器的启动使用。var/log/目录下保存本次执行的日志文件,包括错误信息、警告信息、初始化过程的参数、执行的测试用例名以及执行时间文件。var/tmp/目录保存理你是的执行SQL语句的通过情况,包括两次check-testcase和check-warnings过程。var/mysqld.1/目录保存本次执行生成的数据文件。var/my.cnf是执行测试用例的配置文件。

测试用例要求尽量不要受到别的测试用例的影响,如一个测试用例创建了一个表,然后进行了一些操作后,最后应该删除这个创建的表,防止影响到别的测试用例的执行。

测试用例不通过,会显示出哪一行语句执行出错,并且将出错信息打印出来,接下来就可以根据出错信息进行有针对性的bug修复。

测试失败的可能原因有很多。比如中间执行了某个非法的语句;测试用例中每次执行的测试结果都不同等。可通过查看var/log/下的错误日志文件查找分析。

下面是成功和失败的输出结果图:

成功执行的结果图

执行失败的结果图

3、总结

使用Test Framework工具能够实现对MySQL等数据库系统的各项功能的进行SQL级别的自动测试,Test Framework框架能够随时根据需要进行增减修改相关模块,如果你熟悉其他数据库的机制原理,你完全可以将Test Framework打造成专属数据库的自动测试框架。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2166440.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Docker 容器技术:颠覆传统,重塑软件世界的新势力

一、Docker简介 什么是docker Docker 是一种开源的容器化平台,它可以让开发者将应用程序及其所有的依赖项打包成一个标准化的容器,从而实现快速部署、可移植性和一致性。 从功能角度来看,Docker 主要有以下几个重要特点: 轻量…

用Python实现运筹学——Day 3: 线性规划模型构建

一、学习内容 线性规划模型构建的步骤与技巧 线性规划(Linear Programming, LP)模型构建是运筹学中的核心内容,通常用于求解资源的最优分配问题。要从实际问题中提取出一个线性规划模型,需要按照以下步骤进行: 问题描…

JavaWeb——Vue组件库Element(1/6):快速入门(什么是Element,安装,引入ElementUI组件库,复制组件代码,启动项目 )

目录 什么是Element 快速入门 安装 引入ElementUI组件库 访问官网,复制组件代码 启动项目 小结 了解完前端的工程化之后,接下来了解一门新的前端技术:Vue 的组件库 Element。 学习完 Element 之后,即使作为一名 Java 后…

VMware 如何上网

需求 在PC window中下载了VMware,并且加载的是Ubuntu系统。PC电脑连接的是手机热点。 可以看出WLAN连接的名称是:Wi-Fi 6 AX201 16MHz 如何让Ubuntu系统也能够上网。并且更新库,能够sudo apt-get install xxx相关库。 目前虚拟机中的Ubun…

PMP--二模--解题--121-130

文章目录 9.资源管理!团建不是万能的121、 [单选] 项目团队中一些经验丰富的成员抱怨项目经理。这些高级项目团队成员觉得项目经理在事无巨细地管理他们,阻碍他们完成工作。当项目经理意识到这些问题时,应该怎么做? 14.敏捷--组织…

深度学习之开发环境(CUDA、Conda、Pytorch)准备(4)

目录 1.CUDA 介绍 1.1 CUDA 的基本概念 1.2 CUDA 的工作原理 1.3 CUDA 的应用领域 2. 安装CUDA 2.1 查看GPU版本 2.2 升级驱动(可选) 2.3 查看CUDA版本驱动对应的支持的CUDA ToolKit工具包 2.4 下载Toolkit 2.5 安装(省略&#xff0…

数据结构讲解二叉树 【一】

🎁🎁创作不易,关注作者不迷路🎀🎀 C语言二叉树 【一】 前言一、数概念及结构1.数的概念1.2树的相关概念1.3树的表示 二、二叉树的概念及结构2.12.2二叉树的性质2.3二叉树的存储结构 三、二叉树的顺序结构实现3.1二叉树…

【有啥问啥】“弱激励学习(Weak Incentive Learning)”的原理与过程解析

“弱激励学习(Weak Incentive Learning)”的原理与过程解析 一、引言 在机器学习、人工智能以及更广泛的教育与培训领域,学习范式的多样性为提升智能体(AI模型、学生或企业员工)的能力提供了丰富的路径。弱激励学习作…

【最简单最直观的排序 —— 插入排序算法】

【最简单最直观的排序 —— 插入排序算法】 插入排序是一种简单直观的排序算法。其基本思想是把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为止,得到一个新的有序序列。 插入排序的核心就是多趟选择插…

python模块之getopt

getopt.getopt(args, shortopts, longopts[]) 解析命令行选项及参数列表。 args:要解析的参数列表,但不包括当前执行的python脚本名称,一般等同于sys.argv[1:]。 shortopts:要识别的短选项字符串,如果后接:表示需要…

C++入门day4-面向对象编程(下)

前言:C入门day3-面向对象编程(中)-CSDN博客 初识:继承特性 继承的基础语法 class A{ public:int a; }; class B:public A { public:int b; }; B类通过继承A类后,内部会继承一个int变量 a:从下图我们可以…

Mesa三角形光栅化过程关键代码

1.先看下mesa三角形光栅化效果 2.这里是主要实现代码,Mesa的代码也是非常多,看了好多天。关键实现过程代码这个s_tritemp.h中 3.这里主要介绍渲染一个矩形的过程 a)在glut中两行代码: b) 中间过程代码忽略,进入static GLboolean run_render(…

生活英语口语柯桥学英语“再确认一下“ 说成 “double confirm“?这是错误的!

在追求英语表达的过程中,我们常常会遇到一些看似合理实则错误的表达习惯。今天,我们就来聊聊一个常见的误区——“再确认一下”被误译为“double confirm”。 “再次确认”不是double confirm 首先,我们需要明确,“double confi…

POI从3.14升级为5.2.0

最近word用的功能有点多&#xff0c;3.14功能太少&#xff0c;升级一下。 从5.0.X开始&#xff0c;poi-ooxml–schemas被重命名为poi-ooxml–full 最新版是5.3.0&#xff0c;但是word转pdf的工具最新到poi的5.2.0&#xff0c;所以用这个版本了 properties中变量 <poi.versio…

在docker中找不到文件

问题 这是我的Dockerfile&#xff1a; FROM mcr.microsoft.com/dotnet/sdk:8.0 as build WORKDIR /app EXPOSE 80COPY TotechsThunder.sln TotechsThunder.sln COPY mock/programminglanguages/programminglanguage.js mock/programminglanguages/programminglanguage.js COP…

大觅网之业务部署(Business deployment of Da Mi Network)

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 本人主要分享计算机核心技…

ubuntu20.04.6 触摸屏一体机,外接视频流盒子开机输入登录密码触屏失灵问题解决方法

1. 首先直接运行xrandr命令&#xff0c;查看设备的相关信息&#xff1a; 运行之后会显示当前连接设备的屏幕信息&#xff0c;如下图&#xff0c;LVDS和VGA-0&#xff0c;而HDMI屏幕为disconnect&#xff0c;意为没有连接&#xff1a; 2. 设置开机主屏幕显示&#xff1a; xrand…

TypeScript 设计模式之【建造者模式】

文章目录 **建造者模式**&#xff1a;打造你的梦想之屋建造者的秘密建造者有什么利与害&#xff1f;如何使用建造者搭建各种房子代码实现案例建造者模式的主要优点建造者模式的主要缺点建造者模式的适用场景总结 建造者模式&#xff1a;打造你的梦想之屋 假设你想要一栋完美的…

LeetCode[简单] 876. 链表的中间结点

给你单链表的头结点 head &#xff0c;请你找出并返回链表的中间结点。 如果有两个中间结点&#xff0c;则返回第二个中间结点。 思路 对任意正整数 n&#xff0c;中间结点的编号可以表示成 ⌊2n​⌋1。 解法一 /*** Definition for singly-linked list.* public class L…

数据分析:线性回归计算嵌套的组间差异

文章目录 介绍加载依赖包导入数据数据预处理数据概览线性回归画图森林图的特点:森林图的作用:总结系统信息介绍 在统计学中,嵌套的组间差异分析是一种评估不同组别间差异的方法,尤其适用于层级结构或分组数据。通过线性回归模型,我们可以计算出各个变量对于因变量的影响,…