当前位置: 首页 > 工具软件 > mysqltest > 使用案例 >

MySQL里的test_mysqltest语法整理

萧升
2023-12-01

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,,oceanbase,$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;

}

 类似资料: