1. mysqltest case的语法比较简单,分三类:
  2. 1. command
  3. command用来控制运行时的行为,后面重点介绍。
  4. 一般有两种写法:
  5. command; # 这是后面带;的
  6. --command # 前面带--,不需要;
  7. 另外,while和if要稍微特殊些。
  8. 2. sql
  9. 就是普通的sql语句,CASE里面大部分都是sql,以分号结束。
  10. 3. comment
  11. 就是注释,用#开头
  12. mysqltest提供了几十个command,下面只介绍我们常用的。
  13. 1. --error
  14. 有些CASE就是要验证sql失败的情况,在sql语句前面加上—error 错误码就可以了。--error后面可以跟两种值,一种是error no,另外一种是sqlstate,如果是后者需要加上S做前缀。
  15. 比如:
  16. --error 65535
  17. create table t1(pk createtime primary key, a int);
  18. --error SHY000
  19. select a from t1 union select * from t2;
  20. 2. disable_abort_on_error / enable_abort_on_error
  21. 默认情况下(enable)sql执行失败后mysqltest就退出了,后面的内容就不会执行,也不会生成reject文件,显示执行disable命令可以在sql失败后继续执行后面的内容,并生成reject文件。
  22. 3. disable_query_log / enable_query_log
  23. 默认情况下(enable)所有的sql语句都会在result文件中记录,在一些情况下(比如使用了循环可能query特别多)不想打开显示调用disable既可。
  24. 其他形如enable_XX/disable_XX的命令还有很多,用法都类似。
  25. 4. enable_parsing/disable_parsing
  26. 用来注释多行,跟comment类似。
  27. 5. connect/disconnect与conncetion
  28. 测试session的时候可能会用到这两个命令,前者是建立或断开一个连接。后者是表示使用哪个连接执行sql语句,可以在多个connection之间切换
  29. 比如:
  30. connect (conn3,127.0.0.1,root,,test,25042);
  31. connection conn3;
  32. create table t1(a int primary key);
  33. drop table t1;
  34. disconnect conn3;
  35. 6. system/exec
  36. 执行shell命令
  37. 7. perl [terminator]
  38. 嵌入perl code,直到terminator位置,比如:
  39. perl END_OF_FILE;
  40. print "This is another test\n";
  41. END_OF_FILE
  42. 8. vertical_results/horizontal_results
  43. 功能跟sql语句的’\G’类似
  44. 9. exit
  45. 退出,其后的内容不会执行
  46. 10. let $var_name = value
  47. 变量赋值,整数、字符串都可以
  48. 11. inc $var_name/dec $var_name
  49. 整数加1/减1,是mysqltest唯一支持的运算。
  50. 12. eval
  51. 执行sql语句,支持变量的传递,比如:
  52. eval insert into t1(i,c1,c256,dt,d) values(0,'1','$i','2012-10-10 12:00:00','2012-10-10');
  53. 13. query
  54. mysqltest解释每一行的时候会先判断是sql语句还是command,如果是query指定的,都认为是sql语句,这是避免comand名字与sql有冲突,一般也不会。
  55. 14. send/reap/eval_send
  56. 发送query后不用等待结果立即返回,在reap之前不能使用同一个connection发送sql语句。
  57. eval_send支持变量传递。
  58. 15. echo
  59. 打印
  60. 16. query_get_value(query, col_name, row_num)
  61. 获得query返回的结果中某行某列的值
  62. 17. source
  63. 多个case可能共用一块代码,这块代码可以单独放到一个文件,通过source导入。
  64. 18. require
  65. 将下一个query的结果与require指定的结果文件做对比,如果匹配失败就报“this test is not supported”的错误。这个一般用于判断test是否可以在某版本中使用。
  66. 19. result
  67. 显式指定保存运行结果的文件路径
  68. 20. sleep/real_sleep
  69. 休眠.
  70. 21. replace_column
  71. 对查询结果的某些列的值进行替换,有些结果是随着执行时间变化的,比如createtime或modifytime类型,为了比较可以用这个命令将这个值替换成某常量。比如:
  72. --replace_column 2 searched
  73. select pk,b from t1;
  74. 22. if(exptr)
  75. {
  76. }
  77. 当Exptr非0,就执行大括号部分。注意,mysqltest没有提供else if或else。低版本的mysqltest不支持exptr为比较表达式。
  78. 比如:
  79. if($value_now == $value_orig)
  80. {
  81. --echo succeed
  82. }
  83. 23. while(exptr)
  84. {
  85. }
  86. 执行大括号部分,知道exptr为0. 低版本的mysqltest不支持exptr为比较表达式。没有break类似的命令,可以使用end试试。
  87. 比如:
  88. while($i < 10000)
  89. {
  90. eval insert into t1(i,c1,c256,dt,d) values(0,'1','$i','2012-10-10 12:00:00','2012-10-10');
  91. inc $i;
  92. }
  93. 其他的命令还有:
  94. 1. ping,shutdown,save_master_pos,sync_slave_with_master , sync_with_master 等等,类似于mysqladmin/mysql(我们暂不支持)的功能。
  95. 2. start_timer等计时命令
  96. 3. append_file, mv, remove_file,chmod,write_file等文件操作的命令
  97. 详细请参考:http://dev.mysql.com/doc/mysqltest/2.0/en/mysqltest-commands.html