MySQL自动测试框架Test Framework浅析

TestFramework是MySQL的内置自动测试框架,它使用Perl脚本进行测试用例的加载和执行,包括服务器初始化、日志检查等功能。该框架支持对SQL语句的测试,确保MySQL服务器和客户端程序的正确运行。通过对比测试结果与预期,TestFramework帮助开发者查找和修复bug。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

MySQL自动测试框架Test Framework浅析

MySQL Test Framework是一个以MySQL框架和内部引擎为测试对象的单元测试工具,能对MySQL实施SQL级别的功能测试。本文简要分析Test Framework框架主要的内部组件交互过程,方便开发者了解其运行机制,从而高质量的撰写测试用例,查找bug。

1 简介

Test Framework是MySQL自带的支撑MySQL框架和内部引擎的自动测试框架,提供验证MySQL服务器及其客户端程序是否正常运行的方法。
Test Framework既能测试SQL语句,也能根据实际需要测试不同启动参数配置的MySQL服务器和客户端从而验证指定的功能逻辑。经过MySQL团队的持续维护, Test Framework目前包含大约5000个左右的测试用例,且在继续增加。
Test Framework自动测试框架主要使用Perl脚本语言编写。Perl脚本负责自动加载所需的测试用例文件、mysqld的初始化和启停、mysqltest的执行、创删文件夹、保存日志输出信息等工作(见图1)。
在这里插入图片描述
图1 Test Framework内部组件交互时序图

2 Test Framework架构分析

Test Framework需要初始化参数、收集测试用例、初始化服务器、运行工作子进程、结果信息的输出保存等步骤。接下来重点分析:

1)、初始化服务器(initialize_servers())

在设置读取到的命令行的选项参数(command_line_setup())以及收集完本次所需的测试用例文件(collect_test_cases())后,需要初始化mysqld服务器。
首先创建var目录,var目录保存MySQL数据文件、日志信息、临时文件,运行期间产生的临时文件会在成功执行后删除。
之后运行mysql_install_db()进行服务器的初始化。通过fork创建出一个子进程,在子进程中通过调用exec执行mysqld进行初始化,将参数args和必要的SQL语句导入,初始化后mysqld退出,主进程对子进程回收(见图2)。mtr数据库保存了测试用例可能用到的存储进程、临时表、变量等,可以在测试用例文件中直接调用。
在这里插入图片描述
图2 Test Framework初始化服务器阶段逻辑图
初始化的数据,在每次服务器需要启动使用时拷贝,每个服务器生成自己的UUID。

2)、运行工作子进程(run_worker())

主进程在初始化套接字后,根据并行数parallel(默认为1)启动一个或多个子进程用于执行测试用例。在子进程run_worker()中循环监听主进程发送的消息,如果接收到‘TESTCASE’类型消息,则执行测试用例run_testcase()。
启动mysqltest通过fork形成子进程,在子进程中调用exec执行mysqltest。
虽然本意是测试自写的测试用例文件,但是Test Framework做了很多额外的工作,这些工作并不多余。在执行真正的测试用例文件之前,Test Framework会进行第一次check_testcase(),mode=”before”,并在结束后再执行一次check_testcase(),mode=”after”,每次执行都是调用mysqltest执行一遍check_testcase.test测试用例文件,并将结果保存。执行两次的目的是,检查对比前后执行的结果,防止执行真正的测试用例改变服务器中的数据,保证前后数据的一致性。
check_warnings()检查服务器的输出日志是否存在可疑的日志消息。Test Framework明确100多种通用的需要抑制的警告或者错误信息,其他的输出信息会被当做可疑日志信息,保存在后缀为.warnings的文件中。
在这里插入图片描述
图3 Test Framework执行工作子进程阶段逻辑图

3)、主进程接收子进程的执行结果(run_test_server())

父子进程的通信方式采用C\S架构,主进程为Server,子进程为Client,主进程有测试任务,将测试参数发送给子进程,子进程执行完后将结果告诉主进程,父子进程以问答的形式进行通信,直至测试结束。
如图4所示,首先主进程会阻塞等待,在子进程初始化套接字后,主进程accept子进程链接请求(序号①);然后主进程向子进程发送HELLO字符串,用于回答子进程的链接请求(②);子进程在接收到HELLO字符串后,向主进程发送START字符串,表示子进程已就绪,开始执行测试用例(③);主进程接收START字符串,将收集的本次测试用例文件参数,发送给子进程(④);子进程读取到主进程发送的测试用例参数请求后,执行run_testcase(),依次调用mysqltest执行check_testcase()、start_mysqltest、check_warnings()和check_testcase()测试用例,如果执行成功,则将结果发送给主进程(⑤);主进程接收子进程的结果信息后,输出并保存,如果还有其他的测试用例文件参数,则继续执行④,然后执行⑤,循环往复,直到执行完最后一个测试用例,则主进程向子进程发送BYE字符串,表示执行结束退出(⑥);子进程接收到BYE字符串,则整个子进程退出,然后主进程清理回收,输出并保存本次测试的各种统计信息,至此完成一次完整的Test Framework测试。
在这里插入图片描述
图4 Test Framework父子进程通信逻辑图
Test Framework提供运行单元测试和创建新单元测试的功能方法。通过执行测试用例文件,比对实际测试结果与预期结果文件,根据对比结果是否一致判定是否测试通过。运行的测试结果信息展示各阶段运行的信息、测试结果信息以及统计信息(结果信息见图5、图6)。
在这里插入图片描述
图5 Test Framework测试通过结果图
在这里插入图片描述
图6 Test Framework测试失败结果图

3 小结

代码的正确性是软件优秀的基础。Test Framework能对MySQL实施SQL级别的功能测试,实现测试自动化,帮助开发者定位错误,查找bug,从而有针对性的实施修复。

如果对MySQL自动化测试框架Test Framework的实践感兴趣,请点击MySQL自动测试框架Test Framework工具实践

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值