我正在多个项目上运行多个py_test()
配置。既然有很多,默认的沙箱机制似乎很方便-测试不会互相干扰,并且可以免费并行运行。
但是,这是有代价的,因为据我了解,沙箱会使bazel在临时目录中运行测试。结合没有定义任何 outs 参数(https://docs.bazel.build/versions/master/be/python.html)的py_test
规则,这很可能意味着测试后将不保留任何生成的文件。
我想要实现的是两件事:
capsys
使其工作并显式写入与测试名称相似的文件)。这里的问题是,该文件最终将位于沙盒目录中,即:
/home/user/.cache/bazel/_bazel_user/12342134213421342134/sandbox/linux-sandbox/1/execroot/project_name/bazel-out/k8-fastbuild/bin/test_suite.runfiles/
并随后将其删除。--junitxml=path
(https://docs.pytest.org/en/latest/usage.html#creating-junitxml-format-files),但还是要在临时的沙盒目录中生成一个文件。 bazel中的其他规则将 outs 定义为它们将生成的文件,即https://docs.bazel.build/versions/master/be/make-variables.html#predefined_genrule_variables:genrule
包含一个 outs 参数。>
所以问题归结为: bazel中是否有任何方法可以重用(或环绕)py_test
规则并定义它将生成的某些输出文件?
答案 0 :(得分:1)
在对Bazel进行了一些试验之后,我得出结论,没有简单的方法可以扩展py_test
来向其添加输出。从头开始创建自己的规则也很困难。
但是,事实证明,Bazel中的所有测试都定义了一些可以使用 的环境变量。实际上,有人问过另一个类似的问题,该问题使用它们解决了这个问题:bazel - writable archivable path for test runtime
在测试中,我从Python内部运行pytest,因此很容易以编程方式扩展启动参数:
def _get_log_file_args():
# Prepare the path to the log file, based on environmental
# variables defined by Bazel.
#
# As per docs, tests should not rely on these variables
# defined, so the framework will omit logging to file
# if necessary variables are undefined.
# See: https://docs.bazel.build/versions/master/test-encyclopedia.html#initial-conditions
LOG_DIR_ENV_VARIABLE = "TEST_UNDECLARED_OUTPUTS_DIR"
log_dir = os.environ.get(LOG_DIR_ENV_VARIABLE)
if log_dir:
file_log_path = os.path.join(log_dir, "test_output.log")
return [f"--log-file={file_log_path}"]
logger.warning(f"Environment variable '{LOG_DIR_ENV_VARIABLE}' used as the logging directory is not set. "
"Logging to file will be disabled.")
return [] # no file logging
然后,要处理位于./bazel-out/darwin-fastbuild/testlogs/<package-name>/<target-name>/test.outputs/outputs.zip
的最终.zip存档(根据链接的问题)。