沙箱中的Bazel和py_test-以任何方式定义输出?

时间:2019-01-29 09:14:47

标签: pytest bazel

我正在多个项目上运行多个py_test()配置。既然有很多,默认的沙箱机制似乎很方便-测试不会互相干扰,并且可以免费并行运行。

但是,这是有代价的,因为据我了解,沙箱会使bazel在临时目录中运行测试。结合没有定义任何 outs 参数(https://docs.bazel.build/versions/master/be/python.html)的py_test规则,这很可能意味着测试后将不保留任何生成的文件。

我想要实现的是两件事:

  1. 保留测试的输出,按测试用例划分(我想我可以使用capsys使其工作并显式写入与测试名称相似的文件)。这里的问题是,该文件最终将位于沙盒目录中,即: /home/user/.cache/bazel/_bazel_user/12342134213421342134/sandbox/linux-sandbox/1/execroot/project_name/bazel-out/k8-fastbuild/bin/test_suite.runfiles/ 并随后将其删除。
  2. 我想获得XML格式的运行测试摘要。 Bazel本身会生成JUnit格式的XML文件,这很好,但是很遗憾,它无法正常工作(https://github.com/bazelbuild/bazel/issues/3413)。最简单的解决方案是提供一个有效的参数--junitxml=pathhttps://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_variablesgenrule包含一个 outs 参数。

所以问题归结为: bazel中是否有任何方法可以重用(或环绕)py_test规则并定义它将生成的某些输出文件?

1 个答案:

答案 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存档(根据链接的问题)。