海山数据库(He3DB)源码详解:海山Mysql 自动测试框架MTR
一、MySQL自动测试框架原理
1、简介
在修改内核代码后,不仅需要测试新增功能,同时也要对原有功能做回归测试,以保证新加代码对原有功能没有影响,这就需要用到MySQL源码自带的测试框架MySQL Test Framework,简称MTR。
Test Framework主要应用于MySQL等相关数据库项目开发测试,对单个功能点或者模块进行正确性和功能性测试,该工具在SQL级别对MySQL进行单元测试。Test Framework不仅仅能测试SQL语句,也能根据实际需要测试不同启动参数配置的MySQL服务器和客户端从而验证指定的功能逻辑。
2、原理实现
- 操作步骤:
(1)初始化参数
(2)收集测试用例
(3)初始化服务器
(4)运行工作子进程
(5)结果信息的输出保存

Test Framework需要初始化参数、收集测试用例、初始化服务器、运行工作子进程、结果信息的输出保存等步骤。接下来重点分析:
1)初始化服务器(initialize_servers())
在设置读取到的命令行的选项参数(command_line_setup())以及收集完本次所需的测试用例文件(collect_test_cases())后,需要初始化mysqld服务器。
首先创建var目录,var目录保存MySQL数据文件、日志信息、临时文件,运行期间产生的临时文件会在成功执行后删除。之后运行mysql_install_db()进行服务器的初始化。
2)运行工作子进程(run_worker())
通过_safe_fork()创建子进程,主进程在初始化套接字后,根据并行数parallel(默认为1)启动一个或多个子进程用于执行测试用例。在子进程run_worker()中循环监听主进程发送的消息,如果接收到‘TESTCASE’类型消息,则执行测试用例run_testcase()。
在执行真正的测试用例文件之前,Test Framework会进行第一次check_testcase(),mode=”before”,并在结束后再执行一次check_testcase(),mode=”after”,每次执行都是调用mysqltest执行一遍check_testcase.test测试用例文件,并将结果保存。执行两次的目的是,检查对比前后执行的结果,防止执行真正的测试用例改变服务器中的数据,保证前后数据的一致性。
check_warnings()检查服务器的输出日志是否存在可疑的日志消息。Test Framework明确100多种通用的需要抑制的警告或者错误信息,其他的输出信息会被当做可疑日志信息,保存在后缀为.warnings的文件中。
3)主进程接收子进程的执行结果(run_test_server())
启动的run_worker与主线程之间是server-client模式,主线程是server,run_worker()是 client。
主线程与run_worker是一问一答模式,主线程向run_worker发送运行用例的文件路径、配置文件参数等各种参数信息,run_worker向主线程返回运行结果,直到所有在collection中的用例都运行完毕,主线程close各run_worker,进行收尾工作。
主线程先读取各run_worker返回值,对上一个用例进行收尾工作。之后,读取collection中的用例,通过本地socket发送到run_worker线程,run_worker线程接收到主线程命令,运行本次用例执行函数run_testcase(),而run_testcase()主要负责3件事:启动mysqld、启动并监控mysqltest,处理执行结果。
- 整体流程
-启动
mysqld:根据参数启动一个或者多个mysqld(start_servers()),在start_servers大多数情况下会拷贝主线程初始化后的目录到run_worker的目录,作为新实例的启动目录,用

最低0.47元/天 解锁文章
1554

被折叠的 条评论
为什么被折叠?



