沙箱中的 Bazel 和 py_test - 有什么方法可以定义输出?

2024-04-02

我正在运行多个py_test()项目数量的配置。由于它们数量众多,默认的沙箱机制似乎很方便 - 测试不会相互干扰,并且免费并行运行。

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

我想要实现的目标有两件事:

  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 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(使用前将#替换为@)

沙箱中的 Bazel 和 py_test - 有什么方法可以定义输出? 的相关文章

  • 如何使用 pytest 测试无限 while 循环

    我目前正在编写一个与bamboo 构建服务器交互的小库 测试是使用 pytest 完成的 我陷入了以下问题 我想测试一个 while 循环 该循环运行直到满足某些状态 阅读 pytest 文档 我尝试 模拟 monkeypatch 状态 但
  • 使用 pytest 运行trace.py

    我正在尝试使用trace py跑步时pytest 我知道pytest有自己的覆盖率插件pytest cov但限制 每行执行的次数不可用 不允许我现在使用它 同样对于coverage py 我正在尝试这个命令 python3 4 m trac
  • 给定一个张量流模型图,如何找到输入节点和输出节点名称

    我在张量流相机演示中使用自定义模型进行分类 我生成了一个 pb 文件 序列化的 protobuf 文件 我可以显示它包含的巨大图表 将此图转换为优化图 如 中给出https www oreilly com learning tensorfl
  • 在 py.test 中的每个测试之前和之后运行代码?

    我想在测试套件中的每个测试之前和之后运行额外的设置和拆卸检查 我看过固定装置 但不确定它们是否是正确的方法 我需要在每次测试之前运行设置代码 并且需要在每次测试后运行拆卸检查 我的用例是检查未正确清理的代码 它会留下临时文件 在我的设置中
  • 使用 pytest-django 进行测试期间,Django 连接对象看不到第二个数据库的表

    底线 在使用 pytest django 进行测试期间 我的 Django 连接对象看不到第二个数据库的表关系 概述 我有一个问题 我的 Django 连接对象似乎获取了错误的数据库信息 当我查询 客户 数据库中的表时 我偶然发现了这个问题
  • 测试 post 请求时 Django 消息中间件问题

    我正在尝试测试一个 UpdateView 它将一条消息添加到重定向的成功页面 看来我的问题来自messages因为 pytest 返回 django contrib messages api MessageFailure 如果不安装 dja
  • 如何使用 pytest-mock 或 magicmock 模拟导入的对象

    我正在尝试理解mock monkeypatch pytest mock能力 让我知道这是否可能 如果没有 请建议我如何测试此代码 我的代码结构 app init py some module1 init py some module2 in
  • 保存终端 Bazel 构建输出

    是否可以保存在终端中运行的 bazel build 命令的输出 命令是 bazel build tensorflow examples image retraining label image bazel bin tensorflow ex
  • 如何使用 pytest 对 python datetime.datetime.now 进行猴子补丁?

    我需要测试使用的函数datetime datetime now 做到这一点最简单的方法是什么 您需要 Monkeypatch datetime now 函数 在下面的示例中 我正在创建可以稍后在其他测试中重复使用的夹具 import dat
  • 如何为异步流服务器编写 pytest 夹具?

    我一直在尝试学习 asyncio 但找不到任何创建可用于测试服务器代码的 pytest 夹具的示例 一旦服务器启动 我猜它会阻止其他一切 因此测试永远不会运行 pytest asyncio 是否有办法在单独的线程中运行固定装置或其他东西 还
  • pytest 无法导入模块,而 python 可以

    我正在用 Python 开发一个包 我使用虚拟环境 我在 virtualenv 的 pth 路径中设置了模块根目录的路径 这样我就可以在开发代码时导入包的模块并进行测试 问题 1 这是一个好方法吗 这工作正常 这是一个例子 这是我想要的行为
  • Selenium 登录测试不接受 pytest 设备登录或拒绝连接

    我变得绝望 因为我似乎找不到一个我认为每个人都会使用的解决方案 我想使用 selenium 和 pytest 以及 live server url 来测试简单的登录 根据 pytest django 文档 一个简单的固定装置称为live s
  • 使用conftest.py 与从专用模块导入装置

    我最近开始熟悉 pytest 以及如何使用conftest py定义在我的测试中自动发现和导入的装置 我很清楚如何conftest py工作原理以及如何使用它 但我不确定为什么这在某些基本场景中被认为是最佳实践 假设我的测试是这样构建的 t
  • 将自定义文件夹添加到 bazel java 测试中的类路径

    我正在尝试将大型代码库从 Maven 迁移到 bazel 我发现一些测试写入target classes and target test classes并且生产代码将其读取为类路径上的资源 这是因为 maven Surefire fails
  • pytest - ModuleNotFoundError - python 3.6.4

    我有一个具有以下布局的项目 MANIFEST in README md init py company init py api init py auth py debug py exceptions py reporting py rest
  • 模拟导入失败

    我该如何制作import pkg失败moduleA py 我可以打补丁pkg如果从中导入某些内容则会失败 否则不会失败 test py import os import moduleA from unittest mock import p
  • 在参数化中传递 pytest 夹具

    通过在 pytest mark parametrize 中传递 conftest py 中定义的装置 我收到以下错误 pytest alist 0220 0221 test 1 py v s NameError name alist is
  • Bazel:为 cc_binary/cc_test 设置运行时环境变量和配置文件位置

    我正在尝试在 Linux 上的 C 应用程序中使用 odbc 以下构建文件用于将库作为外部依赖项包含在内 licenses notice cc library name lib srcs lib libodbc so lib64 libod
  • pytest 在导入时找不到模块,但代码运行良好

    目标是为使用 Cython 的 Python3 项目使用 pytest 单元测试框架 这不是即插即用的事情 因为默认情况下 pytest 无法导入 Cython 模块 也就是说 从 Cython pyx 模块导入时出现以下错误 在我的例子中
  • 如何将 pytest 装置与 django TestCase 一起使用

    我如何在TestCase方法 类似问题的几个答案似乎暗示我的例子应该有效 import pytest from django test import TestCase from myapp models import Category py

随机推荐