Bazel 测试洞察
- 通过
tuist bazel setup连接的 Bazel 工作区,如 Bazel 项目入门 中所述。
tuist bazel setup 会在 .bazelrc.tuist 中配置每个测试用例的报告,因此普通的 bazel test 会将单个测试用例报告到与其他构建系统相同的仪表板:
bazel test //app:tests
要同时应用 隔离,请改用 Tuist 包装器运行测试。-- 之后的参数会转发给 bazel test:
tuist bazel test -- //app:tests
跟踪内容#
Tuist 解析 test.xml 报告并捕获 Bazel 为每个测试目标生成的 test.log 输出,然后将它们汇总到共享的测试运行模型中。每次运行都会记录:
- 单个测试用例的通过、失败和跳过状态,以及持续时间。
- 测试目标、类和套件结构。
- 当 Bazel 配置为重试不稳定测试时的重试尝试。
- 从目标的
test.log中捕获的失败输出。
对于 Bazel,测试运行、测试用例 和单个测试页面的工作方式与其他构建系统相同。
生成每个测试用例的 JUnit 报告#
每个测试用例的行取决于测试目标在 Bazel 提供的 $XML_OUTPUT_FILE 路径下写入 JUnit test.xml。如果运行器未写入该文件,Bazel 会回退到以目标命名的合成单用例报告,而 Tuist 会为每个目标显示一行(在测试用例列表中标记为 Bazel 目标),原始 test.log 仍可在运行页面上查看。
大多数 Bazel 测试规则已经生成真正的 test.xml:
java_test和kt_jvm_test:内置 JUnit。- 使用 GoogleTest 的
cc_test:当针对较新的 gtest 编译时,运行器会写入 JUnit;较旧的设置需要--gtest_output=xml:$XML_OUTPUT_FILE。 py_test:将 pytest 与--junitxml=$XML_OUTPUT_FILE一起使用,或使用rules_pythonpytest 运行器。go_test:将go test -json通过管道传递给gotestsum --junitfile=$XML_OUTPUT_FILE,或使用发出 JUnit 的辅助工具进行包装。
来自 rules_rust 和 rules_rs 的 rust_test 运行标准的 libtest 测试框架,该框架在稳定版 Rust 上不会写入 JUnit。使用脚本包装测试目标,该脚本解析 libtest 输出并将 JUnit 写入 $XML_OUTPUT_FILE;这样你可以在 Tuist 中保留每个测试用例的行,而同一次运行仍保持为单个 Bazel 测试目标。
测试标识#
测试用例通过目标标签、类名(回退到套件名称)和测试名称进行标识。这使得不同类中同名方法保持分离。使用不同外部套件名称的旧报告会将其历史记录保留在旧标识下;应用于旧标识的状态更改需要重新应用到新标识,并且当失败匹配旧标识时,命令会发出警告,以便你知道要迁移哪个策略。
提供 CI 上下文#
Tuist 从 Bazel 的构建元数据中读取 git 提交和分支信息,因此可以跨环境比较同一提交上的运行。大多数持续集成系统已设置这些信息;如果你的系统未设置,请显式传递:
tuist bazel test -- \
--build_metadata=CI=true \
--build_metadata=GIT_COMMIT="$GIT_COMMIT" \
--build_metadata=GIT_BRANCH="$GIT_BRANCH" //app:tests
同样的 --build_metadata 标志正是 Bazel 构建洞察 页面描述的用于标记调用的标志,因此一组标志即可覆盖这两个界面。
不稳定测试和隔离#
重试、跨运行的不稳定检测以及每个测试用例的隔离(静音和跳过)都通过 tuist bazel test 生效。有关完整工作流程,请参阅 Bazel 不稳定测试。
数据保留#
Tuist 会保留产生测试运行的 Bazel 调用、其日志以及待处理的测试摄入记录 90 天。测试用例及其运行历史使用与其他构建系统相同的模型,不受该时间窗口限制。有关完整政策,请参阅 数据保留。