我正在运行多个py_test()
项目数量的配置。由于它们数量众多,默认的沙箱机制似乎很方便 - 测试不会相互干扰,并且免费并行运行。
不过,这是有代价的,据我了解,沙箱将导致 bazel 在临时目录中运行测试。结合py_test
规则未定义任何outs范围 (https://docs.bazel.build/versions/master/be/python.html https://docs.bazel.build/versions/master/be/python.html),这可能意味着测试后不会保留生成的文件。
我想要实现的目标有两件事:
- 保留测试的输出,按测试用例分割(我想我可以使用它来工作
capsys
并显式写入名称与测试名称类似的文件)。这里的问题是,该文件最终将位于沙盒目录中,即:/home/user/.cache/bazel/_bazel_user/12342134213421342134/sandbox/linux-sandbox/1/execroot/project_name/bazel-out/k8-fastbuild/bin/test_suite.runfiles/
并将随后被删除。
- 我想获得 XML 格式的运行测试摘要。 Bazel 本身生成一个 JUnit 格式的 XML 文件,这很好,但不幸的是它不能正常工作(https://github.com/bazelbuild/bazel/issues/3413 https://github.com/bazelbuild/bazel/issues/3413)。最简单的解决方案是提供一个参数
--junitxml=path
(https://docs.pytest.org/en/latest/usage.html#creating-junitxml-format-files 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 https://docs.bazel.build/versions/master/be/make-variables.html#predefined_genrule_variables: genrule
包含一个outs范围。
所以问题归结为:bazel 有什么方法可以重用(或环绕)py_test
规则并定义它将生成的一些输出文件?
经过对 Bazel 的一些实验后,我得出结论,没有简单的方法可以扩展py_test
向其添加输出。从头开始创建自己的规则也相当困难。
然而,事实证明 Bazel 中的所有测试都定义了一些环境变量could使用。事实上,另一个类似的问题被问到,使用它们解决了问题:bazel - 测试运行时的可写可存档路径 https://stackoverflow.com/questions/47871993/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
然后就是处理最终的 .zip 存档了./bazel-out/darwin-fastbuild/testlogs/<package-name>/<target-name>/test.outputs/outputs.zip
(根据链接的问题)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)