这是项目和输出的链接,可用于重现我在下面描述的问题。
我使用的覆盖面与TOX对蟒蛇的多个版本。我的tox.ini文件看起来像这样:
[tox]
envlist =
py27
py34
[testenv]
deps =
coverage
commands =
coverage run --source=modules/ -m pytest
coverage report -m
Run Code Online (Sandbox Code Playgroud)
我的问题是,覆盖范围只能使用一个版本的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
Run Code Online (Sandbox Code Playgroud)
针对上述代码运行覆盖率将错误地报告py27和py34的第6行(“ print('3')”)为“缺少”。对于py34,应该只缺少此字符。
我知道为什么会这样:覆盖已安装在我的基本操作系统(使用python2.7)上。因此,在运行Tox时,它会注意到Coverage已安装,并且从基本OS继承了Coverage,而不是将其安装在它创建的virtualenv中。
对于py27,这很好而且很花哨,但在py34的覆盖率报告中导致错误的结果。我有一个临时的变通办法:我需要一个较早版本的coverage(相对于基本OS上安装的版本),以便Tox将被迫在virtualenv中安装一份单独的coverage副本。例如
[testenv]
deps =
coverage==4.0.2
pytest==2.9.0
py==1.4.30
Run Code Online (Sandbox Code Playgroud)
我不喜欢这种解决方法,但这是我目前发现的最好方法。关于强制tox在virtualenv中安装当前版本的Coverage的任何建议,即使我已经在基本OS上安装它了吗?