1. mysqltest是mysql自带的测试引擎, 它实现了一种小语言,用来描述测试过程,并将测试结果与预期对比。

 小语言按照语法大致分为三类:mysql command,sql,comment。sql和comment很容易理解,前者是mysql支持的sql,

 后者是注释,一般用来描述测试过程.  mysqltest解释的是以test为后缀名的文本文件

mysqltest case的语法比较简单,分三类:
1. command

command用来控制运行时的行为,后面重点介绍。
一般有两种写法:
command; # 这是后面带;的
--command # 前面带--,不需要;
另外,while和if要稍微特殊些。

2. sql
  就是普通的sql语句,CASE里面大部分都是sql,以分号结束。
3. comment
  就是注释,用#开头

mysqltest提供了几十个command,下面只介绍我们常用的。

1. --error
有些CASE就是要验证sql失败的情况,在sql语句前面加上—error 错误码就可以了。--error后面可以跟两种值,一种是error no,另外一种是sqlstate,如果是后者需要加上S做前缀。
比如:
--error 65535
create table t1(pk createtime primary key, a int);

--error SHY000
select a from t1 union select * from t2;
2. disable_abort_on_error / enable_abort_on_error
默认情况下(enable)sql执行失败后mysqltest就退出了,后面的内容就不会执行,也不会生成reject文件,显示执行disable命令可以在sql失败后继续执行后面的内容,并生成reject文件。
3. disable_query_log / enable_query_log
默认情况下(enable)所有的sql语句都会在result文件中记录,在一些情况下(比如使用了循环可能query特别多)不想打开显示调用disable既可。
其他形如enable_XX/disable_XX的命令还有很多,用法都类似。
4. enable_parsing/disable_parsing
用来注释多行,跟comment类似。
5. connect/disconnect与conncetion
测试session的时候可能会用到这两个命令,前者是建立或断开一个连接。后者是表示使用哪个连接执行sql语句,可以在多个connection之间切换
比如:
connect (conn3,127.0.0.1,root,,test,25042);
connection conn3;
create table t1(a int primary key);
drop table t1;
disconnect conn3;
6. system/exec
执行shell命令
7. perl [terminator]
嵌入perl code,直到terminator位置,比如:
perl END_OF_FILE;
print "This is another test\n";
END_OF_FILE
8. vertical_results/horizontal_results
功能跟sql语句的’\G’类似
9. exit
退出,其后的内容不会执行
10. let $var_name = value
变量赋值,整数、字符串都可以
11. inc $var_name/dec $var_name
整数加1/减1,是mysqltest唯一支持的运算。
12. eval
执行sql语句,支持变量的传递,比如:
eval insert into t1(i,c1,c256,dt,d) values(0,'1','$i','2012-10-10 12:00:00','2012-10-10');
13. query
mysqltest解释每一行的时候会先判断是sql语句还是command,如果是query指定的,都认为是sql语句,这是避免comand名字与sql有冲突,一般也不会。
14. send/reap/eval_send
发送query后不用等待结果立即返回,在reap之前不能使用同一个connection发送sql语句。
eval_send支持变量传递。
15. echo
打印
16. query_get_value(query, col_name, row_num)
获得query返回的结果中某行某列的值
17. source
多个case可能共用一块代码,这块代码可以单独放到一个文件,通过source导入。
18. require
将下一个query的结果与require指定的结果文件做对比,如果匹配失败就报“this test is not supported”的错误。这个一般用于判断test是否可以在某版本中使用。
19. result
显式指定保存运行结果的文件路径
20. sleep/real_sleep
休眠.
21. replace_column
对查询结果的某些列的值进行替换,有些结果是随着执行时间变化的,比如createtime或modifytime类型,为了比较可以用这个命令将这个值替换成某常量。比如:
--replace_column 2 searched
select pk,b from t1;
22. if(exptr)
{
}
当Exptr非0,就执行大括号部分。注意,mysqltest没有提供else if或else。低版本的mysqltest不支持exptr为比较表达式。
比如:
if($value_now == $value_orig)
{
--echo succeed
}
23. while(exptr)
{
}
执行大括号部分,知道exptr为0. 低版本的mysqltest不支持exptr为比较表达式。没有break类似的命令,可以使用end试试。
比如:
while($i < 10000)
{
eval insert into t1(i,c1,c256,dt,d) values(0,'1','$i','2012-10-10 12:00:00','2012-10-10');
inc $i;
}
其他的命令还有:
1. ping,shutdown,save_master_pos,sync_slave_with_master , sync_with_master 等等,类似于mysqladmin/mysql(我们暂不支持)的功能。
2. start_timer等计时命令
3. append_file, mv, remove_file,chmod,write_file等文件操作的命令

详细请参考:http://dev.mysql.com/doc/mysqltest/2.0/en/mysqltest-commands.html

语法代码实列如下:

--echo # 修改session的值,使用脚本来测别名的更改.
connect (conn1,$OBMYSQL_MS0,root@sys,,ob,$OBMYSQL_PORT);
connect (conn2,$OBMYSQL_MS0,admin@oracle,admin,test,$OBMYSQL_PORT);

