资讯动态

Dolt 跨版本兼容性测试体系:向前、向后与双向兼容的 BATS 验证方案

发布时间:2026/10/1 9:48:26 来源:尧图企业网站定制
数据库关系型数据库后端CLI【免费下载链接】doltDolt – Git for Data项目地址https://gitcode.com/GitHub_Trending/do/dolt点击查看免费下载Dolt 是一款Git for Data数据库其仓库格式、schema 编码与存储布局会随版本演进持续变化因此版本间能否安全读写彼此的数据直接决定了用户升级与多版本混部例如滚动升级、跨版本协作的可行性。本文以仓库中的 Compatibility Tests 文档 为主体结合 runner.sh、setup_repo.sh 及整套 BATS 测试用例完整讲解 Dolt 是如何通过向后兼容、向前兼容与双向兼容三组测试系统性守护跨版本数据可读性的。读完本文你将掌握这套测试的目录结构、运行流程、关键环境变量以及每个测试文件所验证的具体兼容性维度。一、兼容性测试的整体目标三层验证矩阵根据 README 的说明这套测试试图保证 Dolt 各版本之间的前向与后向兼容性整体上分为三个层次向后兼容Backward Compatibility仓库由旧版本 Dolt 创建并写入数据由当前 HEAD 构建的 Dolt 客户端读取、修改。这保证升级到新版本后旧数据仍然可读、可写。向前兼容Forward Compatibility仓库由 HEAD 构建的 Dolt 创建并写入数据由旧版本 Dolt 客户端读取。这保证旧客户端在数据被新版本写入后仍能正常使用。双向兼容Bidirectional Compatibility旧版本与当前版本在同一个仓库上交替执行读写操作验证两个版本可以在同一份数据库上协作而不互相破坏。由于向前兼容在任何时候都是限制性更强的一方同时满足向前兼容的版本更少双向测试只针对向前兼容版本列表进行。这一设计的核心判断是向前兼容是更严苛的约束。当一个新版本引入新的存储字段如自适应编码、降序索引后旧客户端如果无法解析这些字段就会拒绝读写此时向前兼容就被打破双向协作自然也无法成立。二、测试套件的目录结构与文件角色整套测试位于 integration-tests/compatibility 目录下职责划分非常清晰integration-tests/compatibility/ ├── README.md # 测试设计说明本文主体 ├── runner.sh # 总调度脚本下载旧版本、建仓、跑 BATS └── test_files/ ├── setup_repo.sh # 用指定版本 dolt 构建标准测试仓库 ├── setup_repo_2_0_breaking.sh # 用 HEAD 自适应编码构建 2.0 破坏性测试仓库 ├── setup_repo_desc_index.sh # 用 HEAD 构建含降序索引的测试仓库 ├── big_table.sql # 向 big 表写入 1000 行数据的 SQL ├── backward_compatible_versions.txt # 向后兼容测试的版本清单 ├── forward_compatible_versions.txt # 向前兼容测试的版本清单 ├── 2_0_breaking_versions.txt # 2.0 破坏性变更测试的版本清单 ├── 2_0_forward_compatible_versions.txt # 降序索引 双向测试的版本清单 └── bats/ ├── compatibility.bats # 主兼容性用例版本/状态/schema/diff/merge ├── types_compatibility.bats # 全类型读写与加列用例 ├── geom_types_compatibility.bats # 空间类型兼容用例 ├── 2_0_breaking/ # 自适应编码破坏性用例 ├── desc_index_breaking/ # 降序索引破坏性用例 ├── bidirectional/ # 双向兼容用例含 SQL server 跨版本 ├── bidirectional_remote/ # 经 file remote 的双向协作用例 └── helper/ # compat-common.bash / compat-server.bash其中三个版本清单文件是测试矩阵的输入数据backward_compatible_versions.txt 当前列出的版本为v2.0.0, v1.86.6, v1.86.5, v1.80.0, v1.75.0, v1.59.3, v1.44.2, v1.20.0, v1.7.0, v1.2.0, v1.0.0覆盖从 v1.0.0 到 v2.0.0 的长跨度。forward_compatible_versions.txt 当前列为v1.80.0, v1.75.0, v1.59.0。2_0_breaking_versions.txt 当前列为v1.87.0, v1.84.02_0_forward_compatible_versions.txt 当前列为v2.0.0。清单文件中的空行与#注释行会被 runner.sh 中的grep -v ^ *#过滤掉因此可以随时注释掉某个版本以临时排除它。三、向后兼容测试旧版本建库HEAD 客户端读写3.1 下载并识别旧版本二进制runner.sh 首先通过get_platform_tuple探测运行平台仅支持 Linux 与 macOS并根据uname -m将架构映射为amd64、arm64或386见 runner.sh。随后download_release会为指定版本创建binaries/ver目录下载名为dolt-platform.tar.gz的发布压缩包并解压见 runner.sh。3.2 用旧版本构建标准测试仓库核心步骤是setup_repo将 PATH 临时指向旧版本二进制目录然后执行 setup_repo.sh 在repos/ver下创建仓库见 runner.sh。该脚本是这个测试体系数据样板的关键它会dolt init初始化仓库并自动探测默认分支名main或master把结果写入default_branch.var供后续使用创建多个分支no-data、init、other、check_merge分别模拟不同数据状态的仓库建立覆盖几乎所有 MySQL 类型的数据表abcBIGINT 主键 LONGTEXT/DOUBLE/BIGINT 列作为 DML 与 DDL 演练对象big通过 big_table.sql 灌入 1000 行用于验证大表读写与 diffdef含CHECK (i 0)约束用于验证约束检查与合并all_typesTINYINT/SMALLINT/MEDIUMINT/INT/BIGINT/BIGINT UNSIGNED/FLOAT/DOUBLE/DECIMAL/CHAR/VARCHAR/TINYTEXT/TEXT/MEDIUMTEXT/LONGTEXT/VARBINARY/TINYBLOB/BLOB/MEDIUMBLOB/LONGBLOB/DATE/TIME/DATETIME/TIMESTAMP/YEAR/JSON/ENUM/SET 共 28 种列正负值、超大值如9223372036854775807、18446744073709551615、500 字节重复字符串全覆盖geom_typesPOINT/LINESTRING/POLYGON/GEOMETRY/MULTIPOINT/MULTILINESTRING/MULTIPOLYGON/GEOMETRYCOLLECTION通过ST_GeomFromText写入视图view1、all_types_view、geom_view验证视图在版本间的序列化兼容在不同分支上执行差异化 DDL/DMLother分支对abc执行DROP COLUMN x; ADD COLUMN z默认分支执行DROP COLUMN w; ADD COLUMN y从而为后续dolt diff other测试构造真实的 schema 分叉最后导出abc.csv与abc_schema.json用于dolt table import测试并输出dolt status、dolt branch、dolt schema show、查询结果与dolt_schemas快照作为日志参考。可见这套标准仓库刻意覆盖了类型系统、视图、约束、分支分叉与导出导入等最易受格式演进影响的环节是向后兼容测试的压力样品。3.3 以 HEAD 客户端跑 BATS 用例仓库构建完成后runner 用当前 HEAD 的 dolt 作为客户端针对该仓库执行整批 BATS 测试见 runner.sh。测试通过环境变量传递上下文DOLT_OLD_BIN旧版本 dolt 二进制路径DOLT_NEW_BINHEAD 构建的 dolt 路径在 PATH 被修改前用which dolt捕获REPO_DIR被测仓库目录每个用例的setup()会先cp -Rpf $REPO_DIR bats_repo复制一份隔离副本DOLT_VERSION当前被测的旧版本号供用例做版本判断DEFAULT_BRANCH仓库的默认分支名。compatibility.bats 是这批用例的主体覆盖dolt version/status/ls/branch/diff基础命令在init、默认分支、other分支上执行dolt schema show abc并逐一断言列定义如pk bigint not null、a longtext、w bigint/y bigint等对三个分支执行select * from abc并断言结果集表格布局dolt diff other断言 schema 与数据两部分的精确 diff 输出对big表执行 count、delete、insert 与 commitdolt merge other断言预期冲突Merge conflict in abc/Automatic merge faileddolt table import -c -pkpk abc2 abc.csv验证旧版本导出的 CSV 可被新客户端导入dolt merge check_merge验证带 CHECK 约束的合并以及构造唯一索引冲突后查询dolt_constraint_violations_cv_test系统表并清理的约束违规用例。同批执行的 types_compatibility.bats 与 geom_types_compatibility.bats 则分别验证旧版本写入的每种类型都能被 HEAD 正确读取整数边界值、负数、500 字节大 TEXT/BLOB、ST_X/ST_AsText等空间函数对旧表执行 INSERT/UPDATE/DELETE 与ALTER TABLE ADD COLUMN逐类型新增列后再读写以及旧版本创建的视图能被正确反序列化并查询。这些用例还大量使用assert_no_panic_shape辅助函数见 compat-common.bash专门拦截输出中泄漏的invalid hash length、panic recovered、runtime error等panic 形状确保兼容性问题以干净的报错而非崩溃暴露。四、向前兼容测试HEAD 建库旧版本客户端读写向前兼容测试的思路与向后相反先用 HEAD 构建仓库runner 的_main会先setup_repo HEAD再让清单中的旧版本客户端去读写它。由于旧版本可能无法理解 HEAD 仓库存储中的某些引用形态runner 在 test_forward_compatibility 中做了一个关键预处理在repos/HEAD/file-remote创建file remotedolt remote add file-remote file://file-remote并把$DEFAULT_BRANCH、init、no-data、other、check_merge等分支全部 push 上去。注释说明这样做是为了裁剪掉存储中某些旧版本不兼容的引用refs旧版本 dolt 从该 remoteclone出repos/ver仓库并用旧版本依次创建各本地分支dolt branch no-data origin/no-data等把 HEAD 仓库导出的*.csv、*.json拷贝进旧版本仓库保证导入类用例可用最后以旧版本为客户端DOLT_OLD_BIN跑同一批 BATS 用例验证旧客户端能够读取、diff、merge HEAD 写入的数据。整个 clone/setup 过程刻意使用被测版本的二进制执行PATH$relpath dolt clone ...并打印dolt version确认。该流程说明向前兼容的验证不仅限于读取还包括旧客户端能否独立完成 clone、建分支、导入导出等完整操作链。五、双向兼容测试新老版本交替读写同一仓库双向兼容是这套体系中最贴近真实混部场景的部分。它不做setup_repo.sh的共享初始化而是由测试自己建仓、自己组织数据。runner 对同一版本会跑两次方向互换第一次DOLT_OLD_BIN为旧版本、DOLT_NEW_BIN为 HEAD第二次交换两者从而把谁先写、谁后写的两个方向都覆盖到见 runner.sh。5.1 同仓交替写入bidirectionalbidirectional_compat.bats 以多轮交替模式展开每轮由一个版本写入、另一个版本验证通常进行 4~6 轮覆盖标量类型 DML 往返INT/VARCHAR/DECIMAL/DATETIME 的 insert/update/delete 跨版本可见大 TEXT/BLOB 往返用REPEAT生成 1000~5000 字节值验证 out-of-band带外存储大值由一方写入后另一方能用LENGTH()完整读回测试注释明确给出了自适应编码的阈值语义——TINYTEXT/TEXT恒为 inlineMEDIUMTEXT/LONGTEXT超过 64KB 阈值时转入 out-of-band空间类型往返POINT/LINESTRING/POLYGON/GEOMETRY 经ST_GeomFromText写入、ST_X/ST_AsText读回双方交替 ADD COLUMNHEAD 加 TEXT/DATE 列、旧版本加 INT/DECIMAL 列、HEAD 再加 POINT 列最终旧版本用包含全部新列含空间列的行插入HEAD 读回跨版本分支与合并HEAD 建特性分支提交旧版本建自己的分支并执行 mergeHEAD 再做 DDL 变更合并旧版本读取新列并写入综合类型覆盖TINYINT/BIGINT/FLOAT/DOUBLE、VARCHAR/CHAR/VARBINARY、DATE/DATETIME/DECIMAL、ENUM/SET 逐轮由两个版本交替加列TEXT/BLOB 家族TINYTEXT~LONGTEXT 与 TINYBLOB~LONGBLOB 的 inline↔out-of-band 双向升降级例如把 70000 字节值写进原本小的列或把大值改回小值验证编码形态变化也能被对端正确解析JSON含 inline 与 out-of-band 两列组合用JSON_EXTRACT/JSON_UNQUOTE校验当前该用例被skip注释说明新 JSON 编码与旧版本不兼容。每个测试都调用clear_branch_control删除.doltcfg/branch_control.db因为分支控制序列化存在一次前向不兼容变更现代客户端写入后旧客户端读取会 panic删除该文件可避免此噪声掩盖其他真实问题见 bidirectional_compat.bats。5.2 SQL server 与 CLI 客户端跨版本server_cli_compatserver_cli_compat.bats 将兼容性验证从文件仓库扩展到网络协议层面旧版本dolt sql-server作为服务端HEAD 的 CLI 作为客户端通过--host/--port/--user/--password --use-db全局连接参数连接。其中 compat-server.bash 提供了服务生命周期管理start_old_sql_server用随机端口启动旧版 serverwait_for_old_server轮询直至可连接new_dolt_cli封装客户端连接参数latest_commit只用旧 server 也支持的dolt_log列做查询。用例覆盖SELECT 1连通性、通过dolt_log读取提交历史、客户端发起add/commit/revert、--author覆盖后在旧 server 侧查询dolt_log验证 committer、以及cherry-pick跨版本应用提交。测试还通过skip_if_old_lte/skip_if_new_lte见 compat-common.bash按版本号门槛跳过某些旧版本不具备的能力例如1.20.0前客户端不支持全局连接参数、1.86.6前dolt_logschema 未固定避免对能力缺失误判为兼容性破坏。5.3 经共享 file remote 的双向协作bidirectional_remotebidirectional_remote_compat.bats 模拟了更贴近生产的多机协作两个版本通过共享的file://remote 同步。其核心run_workflow流程为版本 A旧建仓、建表、写基础行并 push 到 remote然后不提交地ALTER TABLE tbl ADD COLUMN c_col type版本 B新从 remote clone以同名同类型ADD COLUMN c_col写入与 A 不相交的行并提交版本 A 用自己的c_col写入不相交行、提交并 push版本 Bdolt pull断言合并成功最终表同时包含两边的全部 6 行且c_col值正确。该用例针对 INT、BIGINT、BIGINT UNSIGNED、FLOAT、DECIMAL、VARCHAR、TEXT、VARBINARY、BLOB、DATETIME、TIMESTAMP、ENUM、SET、POINT、LINESTRING、GEOMETRYCOLLECTION 等类型逐一验证JSON 因编码变更被 skip。它的特殊意义在于两个版本独立地对同一表做了相同 schema 变更再经 pull 合并必须不冲突、不丢数据——这直接检验了 schema 与行存储格式在分叉演进后合并路径上的兼容性。六、显式验证破坏性变更自适应编码与降序索引并非所有变更都能做到向前兼容。对于已知的破坏性变更测试套件专门设计了必须报错、且报错要友好的断言模式。6.1 2.0 自适应编码adaptive encodingsetup_repo_2_0_breaking.sh 用 HEAD并启用自适应编码构建包含 TEXT/BLOB 各类变体及混合类型表的仓库随后 2_0_breaking.bats 断言旧客户端v1.87.0、v1.84.0对含 TEXT/BLOB 的表执行SELECT、dolt diff、dolt schema show时必须失败且输出table has unknown fields而对不含 TEXT/BLOB 的no_text_blob表仍可正常读取。runner 中对应注释说明了策略目前我们只测试它以恰当的报错信息失败见 runner.sh——即破坏性变更被接受但必须显式、可诊断地失败。6.2 降序索引descending indexsetup_repo_desc_index.sh 用 HEAD 构建一张含INDEX c_int_desc (c_int DESC, c_varchar)的表与一张默认升序索引的表。 desc_index_breaking.bats 断言旧客户端对降序索引表SELECT、schema show、dolt diff报table has unknown fields对默认升序索引表仍正常读写HEAD 客户端两张表都能读ORDER BY c_int DESC正确返回并且 HEAD 修改默认索引表列类型后旧客户端仍可读该表。其原理在用例注释中写明降序列被写为索引 schema 消息的新字段旧客户端遇到未知字段即拒绝没有降序列的索引不写这些字段因此不触发。这两组负向用例与前面的正向用例共同构成完整矩阵兼容性测试不仅要证明能读还要证明不能读时给出明确错误。七、运行编排与辅助设施7.1 runner 的主流程runner.sh 的_main依次执行探测平台、导出BATS_LIB_PATH依次指向本套件的test_files/bats/helper与主 BATS 套件的helper使嵌套用例可bats_load_library与DOLT_DEV_BUILD_PATH指向新构建的 dolt避免版本号字面匹配把 dev build 误跳过创建repos/binaries目录注册 EXIT 清理钩子对backward_compatible_versions.txt每个版本跑向后兼容setup_repo HEAD构建当前版本仓库对2_0_breaking_versions.txt跑自适应编码破坏性用例对2_0_forward_compatible_versions.txt跑降序索引用例对同一清单跑双向兼容同仓与双向 remote 兼容最后以 HEAD 对 HEAD 仓库跑一遍 BATS 作为自检基线sanity check确保测试体系本身在无跨版本场景下也是绿的。7.2 关键环境变量速查环境变量用途DOLT_OLD_BIN旧版本 dolt 路径未设置时回退到 PATH 上的doltDOLT_NEW_BIN新版本HEADdolt 路径未设置时回退到doltDOLT_LEGACY_BINremote 双向用例中版本 A的二进制REPO_DIR被测仓库目录用例 setup 阶段复制为bats_repoDOLT_VERSION当前被测旧版本号供用例按版本跳过DEFAULT_BRANCH仓库默认分支名main/masterBATS_LIB_PATH帮助库加载路径DOLT_DEV_BUILD_PATH新构建 dolt 的路径豁免版本号字面比较这些变量在 compat-common.bash 中被old_dolt/new_dolt两个函数封装使用测试文件只调用old_dolt/new_dolt从而对哪个版本在跑保持透明。7.3 本地运行方式运行前提本机需具备 BATS 环境、可执行doltHEAD 构建且能访问外网以下载历史版本二进制支持 Linux 与 macOS见get_platform_tuple的限定。在integration-tests/compatibility目录下执行bash runner.shrunner 会自动下载版本清单中的旧版本发布包、构建标准仓库并逐批执行 BATS带--print-output-on-failure失败时输出完整现场。需要临时缩小范围时可在对应的*_versions.txt中注释掉某些版本行#开头的行会被忽略。八、从测试体系看 Dolt 的兼容性工程实践从这套测试可以提炼出几条可迁移的工程经验用数据样板覆盖格式敏感面setup_repo.sh刻意灌入全部 MySQL 类型、空间类型、视图、约束、大值与分支分叉把易受编码演进影响的点全部固化为回归样本正反用例结合既能读向后/向前/双向与必须报错2.0 breaking/desc index并行验证让破坏性变更有明确的、可断言的失败契约把方向作为测试参数双向测试对同一版本正反各跑一遍且 remote 场景将独立加列后合并作为一等公民覆盖了真实混部中最危险的路径版本能力与兼容性解耦skip_if_old_lte/skip_if_new_lte按版本号门槛区分旧版本没这个能力与跨版本不兼容避免误报panic 形状拦截assert_no_panic_shape保证兼容性问题表现为干净的报错而不是崩溃或内存误读——这对数据型数据库尤为重要。无论你是 Dolt 的使用者评估升级风险、贡献者判断改动是否破坏格式还是其他数据系统的工程师设计自己的跨版本兼容测试这套位于 integration-tests/compatibility 的测试体系都是一份完整且可直接运行的参考实现。赞分享数据库关系型数据库后端CLI【免费下载链接】doltDolt – Git for Data项目地址https://gitcode.com/GitHub_Trending/do/dolt点击查看免费下载相关推荐GreptimeDB 版本兼容性测试完全指南基于 sqlness-runner 的向后/向前兼容验证体系GreptimeDB 版本兼容性测试完全指南基于 sqlness runner 的向后/向前兼容验证体系 本指南系统讲解 GreptimeDB 仓库中 tes时序数据库数据库可观测性GeneralUpdate版本兼容向后兼容与向前兼容的策略GeneralUpdate版本兼容向后兼容与向前兼容的策略 引言 在软件开发生命周期中版本兼容性Version Compatibility是确保应用程序开发工具OCRmyPDF版本兼容确保向前和向后兼容性OCRmyPDF版本兼容确保向前和向后兼容性 你是否曾遇到过升级OCRmyPDF后处理的PDF文件变大、格式错误或无法搜索的问题或者尝试在旧系统上运行新版本OCRCLI上一篇如何让Mac音频自由流转揭秘Soundflower的系统级音频路由方案下一篇中文网页字体优化指南PingFangSC苹果平方字体全面解析创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