TiDB IntegrationTest 集成测试套件实战指南运行、录制与调试执行计划回归测试【免费下载链接】tidbTiDB is built for agentic workloads that grow unpredictably, with ACID guarantees and native support for transactions, analytics, and vector search. No data silos. No noisy neighbors. No infrastructure ceiling.项目地址: https://gitcode.com/GitHub_Trending/ti/tidb导读tests/integrationtest是 TiDB 的集成测试套件它以SQL 输入 期望输出的黄金文件golden file模式系统性地验证 TiDB 的执行计划EXPLAIN 输出、查询结果与端到端行为。本文基于 tests/integrationtest/README.md 展开覆盖经典 Runnerrun-tests.sh与新一代基于真实 TiKV 集群的 Runnerrun-tests-next-gen.sh并深入脚本源码说明每个选项的行为、结果录制机制与调试方法。读完本文你将掌握如何运行全部集成测试、如何用-r生成新的期望结果、如何在 VSCode/Goland 中单步调试 TiDB-Server以及新老两套 Runner 的底层差异。一、套件概览目录结构与工作模式集成测试套件位于 tests/integrationtest 目录其核心资产分为四类路径作用t/测试用例输入共 258 个*.test文件按模块分子目录ddl/、executor/、expression/、planner/等也有explain.test、select.test、index_merge.test等平铺用例r/期望输出与t/一一对应的*.result文件同样按模块组织s.zip打包的统计信息statistics用于s/*.json统计数据的加载保证 EXPLAIN 类用例在固定统计信息下输出稳定config.toml、disable_new_collation.toml启动 TiDB-Server 用的配置文件区别在于new_collations_enabled_on_first_bootstrap是否为true以最基础的 t/select.test 为例测试内容就是一段可执行的 SQL 脚本CREATE TABLE、INSERT、若干SELECT而对应的 r/select.result 则是每条 SQL 的期望输出——SQL 语句原样回显随后紧跟制表符分隔的结果集SELECT * from t; c1 c2 c3 1 2 3 SELECT c1 as a, c2 as a from t; a a 1 2整个套件的执行模型是对每条t/*.test中的 SQL执行后与r/*.result逐字对比统计信息从s.zip解压出的s/*.json加载当执行计划或行为发生变化时对比失败即测试失败。这种模式特别适合捕捉执行计划变更这类难以用断言函数描述的回归。二、Quick Start两种 Runner1. 经典 Runnerrun-tests.sh使用默认配置运行全部集成测试./run-tests.sh该脚本的完整行为链详见 run-tests.sh解压s.zip提取统计信息extract_stats函数使用unzip -qq s.zip默认构建测试用二进制TiDB-Server输出为integrationtest_tidb-server与mysql_tester一个 MySQL 协议驱动的测试执行器通过go install github.com/pingcap/mysql-tester/src安装自动挑选两个空闲端口从 4000 起探测find_multiple_available_ports一个作为 SQL 服务端口、一个作为 status 端口以 config.toml或禁用新排序规则时的disable_new_collation.toml启动tidb-server默认使用-store unistore内存/本地存储引擎即不依赖外部集群运行mysql_tester执行测试并对比结果测试日志输出到integration-test.out通过trap在退出时清理所有后台进程并在结束时检查日志中的DATA RACE详见下文数据竞态检查。注脚本固定export TZAsia/Shanghai确保时间函数类用例如NOW()、FROM_UNIXTIME在不同机器上输出一致这是黄金文件对比稳定的关键前提。2. 新一代 Runnerrun-tests-next-gen.sh真实 TiKV 集群./run-tests-next-gen.sh [run-tests.sh options]从源码看run-tests-next-gen.sh它做的事非常直接导出TIDB_TEST_STORE_NAMEtikv和TIKV_PATH127.0.0.1:2379把存储后端切换为真实 TiKV调用 tests/realtikvtest/scripts/next-gen/bootstrap-test-with-cluster.sh 引导真实集群引导完成后以NEXT_GEN1环境变量调用run-tests.sh把你的全部选项原样透传。这意味着所有run-tests.sh支持的选项都可以传给run-tests-next-gen.sh。端口占用要求run-tests-next-gen.sh会拉起一整套 TiDB 生态组件需要以下 TCP 端口空闲PD2379、2380、2381、2383、23843 个 PD 实例的 client/peer 端口TiKV20160、20161、20162存储端口与20180、20181、20182status 端口tikv-worker19000远程压缩/共享存储 worker。此外引导脚本还会在9000端口启动一个 MinIOS3 兼容对象存储用于创建next-gen-testbucket并可根据STARTER_COLUMNAR_AP环境变量选择是否额外拉起 TiFlash Compute 节点。集群启动后 sleep 10 秒等待就绪再进入测试阶段。三、脚本选项详解run-tests.sh选项全表以下为 run-tests.sh 中help_message与getopts解析逻辑所定义的全部选项Usage: ./run-tests.sh [options] -h: 打印帮助信息。 -d y|Y|n|N|b|B: 控制新排序规则new collation特性 y 或 Y: 测试期间只启用新排序规则。 n 或 N: 测试期间只禁用新排序规则。 b 或 B: 对以 collation 前缀命名的用例同时跑启用/禁用两轮 其余用例只启用 [默认值]。 -s tidb-server-path: 使用指定路径的 tidb-server 二进制进行测试。 示例: ./run-tests.sh -s ./integrationtest_tidb-server -b y|Y|n|N: 是否构建测试二进制 y 或 Y: 构建 [默认]。 n 或 N: 不构建。 若提供了 -s则跳过 tidb-server 的构建。 -r test-name|all: 运行指定的一个或多个测试用例并将结果录制到 r/test-name.result。 示例: ./run-tests.sh -r select 使用 all 录制全部测试的结果。 -t test-name: 运行指定的测试用例若同时提供了 -r 则忽略 -t。 示例: ./run-tests.sh -t select 不提供时运行全部测试。 -v vendor-path: 将 vendor-path 加入 $GOPATH。 -p portgenerator-path: 使用指定的端口生成器进行端口分配。此外脚本还支持帮助信息中未列出、但getopts t:s:r:b:d:c:i:P:h明确解析的-P port选项直接连接一个已经运行在指定端口上的 tidb-server进行测试runs_on_port非零时自动跳过构建与自启服务器。这为外部已启动集群 复用二进制的场景提供了便利。选项组合的行为细节源码级构建策略build1时若未指定-s则调用build_tidb_server——当TIDB_TEST_STORE_NAMEtikv时执行make -C ../.. server SERVER_OUT$tidb_server不带 race否则追加RACE_FLAG-race即经典模式默认开启竞态检测编译mysql_tester则统一通过go install构建。录制模式-r使record1mysql_tester会附加--record参数-r all录制全部用例-r name只录制指定用例。录制时同时开启--check-errortrue以校验 SQL 错误。新排序规则双轮执行collation_opt控制执行轮次。默认-d bcollation_opt2时脚本先以enabled_new_collation0使用disable_new_collation.toml对应new_collations_enabled_on_first_bootstrapfalse跑一轮再以enabled_new_collation1使用config.toml对应new_collations_enabled_on_first_bootstraptrue跑一轮-d y只跑启用轮-d n只跑禁用轮。check_case_name函数做了更细的优化非b模式下若用例名以collation开头则自动按双轮处理否则只启用新排序规则。这也解释了r/目录中collation_misc_enabled.result与collation_misc_disabled.result成对存在的原因。-c选项getopts字符串中的c:目前没有对应 case 分支属于预留项实际使用请忽略。新一代 Runner 的附加说明run-tests-next-gen.sh把run-tests.sh的所有选项原样透传因此-r、-t、-s等均可用由于它强制TIDB_TEST_STORE_NAMEtikvTiDB-Server 将以-store tikv -path 127.0.0.1:2379连接真实 PD/TiKV引导脚本会临时创建数据目录并在结束后killall清理 PD/TiKV/tikv-worker/MinIO 进程同时执行make failpoint-disable复位 failpoint 状态。四、工作原理黄金文件对比闭环结合 run-tests.sh 源码整个测试闭环如下准备阶段解压s.zip→ 构建/定位tidb-server与mysql_tester→ 探测空闲端口启动阶段start_tidb_server依据存储后端与 NEXT_GEN 模式拼装启动参数经典模式-store unistore -path 真实 TiKV 模式-store tikv -path ${TIKV_PATH}新一代模式NEXT_GEN非空且非0/false额外追加-keyspace-name SYSTEM --tidb-service-scope dxf_service即按 keyspace 与 service-scope 方式接入分布式 TiDB 服务执行阶段mysql_tester -port port --check-errortrue --collation-disabletrue|false运行用例--collation-disable与脚本的-d选择联动对比阶段mysql_tester将实际输出与r/*.result逐行对比任何差异包括结果集内容与 SQL 报错都会判失败清理与校验kill -15关闭 TiDB-Server等待进程退出check_data_race在经典模式下扫描integration-test.out发现DATA RACE即打印日志并以非零码退出——竞态检测因此成为回归流程的硬性门槛。五、典型工作流1. 代码改动后的回归测试修改 TiDB 代码尤其是优化器、执行器后运行make dev或只跑集成测试部分make integrationtestmake integrationtest的实际命令见根目录 Makefile 中integrationtest目标第 188-192 行为integrationtest: server_check cd tests/integrationtest GOCOVERDIR../../$(TEST_COVERAGE_DIR) ./run-tests.sh -s ../../bin/tidb-server即它会先复用bin/tidb-server-s指定跳过重复构建并开启覆盖率收集GOCOVERDIR。如果你的改动影响了执行计划这里会立刻报出r/*.result的 diff从而定位回归。2. 新增或更新测试用例在 tests/integrationtest/t 下新增xxx.test文件或向已有文件追加 SQL 语句生成期望结果cd tests/integrationtest ./run-tests.sh -r [casename]脚本会执行t/casename.test并把输出录制到r/casename.result。生成后请人工审阅.result内容是否符合预期尤其是 EXPLAIN 输出再提交t/、r/两个文件。3. 运行单个用例快速验证./run-tests.sh -t select # 只跑 select 用例 ./run-tests.sh -t executor/xxx # 跑子目录下的用例4. 连接外部已有 TiDB-Server./run-tests.sh -P 4000 # 复用 4000 端口上已启动的 tidb-server六、调试集成测试VSCode在项目根目录.vscode/launch.json中添加如下调试配置示例来自 README可自行调整配置文件或后端{ version: 0.2.0, configurations: [ { name: Debug TiDB With Default Config, type: go, request: launch, mode: auto, program: ${fileWorkspaceFolder}/cmd/tidb-server, args: [--config${fileWorkspaceFolder}/pkg/config/config.toml.example] } ] }若需要改配置例如切换到 TiKV 后端运行集成测试可以修改 pkg/config/config.toml.example。TiDB-Server 入口位于 cmd/tidb-server。打开Run and Debug视图按F5启动 TiDB-Server用任意 MySQL 客户端连接默认端口4000用户root无密码mysql --comments --host 127.0.0.1 --port 4000 -u root之后就可以手工执行 SQL、打断点观察执行计划生成过程。Goland可参考仓库内开发文档如根目录 CLAUDE.md 与 docs/agents 中的开发指南了解 IDE 配置核心思路与 VSCode 一致以调试模式启动cmd/tidb-server带或不带 TiKV 均可再用 MySQL 客户端连接 4000 端口执行 SQL。对集成测试用例本身也可以在mysql_tester或 TiDB-Server 源码上打断点结合-t case复现具体用例。七、进阶新一代集群引导内部如果你关心run-tests-next-gen.sh到底拉起了什么tests/realtikvtest/scripts/next-gen/bootstrap-test-with-cluster.sh 给出了完整答案3 个 PDpd-0/1/2peer 端口2380/2381/2383client 端口2379/2382/2384--force-new-cluster强制初始化3 个 TiKVtikv-0/1/2监听20160/20161/20162status 端口20180/20181/20182均指向 3 个 PD 的 client 地址1 个 tikv-worker监听19000用于远程压缩与共享存储DFS场景1 个 MinIO9000端口bucket 固定为next-gen-test访问密钥默认minioadmin/minioadmin供 TiFlash 与 tikv-worker 的 S3 存储使用可选 TiFlash Compute当STARTER_COLUMNAR_AP为真时启动采用tiflash_compute拆分布式模式通过 MinIO 提供对象存储用于覆盖列式引擎相关用例。集群数据目录由mktemp -d动态创建测试结束由cleanup统一销毁并复位 failpoint保证每次运行环境干净可复现。八、注意事项速查测试存储默认unistore无需外部依赖、开 race 检测需要真实 TiKV 时请用run-tests-next-gen.sh并确保上述端口未被占用新排序规则-d b是默认双轮模式以collation开头的用例天然覆盖启用/禁用两种配置时区稳定性脚本强制TZAsia/Shanghai修改本机时区不会影响时间类用例结果结果录制-r会覆盖对应r/*.result提交前务必人工确认新输出新增用例t/与r/必须成对维护统计信息相关的用例还需关注s.zip内的s/*.json更多用例结构细节可直接参考 tests/integrationtest/t 目录下既有*.test文件的注释与写法如select.test、explain.test、各模块子目录。结语tests/integrationtest是 TiDB 执行计划与行为回归的最后一道防线它以最小化的SQL 期望输出格式覆盖了 planner、executor、DDL、表达式、统计信息等核心模块既能跑在轻量的 unistore 上做快速回归也能通过run-tests-next-gen.sh在真实 PD/TiKV 集群乃至 TiFlash上进行端到端验证。掌握-r录制、-t定点运行与 IDE 调试三板斧你就能在修改执行计划相关代码后快速定位回归并为新特性低成本地补充黄金文件测试。【免费下载链接】tidbTiDB is built for agentic workloads that grow unpredictably, with ACID guarantees and native support for transactions, analytics, and vector search. No data silos. No noisy neighbors. No infrastructure ceiling.项目地址: https://gitcode.com/GitHub_Trending/ti/tidb创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考 SEO 优化官网定制响应式建站教育培训建站