mysqltest語法整理


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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM