【发布时间】:2022-04-20 08:34:43
【问题描述】:
我在多个项目上运行多个 py_test() 配置。由于它们很多,默认的沙盒机制似乎很方便 - 测试不会相互干扰,并且免费并行运行。
不过,这是有代价的,据我了解,沙盒会导致 bazel 在临时目录中运行测试。结合 py_test 规则未定义任何 outs 参数 (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)。最简单的解决方案是提供一个有效的参数
--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 规则并定义它将生成的一些输出文件?
【问题讨论】:
-
特别是对于junit输出,你应该使用环境变量
XML_OUTPUT_FILE到pytest的--junitxml标志,然后bazel将使用那个文件而不是它自己的junit xml文件生成器。