完整指南:Polyglot、Mocha 与四类测试的运行机制)
数据库文档数据库分布式数据库【免费下载链接】rethinkdbThe open-source database for the realtime web.项目地址https://gitcode.com/gh_mirrors/re/rethinkdb点击查看免费下载test/rql_test/test-runner是 RethinkDB 仓库中用于装配与运行 RQLReQL语言测试的核心工具它统一承载了 JavaScript、Python、Ruby 等官方驱动及 Polyglot多语言测试的执行。本文将以其官方文档 test/rql_test/README.md 为主体骨架结合 test-runner 源码约 2190 行深入讲解四类测试文件的发现与调度规则、解释器选择语法、全部命令行选项及其底层实现并给出可直接复制的实操命令。读完本文你将掌握如何按语言、按目录、按正则过滤地运行 RethinkDB 的 RQL 测试套件并理解这一框架如何支撑一份 YAML 测试、多语言驱动执行的 Polyglot 设计。一、test-runner 是什么RQL 测试的统一入口test-runner是一个用 Python 编写的可执行脚本test-runner文件头部注释明确其职责Tool to assemble and run the RQL language tests, including the polyglot yaml tests装配并运行 RQL 语言测试包括 Polyglot 的 YAML 测试。从官方文档的历史定位看test-runner 传统上只用于运行官方驱动driver的测试而长期计划issue #3442是让它接管全部测试。它位于test/rql_test/目录运行时递归扫描自身所在文件夹凡是以四种扩展名结尾的文件都会被当作候选测试扩展名运行方式.mocha使用 Mocha JavaScript 测试框架运行Node.js 环境.httpbin启动一个 httpbin 服务器随测试共存并注入额外环境变量HTTPBIN_HOST、HTTPBIN_HTTPBIN_PORT、HTTPBIN_HTTPCONTENT_PORT、HTTPBIN_HTTPS_PORT其中js变体额外通过 Mocha 运行.yaml被翻译成所有解释器语言并交由各语言的驱动drivers/driver.*运行.test普通运行若指定了解释器则经解释器执行否则作为命令行可执行文件直接运行源码中对应的扩展名清单定义在 test-runnertestExtensions [httpbin, mocha, test, yaml]。在仓库中你可以直接观察到这些真实用例.mocha类connections/connection.mocha、connections/cursor.mocha、connections/feeds.mocha、connections/date.mocha.httpbin类connections/r_http.js.httpbin、connections/r_http.py.httpbin、connections/r_http.rb.httpbin.yaml类集中在 test/rql_test/src 目录如 src/control.yaml、src/aggregation.yaml 等.test类connections/connection.py.test、stream.py_one.test、em.rb.test、get_all.rb_one.test、server_test.rb_one.test 等。测试的命名规则每个测试以其相对本文件夹的路径命名唯一的例外是./src文件夹在名称中会被翻译为polyglot。官方文档给出的两个示例./connections/connection.py.test在 Python2.6 下运行后名称为connections/connection.py2.6./src/meta/composite.py.yaml在 Python2.6 下运行后名称为polyglot/meta/composite.py2.6。也就是说你在./test-runner connections/connection中使用的正则过滤参数匹配的正是这套翻译后的测试名。二、解释器Interpreter机制短代码、版本范围与 _one 后缀每个测试文件都可以通过文件名中的短代码声明它用什么语言编写。支持的解释器短代码如下短代码语言对应解释器jsJavaScriptnodepyPythonpython / pythonX.YrbRubyrubyjrbJRubyjruby解释器命名规则短代码写在测试名不含扩展名的最后一个点号之后。如果没有指定解释器测试将作为命令行可执行文件直接运行——但文档明确指出大多数情况下都应指定解释器。版本选择支持两种语法逗号分隔的列表例如grey.rb1.9,rb2.0.test先按 Ruby 1.9 运行再按 Ruby 2.0 运行单端范围使用符号放在解释器代码之前或之后py3.12表示 Python 3.12 及以下到 3.0所有版本py3表示 Python 3.x 的所有版本。文档给出的完整示例清单red.test—— 运行一个名为red的测试不经过解释器green.py.test—— 对所有已选 Python 版本运行名为green的测试blue.mocha—— 通过 Mocha 框架、对所有已选 Node 版本运行blue测试orange.py3.yaml—— 在 Python 3 的所有版本中运行orange测试yellow.py2_7.test—— 对 Python 2.6 与 Python 2.7 运行yellow测试purple.js_one.mocha—— 只通过第一个被选中的 Node 版本运行 Mocha 测试grey.rb1.9,rb2_one.test—— 先按 Ruby 1.9 运行grey再按第一个被选中的 Ruby 2.x 版本运行。_one后缀的特殊语义对于测试服务端行为的测试在解释器后追加_one将只对找到的第一个解释器版本运行一次如rb_one、js_one。仓库中可看到大量实际应用例如 connections/client_info.rb_one.test、connections/server_info.yaml、stream.py_one.test、get_all.rb_one.test、trivial_cfeed.rb_one.test。源码层面的版本解析在 test-runner 中框架为每个语言注册了具体版本interpreters { py: [PyLang(3.12)], py3.12: [PyLang(3.12)], js: [JsLang(16.14)], js16.14:[JsLang(16.14)], rb: [RbLang(2.7)], rb2.7: [RbLang(2.7)], jrb: [JrbLang(9.2)], jrb9.2: [JrbLang(9.2)], }各语言类PyLang、JsLang、RbLang、JrbLang继承自SrcLang负责在 PATH 中按候选可执行名查找解释器如python3.12→python3→python且特意把python放在最前以兼容 virtualenv见 test-runner也支持通过环境变量强制指定解释器路径PYTHON、NODE、RUBY对应interpreter_env_name见 test-runner通过--version探测实际版本并与minVersion/maxVersion比较做版本校验test-runner。每种语言的 Polyglot 公共头文件位于 test/rql_test/driversdriver.py、driver.js、driver.rb另有driver_test.py用于驱动自测。这些文件同时是SrcLang._polyglot_language_header_path指向的公共测试函数模板。三、环境准备构建 RethinkDB、安装 Node/Mocha 与各语言依赖官方文档列出运行全部测试所需的前置条件与安装命令。3.1 基础依赖必须先在仓库根目录执行./configure并构建 RethinkDB同时安装 Node.js 和全局 Mochamake -C ../.. sudo npm install -g mocha注意make -C ../..相对于test/rql_test目录执行即回到仓库根目录构建。3.2 HTTP 测试依赖HTTP 测试需要带 OpenSSL 支持的 Pythontwisted库。许多系统已预装若没有可用 pip 安装务必装到正确的 Python 版本下sudo pip install twisted sudo pip install pyopenssl3.3 各驱动变体依赖要测试全部驱动变体还需为 Python 安装tornado与gevent为 Ruby 安装eventmachinesudo pip install tornado sudo pip install gevent sudo gem install eventmachine注意事项最后一组库必须为每个你希望测试的 Python 或 Ruby 版本各装一份Python 3.03.2 不受这些项目支持因此无法在这些版本上运行对应变体测试。仓库中实际使用了上述依赖的测试包括connections/tornado_connection.py.test、connections/gevent_connection.py2_7,py3_3.test、connections/twisted_connection.py2_7,py3_3.test、connections/asyncio_connection.py3_4.test后者要求 Python 3.4可直观验证py3_4范围语法。另外在启动测试前框架还会自动make -C各驱动源码目录以构建语言驱动见 test-runner并通过RDB_EXE_PATH等环境变量把选中的 RethinkDB 二进制路径传递给子进程。四、基本用法与过滤器不带任何参数直接运行会执行能找到的第一个 Python、Ruby 和 Node 版本对应的全部测试./test-runner可以用正则表达式作为参数指定单个测试或测试组多个参数即可运行多组测试./test-runner connections ./test-runner polyglot/math ./test-runner connections/connection polyglot/regression/26*注意过滤参数匹配的是翻译后的测试名src→polyglot、解释器版本后缀等因此polyglot/math实际匹配的是 test/rql_test/src 下的数学逻辑类测试。此外源码还支持通过环境变量注入过滤器当命令行未提供任何过滤参数时会尝试读取RQL_TEST与TEST环境变量并编译为正则过滤见 test-runner。若过滤参数是非法的正则脚本会报错退出若过滤后没有任何测试则会打印没有匹配的测试并退出test-runner。失败与超时行为测试返回非零退出码即视为失败测试超过 300 秒即视为超时源码中TIMED_OUT_EXIT_CODE -257见 test-runner失败或超时不会中断整个测试进程测试会继续运行该测试的 STDERR 与 STDOUT 输出会打印到屏幕全部测试结束后会打印一份失败测试汇总。默认情况下服务端数据文件创建在当前工作目录下的隐藏文件夹中退出时自动删除源码实现默认输出目录是tempfile.mkdtemp(prefix.rethinkdbTestTemp-, diros.getcwd())并注册退出清理见 test-runner。五、命令行选项详解含源码实现官方文档列出的全部选项如下括号内为源码 test-runner 中的实际定义选项源码 dest含义-l/--listlist_mode列出所有测试后退出-i/--interpreterlanguages指定要使用的驱动语言可多次指定-d/--driver-portdriver_port指定一个已运行的服务器而非由测试框架自行启动实例格式为hostname:port缺省主机名视为localhost。并非所有测试都支持-t/--tabletable在使用用户自备服务器时指定一个已存在的表作为主表并非所有测试都支持-o/--output-diroutput_dir将测试本身及由测试系统托管的服务器不含用户自备服务器的控制台输出保存到指定目录下的文件夹失败测试的服务端文件也会被收集到这些文件夹中--scratch-dirscratch_dir把所有临时文件包括数据库数据文件放入所选文件夹适合在不同磁盘上测试 RethinkDB--cleanclean_output_dir运行前清空输出目录仅在指定了-o/--output-dir时才有意义-v/--verboseverbose让测试输出直接进入 stderr/stdout这会使测试串行执行并禁用输出目录保存测试输出-b/--server-binaryrethinkdb_exe_path使用指定的rethinkdb二进制而非自动选择最近构建的那个-s/--shardsshards在每个测试开始前把默认表切成指定数量的分片自己建表的测试不受影响默认 1-j/--jobsworkerThreads同时运行的测试数默认 2--debugdebug源码补充项-h/--help可查显示 test-runner 自身的调试输出关键选项的源码行为默认并发数未指定-j时若使用了--table、--verbose或--driver-port则并发强制为 1否则为 2-j值必须 ≥ 1test-runner。-v与-j互斥--verbose会禁用并行并给出警告test-runner。-b校验指定二进制后仍会检查其可执行权限未指定时通过utils.find_rethinkdb_executable()自动定位test-runner随后写入环境变量RDB_EXE_PATH。-d的约束端口必须是正整数或hostname:port形式-d不能与-s同时使用因为分片逻辑只在自备服务器场景外生效而-t必须与-d搭配使用且格式必须是db.table含且仅含一个点号test-runner。-t传递指定后写入环境变量TEST_DB_AND_TABLE_NAMEtest-runner。输出与清理--clean会删除输出目录内除 scratch 目录以外的所有条目test-runner。文档也提示-h/--help中可能还有其他选项例如上面补充的--debug以及-d使用--INSTALLED--选择系统安装版本等特殊能力见 test-runner。六、语言测试Language tests按语言过滤使用-i/--interpreter即可只跑特定语言./test-runner -i js ./test-runner -i py ./test-runner -i rb默认情况下框架根据能在系统中找到的版本为每种语言选择一个版本源码逻辑见 test-runner依次尝试js、py、rb三个语言组找到可用解释器即采用想指定具体版本可在语言后缀后追加版本号例如-i py3.12对应 test-runner 中注册的py3.12选项多个语言/语言版本可通过多个-i标志同时选择./test-runner -i py -i rb另外-i选项使用callbackcheck_language校验器test-runner非法的语言名会直接报Invalid language而合法的语言若在当前系统找不到可用解释器会报Unable to find a valid interpreter for language。七、Polyglot 测试一份 YAML多语言驱动Polyglot 测试是 test-runner 最具特色的能力——src/*.yaml中的每份测试描述会被翻译生成所有目标语言的测试代码再分别交给对应语言驱动执行./test-runner polyglot # 运行全部 polyglot 测试 ./test-runner polyglot -i js # 仅 JavaScript 版本 ./test-runner polyglot -i py # 仅 Python 版本 ./test-runner polyglot -i rb # 仅 Ruby 版本以 src/control.yaml 为例一个 Polyglot 用例的结构是同一查询、多语言写法、统一期望输出- py: r.expr(1).do(lambda v: v * 2) js: r.expr(1).do(function(v) { return v.mul(2); }) rb: r.expr(1).do{|v| v * 2 } ot: 2生成过程的源码路径test-runnerTestGroup.buildYamlTest大致为用 parsePolyglot 解析 YAML 中的tests列表parsePolyglot.py 位于 test/common生成带 shebang#!解释器路径与 UTF-8 编码声明的可执行文件test-runner注入该语言的公共头文件polyglot_language_header即 test/rql_test/drivers/driver.py、driver.js、driver.rb依据 YAML 中的table_variable_name生成建表语句setup_table(...)并调用setup_table_check()校验外部表声明逐条将py/js/rb字段翻译为对应语言代码——翻译规则定义在各语言类的lang_replaces与translate_query中例如 Python 侧把null/nil换成Nonetest-runnerJavaScript 侧把None/True/False换成null/true/false并把下划线命名转驼峰test-runnerRuby 侧还要把 Python 风格字典{a:1}转为{a1}dict_translatetest-runner最后写入the_end()收尾并设置可执行权限test-runner。在src目录下可以看到丰富的 Polyglot 主题aggregation.yaml、selection.yaml、transformation.yaml、math_logic/、times/、geo/、datum/、sindex/、mutation/、regression/等涵盖 RethinkDB 查询语言的主流能力。八、连接测试与游标测试跨语言驱动实战8.1 连接测试connections/connectionconnections/connection同时存在三种语言实现.mocha、.py.test、.rb.test因此./test-runner connections/connection # 运行全部三个版本的连接测试 ./test-runner -i js connections/connection # 仅 JavaScript/Mocha 版本 ./test-runner -i py connections/connection # 仅 Python 版本 ./test-runner -i rb connections/connection # 仅 Ruby 版本对应文件为 connections/connection.mocha、connections/connection.py.test以及connection_star.py.test、tornado_connection.py.test等变体。8.2 游标测试connections/cursor同理connections/cursor也提供三种语言的实现./test-runner run connections/cursor # 运行全部三个版本的游标测试 ./test-runner -i js connections/cursor ./test-runner -i py connections/cursor ./test-runner -i rb connections/cursor对应文件为 connections/cursor.mocha、connections/cursor.py.test、connections/cursor.rb.test。文档原文中此处run一词应为命令名一部分的笔误/历史遗留实际用法与其他组一致。8.3 其他典型用法connections目录还展示了更多模式组合均可作为编写自定义测试的参照./test-runner connections—— 一次运行整个 connections 目录./test-runner r_http—— 触发.httpbin类 HTTP 测试r_http.js.httpbin、r_http.py.httpbin、r_http.rb.httpbin./test-runner -i py connections/feeds—— 仅 Python 运行 changefeed 相关的 Mocha 测试feeds.mocha实际是 Mocha 框架需用-i js。九、调试与故障排查实践结合源码几个实用排查思路先列清单./test-runner -l | grep cursor查看翻译后的完整测试名确认正则过滤是否匹配预期查看帮助./test-runner -h可看到全部选项含文档未展开的--debug无匹配测试若提示There are no tests that match the filter先确认目录名/正则与翻译后命名尤其src→polyglot一致并行与输出排查输出顺序问题时用-v强制串行观察实时输出需要留存失败现场时用-o output_dir失败测试的服务端文件会保存于此并配合--clean保证目录干净指定服务端已有运行中的集群时用-d host:port -t db.table复用避免框架重复启停服务器多磁盘测试用--scratch-dir将数据库数据文件放到目标磁盘验证存储介质差异下的行为环境变量注入过滤可设置RQL_TEST或TEST正则实现 CI 中的测试子集选择。十、结语test-runner通过文件名即配置的设计把测试语言、解释器版本范围、单版本约束_one、HTTP 服务器需求.httpbin和 Polyglot 翻译.yaml统一编码进文件系统再以一套简洁的正则过滤 命令行列选项驱动整个 RQL 测试体系。理解其命名规则src→polyglot、解释器语法py3、py2_7、rb1.9,rb2_one以及各选项的源码约束如-t必须配合-d、-d不能与-s并用、-v禁用并行你就能精准地按需运行 RethinkDB 多语言驱动测试并为新增 RQL 行为编写一份 YAML、多语言验证的 Polyglot 用例。赞分享数据库文档数据库分布式数据库【免费下载链接】rethinkdbThe open-source database for the realtime web.项目地址https://gitcode.com/gh_mirrors/re/rethinkdb点击查看免费下载相关推荐miniblink49 内置 Google Test V1.5 测试框架指南断言体系、测试夹具与 RUN_ALL_TESTS 运行机制miniblink49 内置 Google Test V1.5 测试框架指南断言体系、测试夹具与 RUN_ALL_TESTS 运行机制 本文以 minibli前端桌面应用如何用Qucs快速进行电路仿真5个实用技巧提升电子设计效率如何用Qucs快速进行电路仿真5个实用技巧提升电子设计效率 QucsQuite Universal Circuit Simulator是一款功能强大的开源桌面应用科学计算Snowpack 项目接入 web/test-runner 测试框架完整指南Snowpack 项目接入 web/test runner 测试框架完整指南 本指南以 Snowpack 官方推荐的浏览器端测试运行器 web/test r前端开发工具前端构建上一篇Impulse终极DDoS工具包完全指南 - 10种攻击方法详解下一篇【亲测免费】 AkVirtualCamera: 虚拟摄像头解决方案创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考