gpt4 book ai didi

python-3.x - 多个 python 版本的 tox 覆盖范围

转载 作者:行者123 更新时间:2023-12-04 17:45:20 24 4
gpt4 key购买 nike

这是一个 link到一个项目和输出,您可以使用它来重现我在下面描述的问题。

我正在使用 覆盖范围毒性 针对多个版本的python。我的 tox.ini 文件看起来像这样:

[tox]
envlist =
py27
py34

[testenv]
deps =
coverage

commands =
coverage run --source=modules/ -m pytest
coverage report -m

我的问题是覆盖率将只使用一个版本的 python(在我的例子中是 py27),而不是 py27 和 py34。每当我执行依赖于 python 版本的代码时,这就是一个问题,例如:
def add(a, b):
import sys
if sys.version.startswith('2.7'):
print('2.7')
if sys.version.startswith('3'):
print('3')
return a + b

针对上述代码运行覆盖率将错误地报告 py27 和 py34 的第 6 行(“print('3')”)“缺失”。它应该只为 py34 丢失。

我知道为什么会发生这种情况:coverage 安装在我的基本操作系统(使用 python2.7)上。因此,当 毒性 运行时,它注意到coverage 已经安装并从基本操作系统继承coverage,而不是将其安装在它创建的virtualenv 中。

这对 py27 来说很好,但会导致 py34 的覆盖率报告中的结果不正确。我有一个临时的临时解决方法:我需要一个稍早版本的覆盖范围(相对于安装在我的基本操作系统上的版本),以便 tox 将被迫在 virtualenv 中安装一个单独的覆盖范围副本。例如。
[testenv]
deps =
coverage==4.0.2
pytest==2.9.0
py==1.4.30

我不喜欢这种解决方法,但它是我目前找到的最好的方法。关于强制 tox 在其 virtualenv 中安装当前版本的覆盖范围的任何建议,即使我已经在我的基本操作系统上安装了它?

最佳答案

我今天遇到了这个问题,但找不到简单的答案。所以,为了将来引用,这是我想出的解决方案。

  • 创建 envlist包含将要测试的每个 Python 版本和一个自定义环境 cov .
  • 对于所有版本的 Python,设置 COVERAGE_FILE用于存储 .coverage 的环境变量文件在 {envdir} .
  • 对于 cov env 我使用两个命令。
  • coverage combine结合报告和
  • coverage html生成报告,如有必要,测试失败。
  • 创建一个 .coveragerc包含 [paths] 的文件部分列出 source=地点。
  • 第一行是找到实际源代码的地方。
  • 后续行是将被“coverage combine”消除的子路径。

  • tox.ini:
    [tox]
    envlist=py27,py36,py35,py34,py33,cov

    [testenv]
    deps=
    pytest
    pytest-cov
    pytest-xdist
    setenv=
    py{27,36,35,34,33}: COVERAGE_FILE={envdir}/.coverage
    commands=
    py{27,36,35,34,33}: python -m pytest --cov=my_project --cov-report=term-missing --no-cov-on-fail
    cov: /usr/bin/env bash -c '{envpython} -m coverage combine {toxworkdir}/py*/.coverage'
    cov: coverage html --fail-under=85

    .coveragerc:
    [paths]
    source=
    src/
    .tox/py*/lib/python*/site-packages/

    配置中最奇特的部分是调用 coverage combine .这是命令的分割:
  • tox不处理 Shell 扩展 {toxworkdir}/py*/.coverage ,所以我们需要调用一个 shell ( bash -c ) 来获得必要的扩展。
  • 如果有人倾向于,您可以单独输入所有路径而不是跳过所有这些箍,但这会增加维护和.coverage每个文件的依赖关系 pyNN环境
  • /usr/bin/env bash -c '...'以确保我们获得正确版本的 bash .使用到 env 的完整路径避免设置whitelist_externals的需要.
  • '{envpython} -m coverage ...'确保我们调用正确的 pythoncoveragecov环境
  • 注意:此解决方案的不幸问题是 cov env 依赖于 py{27,36,35,34,33} 的调用这有一些不太理想的副作用。
  • 我的建议是只调用 cov通过 tox .
  • 从不调用 tox -ecov因为,要么
  • 由于缺少 .coverage,它可能会失败文件,或
  • 它可能会产生奇怪的结果(结合不同的测试)。
  • 如果您必须将其作为子集( tox -epy27,py36,cov )调用,则清除 .tox目录优先( rm -rf .tox )以避免丢失 .coverage文件问题。
  • 关于python-3.x - 多个 python 版本的 tox 覆盖范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36610806/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com