MySQL - MTR总结
MySQL - MTR
简介
MySQL测试框架:The MySQL Test Framework
mysql-test-run.pl选项:Run MySQL Test Suite
MTR测试语言:mysqltest Language Reference
MTR使用方法
单个用例
./mtr 1st
测试套
./mtr --suite=main
用例列表
./mtr --do-test-list=test_list
test_list的格式如下:
<test_name>
<test_name>.test
<suite_name>.<test_name>
<suite_name>.<test_name>.test
path_to_the_test_file
指定开始用例
./mtr --noreorder --start-from=1st
指定前缀
./mtr --suite=main --do-test=window
注意:不能直接写--do-test=main.window,这样会在所有的测试套下面找。
跳过用例
./mtr --suite=main --skip-test=window
MTR常用选项
- --noreorder / --reorder
不进行顺序优化以减少重启次数,严格按照用例顺序进行。默认是reorder。
- --nowarnings
不从日志中寻找errors和warning,这样会导致用例失败。
- --parallel
指定多个线程。
- --force
如果用例失败,MTR继续运行。
- --retry
如果用例失败,尝试运行N次。但是连续失败2次,就会停止。需要和--force结合,否则无效。
- --verbose
打印用例执行的详细信息。
- --verbose-restart
打印用例用例重启的原因。
- --manual-gdb
以debug模式启动mysqld,适合单个用例。这样的好处是,如果挂了,gdb中会存在相应的堆栈。如果设置了core路径,gdb启动则就没什么用处。
MTR用例重启的原因
- 用例有opt配置文件:重启;
- 用例的opt配置文件中有--bootstrap开头的选项:重新初始化;
注意:重启还有其他的原因,但是上述是主要原因。
MTR用例重启的操作
- 在所有用例之前初始化一份数据;
- 当前用例如果检测到运行环境(配置参数)与之前相同,则在之前的数据基础上运行;
- 如果检测到运行环境(配置参数)与之前不相同,则把原始的数据拷贝一份,在此基础上运行。相当于还原数据库,消除用例之间的影响。
MTR基本运行流程
• main
○ initialize_servers #Initialize and start.
○ run_worker
§ run_testcase
□ servers_need_restart
® server_need_restart
□ stop_servers
® mtr_report("Restarting all servers");
® mysqld_stop
□ start_servers
® mysqld_start
□ do_before_run_mysqltest
□ check_testcase($tinfo, "before") #Check all server for sideffects.
® start_check_testcase #Return the newly started process.
◊ my $proc = My::SafeProcess->new(mysqltest...)
◊ mtr_report("Started $proc")
® My::SafeProcess->wait_any_timeout($timeout)
® mtr_report("Got $proc")
□ start_mysqltest
□ check_testcase($tinfo, "after")
□ stop_all_servers
MTR忽略相关输出
- 忽略语句的错误输出
--error error_code [, error_code] ...
example: --error 1050; --error S42S01
- 忽略语句的某些输出
--replace_regex /pattern/replacement/[i] ...
example: --replace_regex /.*mysql.*// 这样下一行语句的实际输出中就没有包含“mysql”的行,对应的修改预期结果即可。
- 忽略日志的warning和error
加命令行参数--nowarnings。
- 忽略日志的某些输出
call mtr.add_suppression("The table 't[0-9]*' is full");
能够忽略"The table 't12' is full"这样的warning。
mysqltest
bin/mysqltest -uroot -p --socket=/xxx/mysql.sock --database=test --basedir=/xxx/mysql-8.0.12/mysql-test/ --test-file=t/1st.test --record --result-file=1st.log
mysql-stress-test.pl实际上是调用mysqltest来执行测试用例的,所以我们可以手动初始化和启动MySQL,然后调用mysqltest来执行用例。--database是指已存在的数据库,用例将在此数据库中运行。--record和--result-file要结合使用,目的是为了记录实际的输出。
mysqltest Commands
- exec command [arg] ...
Execute the shell command using the popen() library call. (执行控制台命令)
- eval statement
Evaluate the statement by replacing references to variables within the text with the corresponding values. Then send the resulting statement to the server to be executed. (执行发送给SQL Server的命令)
- echo text
Echo the text to the test result. (输出到result文件)
输出到屏幕:--exec echo text
perl调试
perl -d ./mtr --noreorder --start-from=1st
基本命令:b: 断点; n: 下一步; s: 进入; c: 继续运行到下一个断点或指定行; r: 运行直到当前函数结束。
MTR用例失败定位方法
1. check_testcase失败
- 看用例是否新生成了目录和文件
- 看用例是否修改了系统参数但没有还原
2. 预期不对
- 输出有变化:看实际输出,找到对应的语句,深入分析
- 可变的输出:进行过滤
- 格式不对:确认格式不对的原因,进行修复
- 查找相关信息不匹配:找到对应的语句,深入分析
- 查找相关信息找不到:信息被输出到日志中了,重定向无效
3. 日志中有错误
- 用例中某些测试错误场景的语句重定向无效(开启了log-error)
4. 某一行语句执行失败
- 查看参数配置文件opt和cnf,与原生对比,看是否关闭了某些功能
5. mysqld挂掉
- 看错误日志,core文件,分析代码
MTR用例中重启的命令
1. mysqld.1.expect
- 关闭:--exec echo "wait" > MYSQLTEST_VARDIR/tmp/mysqld.1.expect
- 重启:--exec echo "restart: params" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect
- restart是立即重启
- restart后面的参数会覆盖默认的参数
- mysqld.2.expect可以用于备机
- 如果有--defaults-file / --no-defaults等参数,在原来和新加的所有参数中,这些参数会被放在最开始的位置
2. restart_mysqld.inc
- --let $restart_parameters= "restart: params"
- --source include/restart_mysqld.inc
- restart后面的参数会覆盖默认的参数