let $current_num=1;
let $number=575;
while ($current_num <= $number)
{
connection conn1;
let $tz_name = query_get_value(select name from oceanbase.__all_time_zone_name order by name, name, $current_num);
connection conn2;
eval alter session set time_zone='$tz_name';
eval select sessiontimezone from dual;
inc $current_num;
}

mysqltest语法整理的更多相关文章

  1. Markdown 语法整理

    Markdown 语法整理 白宁超 2015年7月24日14:57:49 一.字体设置 A First Level Header == A Second Level Header -- # 标题 ## ...

  2. JQuery插件之【jqGrid】常用语法整理

    jqGrid常用语法整理,包含数据获取.常用函数.触发事件等 jqGrid表格数据获取相关语法 获取表格所有数据 $("#grid").jqGrid("getRowDat ...

  3. Markdown语法整理

    标题 语法格式:'#'+'空格'+'文本',一共6级 # 一级标题 ## 二级标题 ### 三级标题 #### 四级标题 ##### 五级标题 ###### 六级标题 斜体 语法格式:1个星号包裹,我 ...

  4. SQL中部分语法整理

    1.SELECT DISTINCT 语句 关键词DISTINCT用于返回唯一不同的值. 语法: SELECT DISTINCT 列名称 FROM 表名称 2.SELECT INTO语句 SELECT ...

  5. SQL语法整理

    SQL是Structured Query Language的缩写,中文全名为结构化查询语言,是一种用于数据存储,查询,更新和管理的关系数据库系统. SQL语法 创建表 create table tab ...

  6. SQL_Server 常用语句以及语法整理

    下列语句部分是Mssql语句,不可以在access中使用. SQL分类: DDL—数据定义语言(CREATE,ALTER,DROP,DECLARE) DML—数据操纵语言(SELECT,DELETE, ...

  7. JSP基础知识➣语法整理(二)

    A.脚本程序 脚本程序可以包含任意量的Java语句.变量.方法或表达式,只要它们在脚本语言中是有效的. 脚本程序的语法格式:<% 代码片段 %>,但是不能包含文件的方法和变量的声明 B.J ...

  8. Markdown 语法整理大集合2017

    简明教程:https://ouweiya.gitbooks.io/markdown/ 1.标题 代码 注:# 后面保持空格 # h1 ## h2 ### h3 #### h4 ##### h5 ### ...

  9. ABAP OO 开发语法整理

    [转自 http://blog.csdn.net/saphome/article/details/6956933] 在类中,只能用TYPE 附加关键字指定数据类型. •TYPES: 一般的类型定义方法 ...

随机推荐

  1. #undef常用法

    Copy from C语言中#undef的语法是: #undef 标识符 用来将前面定义的宏标识符取消定义. 整理了如下几种常见用法,如果以后发现其他的再添加进来. 1.在一个程序块中用完宏定义后,为 ...

  2. HTML连载42-清空默认边距、文字行高

    一.            webstorm取色技巧:webstorm内置了颜色取色器,我们对某种颜色未知的时候,可以利用下图中的取色器,进行颜色识别. 二.系统会默认给body添加外边距,因此我们对 ...

  3. C语言程序设计100例之(3): Cantor表

    例3    Cantor表 题目描述 现代数学的著名证明之一是Georg Cantor证明了有理数是可枚举的.他是用下面这一张表来证明这一命题的: 1/1  1/2  1/3  1/4  …… 2/1 ...

  4. 实例属性和方法的动态处理(__getattr__)

    正常情况下,当调用类的方法或属性时,如果不存在,就会报错 要避免这个错误,除了可以加上那个要调用但不存在的属性外,Python还有另一个机制,那就是写一个__getattr__()方法,动态返回一个属 ...

  5. Python中model转dict

    问题 在query出来的行信息object中有一个dict变量,这个变量存储了字典信息 for u in session.query(User).all(): print u.__dict__ 但是这 ...

  6. linux 安装 nvm, node.js, npm

    vscode在wsl中开发node应用,如何安装nvm? git clone git@github.com:nvm-sh/nvm.git ~/.nvm 设置淘宝registry npm config ...

  7. java高并发系列 - 第4天:JMM相关的一些概念

    JMM(java内存模型),由于并发程序要比串行程序复杂很多,其中一个重要原因是并发程序中数据访问一致性和安全性将会受到严重挑战.如何保证一个线程可以看到正确的数据呢?这个问题看起来很白痴.对于串行程 ...

  8. int[]里数的个数怎么由输入决定?-----动态数组。

    java中如何创建动态数组?(摘自百度知道) Java动态数组是一种可以任意伸缩数组长度的对象,在Java中比较常用的是ArrayList,ArrayList是javaAPI中自带的java.util ...

  9. SpringBoot(三) 配置文件 篇章

    SpringBoot 配置文件默认为application.properties,但是本章节主要讲解yaml文件配置,因为现在的趋势是使用yaml,它是类似于标准通用标记语言的子集XML的数据描述语言 ...

  10. SSM框架之Mybatis(4)SqlMapConfig

    Mybatis(4)SqlMapConfig.xml SqlMapConfig.xml 中配置的内容和顺序 -properties (属性) --property -settings(全局配置参数) ...