ARTICLE DETAIL

资讯详情

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

Bats 1.x 使用指南:从命令行参数到并行执行

Bats 1.x 使用指南:从命令行参数到并行执行 测试开发工具【免费下载链接】bats-coreBash Automated Testing System项目地址https://gitcode.com/gh_mirrors/ba/bats-core点击查看免费下载本文围绕 BatsBash Automated Testing System官方使用手册 docs/source/usage.md 展开系统讲解bats命令的完整命令行用法如何运行测试文件与目录、如何利用 TAP/JUnit/自定义格式化器控制输出、如何生成 JUnit 报告文件以及如何借助 GNU parallel 实现测试并行化。读完本文你将能熟练使用 Bats 的全部核心 CLI 选项并能结合源码理解其底层执行流程。快速上手运行你的第一个测试安装 Bats 后系统会提供两个手册页man 1 bats使用手册与man 7 bats测试文件编写手册对应的源文件分别是 man/bats.1.ronn 与 man/bats.7.ronn。同时随时可以运行bats -h或bats --help查看当前版本支持的全部命令行选项——该帮助文本直接内嵌在入口脚本 libexec/bats-core/bats 中。运行测试的基本形式是调用bats解释器后跟一个或多个测试文件路径或包含测试文件的目录路径。需要注意只有以.bats扩展名结尾的文件才会被执行目录模式下Bats只执行目录顶层的.bats文件默认不递归子目录除非指定-r/--recursive标志若想自定义测试文件扩展名可通过环境变量BATS_FILE_EXTENSION覆盖测试见 test/suite.bats。文件收集逻辑在 libexec/bats-core/bats 中对目录启用-r时用find -L递归查找所有匹配*.${BATS_FILE_EXTENSION:-bats}的文件不递归时则仅对顶层做通配符展开。用--终止选项解析当测试文件路径本身以-开头时例如名为-example.bats的文件需要先用--停止选项解析bats -- -example.bats--之后的所有参数一律视为路径因此所有选项必须放在它前面bats -r -- -test-directory在源码层面--之后的参数被原样收入arguments数组并终止解析循环见 libexec/bats-core/bats。退出码约定每个测试文件中的测试用例顺序执行且相互隔离若所有测试全部通过bats以退出码0结束只要有任一测试失败退出码即为1见 man/bats.1.ronn 与套件执行器 libexec/bats-core/bats-exec-suite。理解输出Pretty 格式与 TAP 格式终端下的 Pretty 输出在终端中直接运行 Bats 时每个测试完成都会实时打印结果测试名左侧为通过标记✓失败则显示X$ bats addition.bats ✓ addition using bc ✓ addition using dc 2 tests, 0 failures这一行为由 pretty 格式化器实现libexec/bats-core/bats-format-pretty。从实现细节看pretty 格式化器会根据终端列宽动态排版测试名与计数列并支持-T时序显示、失败高亮以及交互模式下的光标控制move_up/go_to_column等 ANSI 转义序列。非终端环境下的 TAP 输出当 Bats未连接终端时——例如在 CI 系统中运行或将输出重定向到文件——结果会以人类可读、机器可解析的TAPTest Anything Protocol格式输出。这一默认选择逻辑见 libexec/bats-core/bats只有CI环境变量未设置、stdin/stdout 均为终端且存在tput命令时默认才使用 pretty否则默认使用 tap。TAP 输出示例$ bats --formatter tap addition.bats 1..2 ok 1 addition using bc ok 2 addition using dc其中第一行1..N是测试计划ok 编号 测试名表示通过。bats-format-tap的实现非常精简见 libexec/bats-core/bats-format-tap1..N由bats_tap_stream_plan打印ok/not ok/# skip分别对应通过、失败与跳过配合-T时还会追加# in N ms时序注释。如果想在终端中也强制 TAP 输出可以使用--formatter tap或更简洁的等价写法-t/--tap。测试数量的汇总与校验无论使用哪种格式化器套件执行器都会在开头打印1..测试总数这一总数由bats-gather-tests预先收集并写入测试清单文件后统计得出见 libexec/bats-core/bats-exec-suite。输出流水线上还挂着一个bats_test_count_validator负责校验最终输出的ok/not ok数量与计划数是否一致。切换输出格式--formatter 与 -F--formatter type简写-F用于切换测试结果输出格式当前支持的取值在 libexec/bats-core/bats 中声明为pretty, junit, tap, tap13另有内部使用的cat与custom变体。有效取值还包括以/开头的绝对路径此时 Bats 会把该路径当作可执行格式化器直接调用。入口脚本会校验格式化器文件存在且可执行bats_check_formatter见 libexec/bats-core/bats。格式化器实际是通过把名字映射为bats-format-name可执行文件来加载的interpolated_formatterbats-format-${formatter}因此libexec/bats-core/目录下可以看到bats-format-tap、bats-format-pretty、bats-format-junit、bats-format-tap13等一一对应的脚本。JUnit 格式输出$ bats --formatter junit addition.bats 1..2 ok 1 addition using bc ok 2 addition using dc注意直接在终端使用--formatter junit时屏幕上仍会显示 TAP 流JUnit 化的 XML 只有在配合--report-formatter落盘时才能看到见下文。从源码看当选用 junit 作为主格式化器时Bats 会自动附加-T时序并传入--base-path以便在classname中去掉测试文件前缀见 libexec/bats-core/bats。使用自定义格式化器如果你有自己的格式化器可以直接用绝对路径指定$ bats --formatter /absolute/path/to/my-formatter addition.bats addition using bc WORKED addition using dc FAILED所有格式化器内置或自定义都通过解析“扩展 TAP 流”工作套件执行器输出的每条记录plan、suite、begin、ok、not ok、comment、unknown会触发格式化器脚本中对应的bats_tap_stream_*回调函数这套协议定义在 lib/bats-core/formatter.bash 中。因此编写自定义格式化器本质上就是实现这些回调函数。生成测试报告--report-formatter 与 --output除了控制屏幕输出Bats 还支持把报告写入文件。--report-formatter接受与--formatter相同的取值用于选择报告生成器报告默认保存在当前工作目录可通过-o/--output指定其他目录该目录必须已存在且可写。$ bats --report-formatter junit addition.bats --output /tmp 1..2 ok 1 addition using bc ok 2 addition using dc $ cat /tmp/report.xml ?xml version1.0 encodingUTF-8? testsuites time0.073 testsuite nameaddition.bats tests2 failures0 errors0 skipped0 testcase classnameaddition.bats nameaddition using bc time0.034 / testcase classnameaddition.bats nameaddition using dc time0.039 / /testsuite /testsuites报告文件名的默认规则定义在 libexec/bats-core/batstap/tap13 报告为report.tapjunit 为report.xml其余为report.log也可以通过环境变量BATS_REPORT_FILENAME覆盖。报告输出目录默认值为.可用环境变量BATS_REPORT_OUTPUT_DIR设置见 libexec/bats-core/bats。从流水线角度看--report-formatter与主--formatter是两条并行的输出通道套件执行器的 TAP 流被tee分叉一份写入报告文件经报告格式化器处理一份继续流向主格式化器显示见 libexec/bats-core/bats。JUnit 格式化器的实现细节在 libexec/bats-core/bats-format-junit 中可以看到每个测试文件对应一个testsuitename取classname即去掉 base-path 后的文件路径每次通过/失败/跳过都会累计file_count、file_failures、file_skipped并换算毫秒级耗时为秒失败的测试会输出failure元素跳过的测试带skipped元素及原因所有进入 XML 的文本测试名、日志、跳过原因都会经过xml_escape处理转义、、、引号等 XML 特殊字符并剔除 ANSI 颜色转义序列确保生成合法 XML。完整命令行选项参考下表汇总bats -h输出的全部选项来自 libexec/bats-core/bats与 man/bats.1.ronn 保持一致选项说明--abort第一个测试失败即停止整个套件--allow-empty-suite未找到测试时以退出码 0 结束默认退出码为 1也可通过环境变量$BATS_ALLOW_EMPTY_SUITE设置-c/--count只统计测试用例数量不真正运行测试--code-quote-style style代码引用定界符样式两个字符的定界符字符串或custom此时必须设置$BATS_BEGIN_CODE_QUOTE与$BATS_END_CODE_QUOTE也可通过$BATS_CODE_QUOTE_STYLE设置--line-reference-format控制堆栈跟踪中文件/行号引用的打印格式comma_line默认如a.bats, line 1、colona.bats:1、urifile:///tests/a.bats:1、custom自定义函数bats_format_file_line_reference_custom-f/--filter regex只运行名称匹配该正则表达式的测试--negative-filter regex只运行名称不匹配该正则表达式的测试--filter-status status只运行上次未被 CtrlC/SIGINT 中断的运行中具有指定状态的测试。failed 上次失败或未出现的测试missed 上次未出现的测试--filter-tags 逗号分隔标签列表只运行匹配列表中全部标签的测试语义可用!前缀取反多次指定该选项形成逻辑或||-F/--formatter type切换格式化器pretty默认、tap无终端时的默认、tap13、junit、/绝对路径--gather-test-outputs-in 目录将失败和通过测试的输出收集为文件存入指定目录目录已存在时必须为空-h/--help显示帮助信息-j/--jobs jobs并行任务数要求安装 GNU parallel 或 shenwei356/rush--parallel-binary-name 名称指定并行程序的二进制名称默认parallel可经$BATS_PARALLEL_BINARY_NAME覆盖--no-tempdir-cleanup保留测试输出临时目录默认运行结束后清理--errexit对run中执行的命令启用 errexitset -e--no-parallelize-across-files将测试文件执行串行化要求--jobs 1只保留文件内并行--no-parallelize-within-files将文件内测试执行串行化要求--jobs 1只保留跨文件并行--report-formatter type报告生成器取值同--formatter-o/--output dir报告文件输出目录必须存在-p/--pretty--formatter pretty的简写--print-output-on-failure测试失败时自动打印$output的值-r/--recursive递归包含子目录中的测试--show-output-of-passing-tests打印通过测试的输出-t/--tap--formatter tap的简写-T/--timing为测试附加计时信息-x/--trace打印实际执行的测试命令类似set -x--verbose-run让run默认打印$output-v/--version显示版本号--之后的所有参数一律视为测试路径过滤、计数与聚焦的底层机制从源码结构看所有“选择运行哪些测试”的逻辑都集中在测试收集器 libexec/bats-core/bats-gather-tests 中它在真正执行前先对每个.bats文件做一次预处理bats_preprocess_source通过重定义的bats_test_function注册每个测试及其标签再由一系列should_skip_because_of_*函数依次应用 filter、negative-filter、filter-tags、filter-status 与bats:focus聚焦标签的过滤规则最终把入选测试写入TESTS_LIST_FILE。-c计数的数字正是这份清单的行数见 libexec/bats-core/bats-exec-suite。并行执行--jobs 的威力与代价该特性自 Bats 1.0.0 起提供见 docs/source/usage.md。默认情况下 Bats 串行执行所有测试。要提速可以使用--jobs参数启用并行执行前提是机器上安装了GNU parallel或兼容替代品如 shenwei356/rush可通过--parallel-binary-name指定bats --jobs 4 test/并行前的注意事项执行顺序不再保证并行化测试的完成顺序不确定因此这一模式可能破坏存在测试间依赖或测试写入共享位置的套件首次启用务必多跑几次多次重复运行--jobs模式以发现潜在的测试间依赖或非确定性行为按文件分批输出并行模式下一个文件的结果只有在该文件整体完成后才会显示。细粒度控制并行范围Bats 提供两种开关来调整并行粒度--no-parallelize-across-files关闭跨文件并行文件按顺序逐个执行并行只发生在单个文件内部。代价是整体并行度下降但每个文件的输出可以即时看到--no-parallelize-within-files关闭文件内并行所有文件内的测试串行执行并行只发生在文件之间。两者都要求--jobs大于 1否则套件执行器会直接报错见 libexec/bats-core/bats-exec-suite。如果只想让某一个文件内的测试串行可以在该文件的setup_file()中或任何函数之外导出export BATS_NO_PARALLELIZE_WITHIN_FILEtrue这一精细控制只对当前所在文件生效。相应的行为测试覆盖在 test/parallel.bats验证了--no-parallelize-across-files/--no-parallelize-within-files各自确实阻止了对应维度的并行化也验证了BATS_NO_PARALLELIZE_WITHIN_FILE在setup_file()和函数外设置有效、但在setup()或测试函数内部设置则无效。底层实现GNU parallel 与文件内信号量从源码可以看清并行的两层结构跨文件并行由 GNU parallel 驱动。套件执行器在--jobs 1时先校验 parallel 可用不可用则直接报错见 libexec/bats-core/bats-exec-suite随后以--keep-order --jobs N调用 parallel 去并发执行每个文件的bats-exec-file配合--abort时还会追加--halt now,fail1实现“首败即停”见 libexec/bats-core/bats-exec-suite。测试用例按文件并行时仍能保持输出顺序--keep-order因此1..N与ok N仍按文件顺序打印——这一点在 test/parallel.bats 中有专门断言。文件内并行由信号量机制实现。lib/bats-core/semaphore.bash 用原子化的mkdir抢占$BATS_RUN_TMPDIR/semaphores/slot-N目录作为“槽位”bats_semaphore_acquire_slot循环尝试创建空闲槽目录创建成功即获得一个并行名额bats_semaphore_release_wrapper把命令的 stdout/stderr 重定向到输出目录后后台执行并在退出时用rmdir释放槽位。并行测试的并发上限正好等于--jobs指定的槽位数test/parallel.bats 通过parallel_factor.bats夹具验证了最大并发数恰好等于设定值。小结Bats 的命令行设计围绕“测试收集 → 套件执行 → 格式化输出”三段流水线展开bats-gather-tests负责收集与过滤测试bats-exec-suite负责编排串行/并行执行并输出 TAP 流bats-format-*系列脚本负责把 TAP 流渲染为 pretty、TAP 或 JUnit 格式。理解了这条主线无论是切换输出格式、生成 CI 报告还是用--jobs与--no-parallelize-*组合调优并行策略都能做到有的放矢。若需深入了解测试文件的编写规范请参阅 docs/source/writing-tests.md 与man 7 bats。赞分享测试开发工具【免费下载链接】bats-coreBash Automated Testing System项目地址https://gitcode.com/gh_mirrors/ba/bats-core点击查看免费下载相关推荐SerenityOS xargs 命令完全指南从输入流构建并执行命令行SerenityOS xargs 命令完全指南从输入流构建并执行命令行 导读 本文基于 SerenityOS 仓库中的 xargs 手册页 Base/usr操作系统内核驱动QGroundControl命令行参数使用指南QGroundControl命令行参数使用指南 概述 QGroundControl作为一款功能强大的地面站软件提供了丰富的命令行参数选项这些参数主要用于调试无人机智能硬件Dolt 的 batsee 使用指南并行执行 BATS 集成测试的加速利器Dolt 的 batsee 使用指南并行执行 BATS 集成测试的加速利器 本文介绍 Dolt 仓库中位于 go/utils/batsee https://l数据库关系型数据库后端CLI上一篇10个惊艳的reactable表格设计案例让你的数据可视化脱颖而出下一篇PinchTab 站点抓取与审计规范实战基于 SeaPortal 的浏览器深度增强层创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表