Bazel 测试输出
内容提要
本文讨论了从Bazel测试中转储中间测试输出的方法。Bazel测试中有两个可写的私有目录:TEST_TMPDIR和TEST_UNDECLARED_OUTPUTS_DIR。TEST_UNDECLARED_OUTPUTS_DIR用于保存中间测试输出,TEST_TMPDIR用于保存临时文件。远程执行Bazel测试时,可以使用Bazel启动选项下载outputs.zip文件和bazel-testlogs目录。
延伸解读
两个目录的本质区别
TEST_TMPDIR 和 TEST_UNDECLARED_OUTPUTS_DIR 虽然都是测试期间可写的私有目录,但设计目的不同。TEST_TMPDIR 是 Bazel 隐式声明的目录,Bazel 会在测试前清理它,沙箱模式下测试结束后也会随沙箱删除。而 TEST_UNDECLARED_OUTPUTS_DIR 未在构建文件中声明,Bazel 不会主动清理,只会将其内容打包进 outputs.zip,因此更适合保存需要事后检查的中间输出。
如何选择保存位置
根据文章结论,选择哪个目录取决于输出是否需要事后检查。如果开发人员希望在测试执行后查看中间输出以分析失败原因,应使用 TEST_UNDECLARED_OUTPUTS_DIR,因为其内容会被保留并打包。如果只是临时文件,不打算事后检查,则使用 TEST_TMPDIR,避免不必要的输出被收集。这一区分有助于保持测试输出的整洁和可追溯性。
远程执行时的输出获取
当 Bazel 测试在远程执行时,中间输出仍会保存在 TEST_UNDECLARED_OUTPUTS_DIR 中,并最终打包到 bazel-testlogs 下的 outputs.zip 文件。用户可以通过 Bazel 启动选项(如 --remote_download_outputs=all)将 outputs.zip 和 bazel-testlogs 目录下载到本地,从而在远程测试后也能检查中间输出。这解决了远程执行时输出难以访问的问题。
Q&A
Bazel测试中如何保存中间测试输出?
可以使用TEST_UNDECLARED_OUTPUTS_DIR保存中间测试输出,文件会被压缩并添加到outputs.zip文件中。
TEST_TMPDIR和TEST_UNDECLARED_OUTPUTS_DIR有什么区别?
TEST_TMPDIR是声明的目录,Bazel可以在测试执行期间访问和清理;而TEST_UNDECLARED_OUTPUTS_DIR用于保存未声明的测试输出,Bazel不会直接操作它。
如何下载Bazel测试的输出文件?
可以使用Bazel启动选项,如--remote_download_outputs=all,下载outputs.zip文件和bazel-testlogs目录。
在Bazel测试中,TEST_TMPDIR的用途是什么?
TEST_TMPDIR用于保存不打算在测试执行后检查的临时文件,Bazel会在测试执行前清理该目录。
为什么开发人员需要检查中间测试输出?
开发人员希望在单元测试失败时检查中间测试输出,以理解失败原因。
Bazel测试中如何处理未声明的输出?
未声明的输出会被写入TEST_UNDECLARED_OUTPUTS_DIR,并在测试结束时被压缩到outputs.zip文件中。