
数据库关系型数据库后端CLI【免费下载链接】doltDolt – Git for Data项目地址https://gitcode.com/GitHub_Trending/do/dolt点击查看免费下载导读Dolt 是Git for Data——一个把 Git 的版本控制语义完整移植到数据库上的开源项目其命令行doltCLI与 SQL 引擎dolt sql/ SQL Server承载着大量用户可感知的行为。为了守住这些行为边界Dolt 使用BATSBash Automated Testing System构建了一套庞大的集成测试套件历经两年多的发展已超过 1,000 个用例并在每一次 PR 的 Mac、Windows、Linux 三个平台上由 GitHub Actions 自动执行。本文以仓库中的 integration-tests/bats/README.md 为骨架结合真实测试文件与源码实现为你完整梳理这套套件的运行方式、文件组织、常见写法与调试技巧——读完你既能独立跑起全部 BATS 测试也能照着仓库规范为 Dolt 贡献新的回归用例。BATS 在 Dolt 项目中的定位为什么是 BATS从简易集成测试到千级回归防线BATS 是一个面向 Bash 的测试框架它的核心模型极其简单以test标注的 Shell 函数即一个测试用例函数内任意命令的失败都会让该用例失败。这种直接用 Shell 驱动真实进程的方式天然适合测试dolt这类命令行工具——不需要 Mock 任何东西测试里跑的就是用户手里那个真实的二进制。根据 integration-tests/bats/README.md 的说明Dolt 的 BATS 套件定位经历了清晰的演进起步阶段只是一批谦虚的humble集成测试覆盖最基本的命令流程规模化阶段经过两年多开发套件增长到1,000 个以上的测试回归防线阶段每当发现面向用户的dolt命令行或 SQL 实现缺陷团队就会用一个 BATS 测试把它钉死防止再次回归持续集成阶段这些测试在 Dolt 的每个 PR 上于Mac、Windows、Linux三个平台通过 GitHub Actions 自动运行。换句话说BATS 测试在 Dolt 里不只是质量保障工具更是行为契约任何一次重构或功能变更都必须让这 1,000 个用例继续通过否则 PR 无法合入。测试即文档用 grep 学 Dolt 的用法README 还强调了一个很有价值的观点这些测试本身就是文档。如果你想知道某个命令或特性在实战中到底怎么用直接到 integration-tests/bats 目录下用grep搜索对应的.bats文件就能看到该命令的happy path正常路径与错误路径的简洁示例。例如想知道dolt table import的-c/-u/-a/-r四种操作分别怎么用、出错时输出什么错误信息翻一翻 import-tables.bats 就能立刻得到答案。测试文件的命名约定与组织方式按功能命名是主流早期按表结构命名是遗留README 明确指出测试文件的命名约定是随时间演进的一般规则文件以它要测试的功能特性命名例如merge.bats、checkout.bats、sql-server.bats、foreign-keys.bats、garbage_collection.bats早期遗留最早的一批测试是按表 schema 结构命名的比如1pk5col-ints.bats1 个主键、5 列、int 类型和2pk5cols-ints.bats2 个主键、5 列、int 类型。这些文件当初是为了复用 setup/teardown 逻辑而设计的——一个固定的表结构可以支撑一大批空表 / 插入 / 提交 / diff类的基础测试。虽然这套命名方案很快被废弃但遗留文件至今保留。以 1pk5col-ints.bats 为例可以看到这种遗留风格的实际形态它的setup()用 Here Doc 创建一张带显式COMMENT tag:N标记的五列 BIGINT 表随后teardown()统一调用assert_feature_version与teardown_common中间的每个test都在这张固定 schema 的表上验证dolt ls、dolt diff、dolt status、dolt add、dolt reset、dolt commit等命令行为。目录中的辅助资源除了.bats测试文件integration-tests/bats 目录还包含多种辅助资源helper/公共测试辅助脚本核心是 common.bash几乎所有测试文件都通过load $BATS_TEST_DIRNAME/helper/common.bash引入*.expect配合expect工具使用的交互式会话脚本例如sql-shell-*.expect、log.expect、pager.expect用于测试交互式 SQL shell、分页器等需要终端交互的场景各类数据与凭证目录helper/20 余个 CSV 与 SQL 数据文件、certs/TLS 证书、corrupt_dbs/损坏数据库样本、archive-test-repos/、private.pgpGPG 密钥等分别服务于导入、TLS、损坏库恢复、归档、签名提交等测试主题。本地运行 BATS 套件完整环境搭建按 README 的步骤在本地跑起全部 BATS 测试需要五步准备。第 1 步安装 BATS 本体npm install -g batsBATS 通过 npm 全局安装后会提供bats命令作为测试运行器。第 2 步安装 dolt 及其配套工具BATS 测试直接调用真实的dolt二进制因此必须先把它装到 PATH 上。README 给出的方式是用 Go 工具链从源码安装三个组件cd go/cmd/dolt go install . cd - cd go/store/cmd/noms go install . cd - cd go/utils/remotesrv go install . cd -go/cmd/doltdolt 主命令行入口go/store/cmd/nomsNoms 底层存储的命令行工具部分测试会直接操作存储层go/utils/remotesrv远程服务器模拟器供remotesrv.bats、sql-server-remotesrv.bats等远程仓库/复制类测试使用。安装后建议确认dolt version能正常输出且 PATH 中解析到的是这份新装的二进制——common.bash 的setup_no_dolt_init()中就有export PATH~/go/bin:$PATH的逻辑专门确保测试优先使用go install安装的本地 dolt。第 3 步确认 python3 可用测试套件中的 Python 相关用例如doltpy.bats、导入导出、与 pandas/pyarrow 交互的用例依赖python3。README 提到 macOS 开发者工具自带 python3 且已在 PATH 中在 Linux 上请自行确认python3 --version可用。第 4 步安装 Python 依赖pip3 install mysql-connector-python pip3 install pyarrow pip3 install pandasREADME 特别提示了一个踩坑点直接用pip install mysql.connector大部分情况下能用但会引发一些SSL 错误因此必须安装带-python后缀的mysql-connector-python这个特定版本。这三个包分别服务于 MySQL 协议客户端测试、Parquet/Arrow 格式交互测试与 DataFrame 导入导出测试。第 5 步安装 Parquet 及其依赖按需若你的测试范围涉及 Parquet 导入导出如import-tables.bats中的 parquet 用例则需要parquet-cli与hadoop并设置环境变量指向 parquet-cli 的 runtime jar。README 在 macOS 上用 Homebrew 的安装示例brew install parquet-cli brew install hadoop export PARQUET_RUNTIME_JAR/opt/homebrew/opt/parquet-cli/libexec/parquet-cli-1.12.3-runtime.jar在 common.bash 的parquet()辅助函数里可以看到这一约定的源码体现若未设置PARQUET_RUNTIME_JAR会直接报错退出否则通过hadoop jar $PARQUET_RUNTIME_JAR org.apache.parquet.cli.Main $调用 parquet-cli。注意 jar 的实际版本号可能随 Homebrew 安装的 parquet-cli 版本变化请以本地安装结果为准。第 6 步运行测试进入测试目录执行bats .这会运行该目录下全部.bats测试文件。如果只想跑某一类测试直接把目标文件作为参数即可bats import-tables.bats bats sql.bats merge.bats也可以精确到单个用例bats支持--filter按test名称过滤。测试用例的结构解剖从 helper 到 test公共 helpersetup / teardown / 断言几乎所有.bats文件的开头都是相同的三行结构见 import-tables.bats 第 1-11 行#!/usr/bin/env bats load $BATS_TEST_DIRNAME/helper/common.bash setup() { setup_common } teardown() { assert_feature_version teardown_common }其语义为setup()每个test执行前运行。setup_common会进入一个按 PID 隔离的临时目录dolt-repo-$$、执行dolt init初始化仓库并启动必要的远程服务器setup_remote_server详见 common.bashteardown()每个test结束后运行。assert_feature_version检查dolt version --feature输出是否匹配feature version: 7防止测试误用了特性版本不匹配的 dolt 二进制common.bashteardown_common关闭远程服务器并清理临时目录load指令把 helper 中的函数导入当前测试文件。helper 里还默认设置了DOLT_DISABLE_EVENT_FLUSHtrue关闭命令退出时的指标上报子进程避免与 teardown 的目录清理竞争、DOLT_CLI_PASSWORD与DOLT_SILENCE_USER_REQ_FOR_TESTINGY避免鉴权类命令阻塞等待用户输入并预置了 Bats Tests 的用户名/邮箱与禁用 metrics 的全局配置common.bash。标准断言模式status 与 outputBATS 中运行被测命令的标准姿势是run dolt ...随后用$status退出码与$output标准输出错误输出断言。以 import-tables.bats 的第一个用例为例test import-tables: error if no operation is provided { run dolt table import t test.csv [ $status -eq 1 ] [[ $output ~ Must specify exactly one of -c, -u, -a, or -r. ]] || false }这里有两个要点[ $status -eq 1 ]普通 shell 的[ ]测试run会捕获退出码并赋给$status[[ $output ~ ... ]] || falseBash 正则匹配断言。末尾的|| false是 Dolt 套件的惯用技巧——如果正则不匹配[[ ]]返回非零测试立即失败|| false的作用是确保即使在某些set -e语义下也让失败被明确暴露避免被静默吞掉。再看错误参数个数的用例import-tables.batstest import-tables: error message shows actual argument count when too few arguments { run dolt table import -c [ $status -eq 1 ] [[ $output ~ expected 1 argument (for stdin) or 2 arguments (table and file), but received 0 ]] || false }这类用例的价值在于锁定用户可见的错误文案——参数解析逻辑一旦改动导致报错信息变化测试立刻报警。一个完整的命令流程用例1pk5col-ints.bats 中的create a table, dolt add, dolt reset, and dolt commit用例展示了把一个完整的 Git 式工作流add → status → reset → status → add → commit → log串成一条测试链的写法test 1pk5col-ints: create a table, dolt add, dolt reset, and dolt commit { run dolt add test [ $status -eq 0 ] [ $output ] run dolt status [ $status -eq 0 ] [[ $output ~ Changes to be committed ]] || false ... run dolt commit -m test commit [ $status -eq 0 ] [[ $output ~ test commit ]] || false }每步run之后立刻断言$status再对$output用正则检查关键片段例如Changes to be committed、Untracked tables既验证了命令成功也验证了状态分类的呈现文本。Here Doc 模式SQL 脚本与数据文件的注入README 专门用一节强调Dolt 的 BATS 测试大量使用 Here Doc。这是套件最核心的写作范式有两种最常见的用途。用途一把 SQL 脚本管道给 dolt sqldolt sql SQL CREATE TABLE my_table (pk int PRIMARY KEY); SQL这是测试 setup 阶段建表的标准方式。注意 Here Doc 的终止符SQL会作为边界标记其中的 SQL 内容可以是一整段多语句脚本。BATS 测试正是在每次运行前用这种方式重建一张已知 schema 的表从而让每个test都在确定的初始状态下执行——这也是集成测试可复现性的关键。用途二现场生成导入用的数据文件cat DELIM data.csv pk,c1,c2 1,1,1 2,2,2 DELIM dolt table import -c -pkpk my_table data.csv这里先用cat DELIM data.csv在测试临时目录里即时生成 CSV 文件再调用dolt table import -c -pkpk my_table data.csv完成建表导入。这种模式让测试完全自包含不依赖仓库外的静态数据文件数据内容就在测试代码里一眼可读。在真实测试中大量 CSV 数据文件位于 integration-tests/bats/helper 目录20 余个.csv并通过batshelper escaped-characters.csv这类辅助函数定位到绝对路径见 import-tables.bats 的用法。与源码呼应测试锁定的 import 语义BATS 测试断言的行为在源码中能找到一一对应的实现。以dolt table import的-c/-u/-a/-r四个操作为例其底层定义位于 go/libraries/doltcore/mvdata/data_mover.go#L170-L177type TableImportOp string const ( CreateOp TableImportOp overwrite ReplaceOp TableImportOp replace UpdateOp TableImportOp update AppendOp TableImportOp append )而 import-tables.bats 中的两个用例分别验证了一个操作都不给与给了多个操作-c -u -r都会报出Must specify exactly one of -c, -u, -a, or -r.这一用户可见错误。也就是说测试把参数校验的边界行为恰好一个操作固化成了契约源码负责实现这个契约二者互为印证。这类先找 BATS 测试再对照源码的阅读方式正是 README 所说的测试即文档的实践路径。Skipped BATS用 skip 记录已知缺陷与 TODO基本形态套件中有相当一部分测试是被跳过的用途是作为 TODO 或已知 bug 的文档。README 给出的模板test ... { ... skip this test is currently failing because... }关键语义skip之前的所有代码照常执行只有执行到skip语句时才跳过剩余部分。因此一个 skipped 测试仍然能发挥部分测试价值——它至少验证了前置条件都能跑通。仓库里的真实示例在 integration-tests/bats 目录里可以 grep 到大量skip用例大致分为几类环境相关需特定云环境才运行archive-aws.bats 中的skip skipping aws tests; set DOLT_BATS_AWS_TABLE and DOLT_BATS_AWS_BUCKET to run——默认跳过设置对应环境变量后可启用已知缺陷/BUG 文档blame-system-view.bats 的skip BUG: Altering primary key drops all data from dolt_diff_tableblame.bats 的skip SQL views return incorrect data when using AS OF with commits that modify existing dataTODO 未实现backup.bats 的skip todo implement backup lock file测试环境不适用auto_increment_lock_modes.bats 的skip This test tests remote connections directly, SQL_ENGINE is not needed.。为 Dolt 贡献回归测试的正确姿势README 给出了对贡献者的明确邀请如果你在 dolt 中发现了一个 bug除了提 GitHub issue 之外最好附带一个 skipped BATS 测试的 PR。做法是先用最小步骤复现 bug把复现步骤写成test并在末尾用skip ...注明失败原因提交该 PR——测试会进入套件、被持续跟踪直到 bug 修复后移除skip使测试转绿。这样一来bug 的症状就永久固化为回归用例修复者也能立刻知道这个缺陷曾经长什么样、现在是否真的被修好了。常见问题与调试技巧输出为什么看不到—— 用run捕获而不是直接执行在 BATS 里直接执行dolt ls的输出会直接打到终端BATS 仅在失败时展示而run dolt ls会把输出捕获进$output变量供断言使用。凡是需要断言输出内容的命令一律用run。正则匹配记得转义与加|| false[[ $output ~ pattern ]] || false是套件主流写法。当 pattern 里含空格、反引号、引号等特殊字符时务必转义例如 import-tables.bats 中匹配被反引号包裹的字段名--Key1int就大量使用了转义。临时目录是每次测试隔离的setup_no_dolt_init会创建带 PID 的目录$BATS_TMPDIR/dolt-repo-$$默认$HOME/batstmp/测试结束时被teardown_common删除common.bash。因此不要在不同test之间假设状态延续每个用例都必须自给自足地 setup。单测/单文件/全量三种粒度全量bats .单文件bats sql.bats单个用例bats --filter 1pk5col-ints: empty table 1pk5col-ints.bats--filter按用例名做正则匹配。本机并行与 CI 的一致性套件设计上支持同一机器并行跑多个测试进程临时目录按 PID 隔离GitHub Actions 则在三平台全量执行。本地复现 CI 失败时先确认dolt version --feature输出的是feature version: 7assert_feature_version会兜底检查再确认环境变量PARQUET_RUNTIME_JARParquet 相关、AWS 凭证archive-aws 相关等是否就绪。结语Dolt 的 BATS 套件是一个用最朴素的 Shell 技术守住最复杂数据库行为的范例1,000 个测试、三平台 CI、每 PR 必跑让每一次重构都有据可依同时它又扮演着活文档的角色——想知道dolt某个命令在 happy path 与错误路径下到底输出什么grep 一个.bats文件比翻手册更快更准。如果你正在为 Dolt 排查 bug 或扩展功能不妨从阅读 integration-tests/bats 目录下手再按本文的步骤本地跑起套件如果你发现了新缺陷请按 README 的约定把复现脚本包装成一个带skip注释的 BATS 测试随 issue 一起提交——这正是这套测试体系持续进化的方式。赞分享数据库关系型数据库后端CLI【免费下载链接】doltDolt – Git for Data项目地址https://gitcode.com/GitHub_Trending/do/dolt点击查看免费下载相关推荐Dolt 的 batsee 使用指南并行执行 BATS 集成测试的加速利器Dolt 的 batsee 使用指南并行执行 BATS 集成测试的加速利器 本文介绍 Dolt 仓库中位于 go/utils/batsee https://l数据库关系型数据库后端CLIDolt完整指南Git for Data的革命性SQL数据库Dolt完整指南Git for Data的革命性SQL数据库 Dolt是第一个也是唯一一个支持Git式版本控制的SQL数据库它让数据管理变得像代码管理一样简数据库关系型数据库后端CLITerraform Equivalence Testing 指南用 E2E 快照对比守护命令输出行为Terraform Equivalence Testing 指南用 E2E 快照对比守护命令输出行为 导读 Equivalence testing等价性测试IaCCLI基础设施云原生DevOps上一篇Android开发中的RxTool语言学习构建互动语言学习应用下一篇Lightweight Charts源码文档自动化TypeDoc与API生成终极指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考