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用例重启的操作

  1. 在所有用例之前初始化一份数据;
  2. 当前用例如果检测到运行环境(配置参数)与之前相同,则在之前的数据基础上运行;
  3. 如果检测到运行环境(配置参数)与之前不相同,则把原始的数据拷贝一份,在此基础上运行。相当于还原数据库,消除用例之间的影响。

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后面的参数会覆盖默认的参数

posted @ 2018-11-22 22:30  IUNI_JM  阅读(153)  评论(0)    收藏  举报