这是一个项目和输出的链接,您可以使用它来重现我在下面描述的问题。
我正在对多个版本的 python使用tox覆盖。我的 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
针对上述代码运行覆盖将错误地报告第 6 行(“print('3')”)对于 py27 和 py34 都是“缺失”的。它应该只适用于 py34。
我知道为什么会这样:覆盖安装在我的基本操作系统(使用 python2.7)上。因此,当tox运行时,它会注意到已经安装了 coverage,并从基本操作系统继承了 coverage,而不是将其安装在它创建的 virtualenv 中。
这对于 py27 来说很好,但会导致 py34 的覆盖率报告中的结果不正确。我有一个临时的解决方法:我需要一个稍早版本的覆盖(相对于安装在我的基本操作系统上的那个),这样 tox 将被迫在 virtualenv 中安装一个单独的覆盖副本。例如
[testenv]
deps =
coverage==4.0.2
pytest==2.9.0
py==1.4.30
我不喜欢这种解决方法,但它是我目前找到的最好的。关于强制 tox 在其 virtualenv 中安装当前版本的覆盖率的任何建议,即使我已经在我的基本操作系统上安装了它?