Bazel Test Outputs
Introduction
Sometimes, when a unit test fails, developers would like to inspect intermediate test outputs to understand the failure. In Bazel, however, because of sandboxing, it’s often unclear where those intermediate test outputs shall be saved so that developers can access after Bazel test execution. When Bazel test is executed remotely, it’s even more unclear where those intermediate test outputs shall be saved and how developers can access them.
In this blog post, I would like to discuss how to dump the intermediate test outputs from Bazel test.
TEST_TMPDIR VS TEST_UNDECLARED_OUTPUTS_DIR
In Bazel test, there are two private directories that are writable during the test execution: TEST_TMPDIR and TEST_UNDECLARED_OUTPUTS_DIR. From Bazel Test Encyclopedia, we have the following definitions for these two directories:
TEST_TMPDIR: absolute path to a private writable directoryTEST_UNDECLARED_OUTPUTS_DIR: absolute path to a private writable directory (used to write undeclared test outputs). Any files written to theTEST_UNDECLARED_OUTPUTS_DIRdirectory will be zipped up and added to anoutputs.zipfile underbazel-testlogs.
Because both directories are writable during the test execution, the questions become:
- What are the differences between
TEST_TMPDIRandTEST_UNDECLARED_OUTPUTS_DIR? - When should we use
TEST_TMPDIRand when should we useTEST_UNDECLARED_OUTPUTS_DIR?
None of these seem to be documented in the Bazel documentation.
TEST_UNDECLARED_OUTPUTS_DIR is a directory that is not declared in the Bazel build file. Every file or directory that Bazel will read and write have to be declared in the Bazel build file. This means Bazel will not mostly not touch TEST_UNDECLARED_OUTPUTS_DIR except that Bazel will zip up the TEST_UNDECLARED_OUTPUTS_DIR directory and add it to an outputs.zip file under bazel-testlogs. Thus, TEST_UNDECLARED_OUTPUTS_DIR is intended to be used for saving intermediate test outputs.
TEST_TMPDIR, on the other hand, is declared, probably implicitly, in the Bazel build file. This means Bazel will can touch TEST_TMPDIR even if the test code does not have any logic that reads or writes to TEST_TMPDIR. For example, the intended behavior of Bazel is to clean up TEST_TMPDIR before test execution. Additionally, if Bazel test is executed in sandbox, because the sandbox will be deleted after Bazel test is completed, the TEST_TMPDIR will be deleted as well.
Downloading Intermediate Test Outputs
After the Bazel test intermediate test outputs are saved in TEST_UNDECLARED_OUTPUTS_DIR, they will be zipped up and added to an outputs.zip file under bazel-testlogs.
When Bazel test is executed remotely, the user can download the outputs.zip file together with the bazel-testlogs directory using Bazel startup options, such as --remote_download_outputs=all.
Conclusions
Use TEST_UNDECLARED_OUTPUTS_DIR to save intermediate test outputs that developers would like to inspect after Bazel test execution. Use TEST_TMPDIR to save temporary files that are not intended to be inspected after Bazel test execution.
Use Bazel startup options, such as --remote_download_outputs=all, to download the outputs.zip file together with the bazel-testlogs directory when Bazel test is executed remotely.
References
Bazel Test Outputs