ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Dolt SQL Server 多实例集成测试实战:YAML 驱动测试定义与 Delve 远程调试完整指南

Dolt SQL Server 多实例集成测试实战:YAML 驱动测试定义与 Delve 远程调试完整指南 数据库关系型数据库后端CLI【免费下载链接】doltDolt – Git for Data项目地址https://gitcode.com/GitHub_Trending/do/dolt点击查看免费下载本指南讲解 Dolt 仓库中 integration-tests/go-sql-server-driver/tests 这套多 sql-server 实例集成测试的机制与调试方法。这套测试用 YAML 描述启动多个 Dolt SQL 服务器、模拟复制/集群场景、通过 SQL 连接执行断言的完整流程是验证dolt sql-server复制、集群、持久化全局变量等能力的主要手段。读完本文你将掌握测试定义的 YAML 骨架、动态端口与断言机制并能借助 Delvedlv在 IDE 中对被测试的服务器进程进行断点调试。这套测试解决什么问题Dolt 的sql-server支持复制replication、主备集群cluster等需要同时运行多个服务器进程才能验证的能力。单进程单元测试无法覆盖这类场景因此 Dolt 在 integration-tests/go-sql-server-driver 中提供了一套由 YAML 定义、自定义测试运行器执行、本质仍是 Go 单元测试的集成测试体系见 tests/README.md。它的工作方式可以概括为一个 YAML 文件描述若干仓库repo、若干服务器server以及一系列 SQL 连接与断言connection/query测试运行器把这些定义展开为真实的进程与数据库连接逐条执行并校验结果。这套测试的难点在于它会启动多个相互独立的进程一旦断言失败很难直接判断问题出在哪个进程内部。因此项目专门提供了基于 dlv 的调试支持让服务器进程在启动前挂起等待远程调试器接入从而让开发者像调试普通程序一样调试被测试的服务器。这正是本文的核心内容。测试定义读懂 YAML 骨架YAML 文件是整个测试的剧本。在 testdef.go 中测试文件被解析为TestDef与Test两个核心结构type TestDef struct { Tests []Test yaml:tests Parallel bool yaml:parallel // 为 true 时各子测试并行执行 } type Test struct { Name string yaml:name Repos []driver.TestRepo yaml:repos // 单仓库 单服务器 MultiRepos []driver.MultiRepo yaml:multi_repos // 多仓库 单服务器如集群场景 Conns []driver.Connection yaml:connections // SQL 连接与断言序列 Skip string yaml:skip // 跳过整个测试的原因 }各字段含义repos定义若干仓库每个仓库下可以挂一个server服务器定义与若干with_files要写入仓库目录的配置文件、with_remotes要添加的远程仓库multi_repos把多个仓库放进同一个仓库存储下再启动一个服务器服务这些仓库典型用于主备集群standby/primary测试例如 sql-server-cluster.yaml 中multi_repos下的server1同时包含repo1、repo2两个仓库connections按顺序连接某个服务器on字段指定服务器名执行query/exec并做断言还可以通过restart_server让服务器重启后继续下一组断言用于验证配置/状态是否持久化。解析时使用了yaml.Decoder并开启KnownFields(true)见 testdef.go也就是说YAML 里出现未知字段会直接报错能有效防止测试定义拼写错误被静默忽略。服务器Server定义字段服务器是测试真正拉起的dolt sql-server进程其定义在 server.go字段YAML 键说明Namename服务器名必须与TestRepo/MultiRepo顶层name一致Argsargs传给dolt sql-server的命令行参数Envsenvs附加环境变量PortportSQL 监听端口默认 3306需要args与之保持一致DynamicPortdynamic_port配合{{get_port ...}}模板使用的动态端口名DebugPortdebug_port非零时该服务器会由 dlv 托管等待调试器连接LogMatcheslog_matches服务器正常退出后其日志必须匹配的正则LogNotMatcheslog_not_matches服务器日志中禁止出现的正则ErrorMatcheserror_matches定义后服务器必须以非零码退出且输出匹配这些正则注意Port ! 0且DynamicPort ! 同时出现是错误运行器强制要求使用{{get_port ...}}dynamic_port的方式分配端口见 testdef.go。动态端口模板{{get_port ...}}由于测试可并行运行端口不能写死。运行器提供 Go 模板函数{{get_port name}}与{{get_tempdir name}}见 testdef.go可以在以下位置使用with_files的文件内容服务器args与restart_server的argsquery/exec的 SQL 文本与断言结果字符串。同一个名字在一条测试内多次使用会得到同一个端口测试结束后端口归还全局端口池。全局端口池在 main_test.go 中初始化共 256 个端口从 3306 开始顺延并发测试较多时可能耗尽端口。实例如下摘自 sql-server-cluster.yamlserver: args: [--config, standby_server.yaml] dynamic_port: server1而配置文件内的监听端口通过模板动态填充with_files: - name: standby_server.yaml contents: | listener: host: 0.0.0.0 port: {{get_port server1}} cluster: bootstrap_role: standby bootstrap_epoch: 10连接与断言Query / Execconnections中的每条Connection指向一个已启动的服务器on字段依次执行 Query/Execquery或exec二选一执行 SQLquery用QueryContext读取结果行exec用ExecContext执行写操作resultquery的断言columns必须精确匹配列名rows逐行按字符串比较还支持or语法允许多种结果中的一种error_match期望该 SQL 报错且错误信息匹配正则retry_attempts轮询型断言如查询复制状态等待收敛可设置重试次数每次失败间延迟 50msRetrySleepDuration见 cmd.gorestart_server执行完本组断言后重启服务器可带新args/envs再继续下一组connections。例如 sql-server-config.yaml 先SET PERSIST.max_connections 1000重启后再次查询验证GLOBAL.max_connections仍为 1000。每条查询都在独立的 context 超时下执行超时值默认 20 秒testdef.go并受下文的调试环境变量影响。进程的启动与收尾MakeServertestdef.go负责真正拉起服务器为进程注入DOLT_CONTEXT_VALIDATION_ENABLEDtrue与DOLT_ENABLE_DYNAMIC_ASSERTStrue等环境变量将服务器日志实时转发到t.Log服务器停止时对日志执行log_matches/log_not_matches正则断言。此外每个测试的DoltUser都会创建独立临时目录作为DOLT_ROOT_PATH并预设全局配置user.name、user.email、metrics.disabledtrue见 cmd.go保证测试之间互不污染。调试前置准备环境与超时调试的第一步是告诉测试运行器别超时。设置环境变量DOLT_SQL_SERVER_TEST_DEBUG后运行器会把所有查询/进程的超时从默认的 20 秒提升到 1000 小时testdef.go留出充足的断点停留时间。注意不调试时不要设置该变量。否则测试失败时会因超时被无限拉长而挂起而不是快速失败见 tests/README.md。同时需要两个可执行文件位于$PATHdolt测试运行的服务器二进制。测试启动的dolt sql-server进程来自$PATH也可用DOLT_BIN_PATH指定见 cmd.go因此修改源码后必须重新构建并让新二进制生效否则测试跑的仍是旧逻辑dlv调试支持依赖它。DoltDebug在找不到dlv时会直接 paniccmd.go。Windows 同样受支持把dolt.exe与dlv.exe放入%PATH%即可。第一步用 TestSingle 锁定目标测试整套测试文件包含几十个用例调试前先通过TestSingle只运行你关心的那一个。在任意测试文件中加入tests/README.md 给出的模板func TestSingle(t *testing.T) { // t.Skip() RunSingleTest(t, tests/sql-server-cluster.yaml, primary comes up and replicates to standby) }RunSingleTesttestdef.go会解析指定 YAML仅执行名字精确匹配的那条用例。注意路径相对于包根目录integration-tests/go-sql-server-driver下的main包。第二步在 YAML 中开启 debug_port编辑测试定义为每个想要调试的服务器添加debug_port端口互不相同- name: primary comes up and replicates to standby multi_repos: - name: server1 ... server: args: [--port, 3309] port: 3309 debug_port: 4009当debug_port非零时MakeServer不再走普通启动路径而是调用driver.DebugSqlServertestdef.go底层通过DoltDebug以 dlv 托管进程dlv --listen:4009 --headless --api-version2 --accept-multiclient exec dolt -- sql-server ...参数细节见 cmd.go。--headless让 dlv 以无界面方式监听--accept-multiclient允许多个调试客户端接入——这正是 IDE 远程调试配置所连接的端点。第三步配置 IDE 的 N1 个运行配置整个调试需要N1 个运行/调试配置N 个远程调试配置对应测试中的 N 个服务器各连接一个debug_port如上面示例的 4009。创建Remote Go RemoteGo Remote 类型运行配置host 为localhost、port 填对应的debug_port即可 attach 到 dlv 端点。不同 IDE 的入口不同可参考所用 IDE 官方文档中attach to running Go processes的远程调试配置说明。1 个主测试配置运行TestSingleGo 单元测试运行配置完整包路径形如github.com/dolthub/dolt/integration-tests/go-sql-server-driver#TestSingle。如果你没有在系统环境中设置DOLT_SQL_SERVER_TEST_DEBUG就在这里把它加到该运行配置的环境变量里tests/README.md 明确建议如此。推荐在每个服务器上都开启debug_port并各自使用不同的调试端口这样任意服务器的内部状态都可以随时切入检查。第四步先跑主测试再逐个 attach执行顺序很关键Run 或 Debug 主测试两种方式皆可。测试运行器会先拉起仓库、创建配置然后启动各服务器。由于服务器由 dlv 托管进程在真正执行sql-server主逻辑前会挂起等待调试器接入观察测试控制台输出。当出现如下日志时说明该服务器已就绪、正等待远程调试器API server listening at: [::]:4009逐个Debug 你配置好的远程调试配置。调试器连上后服务器进程恢复执行断点、变量查看、单步、调用栈等能力都与普通调试一致。服务器重启时的注意事项这套测试中不少用例会通过restart_server重启服务器例如验证持久化全局变量、切换集群角色。每次重启都会再次以 dlv 托管、再次等待调试器接入——因为RecreateCmd在DebugPort 0时会保留调试参数重建命令cmd.go。因此重启发生后你需要重新触发对应的远程调试配置进程才会继续执行。这是调试过程中最容易困惑的地方遇到进程卡住不动时先检查是否漏掉了这一步。常见坑位清单改了代码不生效测试跑的是$PATH中的dolt二进制。本地改动后务必重新构建并更新该二进制或用DOLT_BIN_PATH指向新构建产物再重跑测试缺少 dlv没有dlv时启用debug_port会直接 panic先go install或安装 dlv 并加入$PATH误设调试超时DOLT_SQL_SERVER_TEST_DEBUG只在调试时设置CI 或日常跑测试时保留默认 20 秒超时让失败快速暴露端口冲突并发测试较多时 256 个动态端口可能耗尽见 main_test.go出现cannot get a port; we are all out.时减少并行或用-run只跑单个用例多进程日志混淆每个服务器进程的日志会以[server名]前缀输出到测试日志中cmd.go先确认日志归属再下结论重启需重连调试器见上一节务必在每次restart_server后重新 attach。延伸阅读完整调试指南原始出处tests/README.md测试运行器与断言实现testdef.goSQL Server 测试入口与端口池初始化main_test.go服务器/查询/断言的 YAML 结构定义server.godlv 启动参数与DoltUser环境隔离实现cmd.go可运行的完整示例sql-server-cluster.yaml集群主备切换、sql-server-config.yaml持久化全局变量、sql-server-tls.yamlTLS等均在 tests 目录 下。掌握了这套 YAML 定义与调试流程你不仅能读懂 Dolt 的复制/集群集成测试也能在修改sql-server行为后快速定位问题、用断点验证自己的修复是否生效。赞分享数据库关系型数据库后端CLI【免费下载链接】doltDolt – Git for Data项目地址https://gitcode.com/GitHub_Trending/do/dolt点击查看免费下载相关推荐ManyMC终极指南如何在M1 Mac上获得最佳Minecraft游戏体验 ManyMC终极指南如何在M1 Mac上获得最佳Minecraft游戏体验 如果你是一位M1 Mac用户正在寻找一款完全原生支持苹果芯片的Minecr桌面应用游戏开发Consul 集成测试远程调试指南基于 Delve 与 Docker 容器断点调试Consul 集成测试远程调试指南基于 Delve 与 Docker 容器断点调试 本指南讲解如何在 HashiCorp Consul 仓库的容器化集成测试服务网格服务注册发现API网关健康检查微服务探索tldr.jsx架构从组件设计到状态管理的完整实现探索tldr.jsx架构从组件设计到状态管理的完整实现 tldr.jsx是一个基于React的响应式Web客户端专为tldr pages打造旨在提供简洁高上一篇D3Blocks与Plotly、Matplotlib对比哪个更适合你的项目下一篇pi-subagents 工具桥接如何高效集成外部工具与服务的完整指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表