下面是一個link項目和輸出,您可以使用它來重現我在下面描述的問題。多個python版本的tox覆蓋率
我正在使用覆蓋範圍與tox針對多個版本的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
運行覆蓋對上面的代碼會錯誤地報告線6(「打印(‘3’)」)的「失蹤」 py27和py34。它應該只是py34的缺失。
我知道這是爲什麼發生:覆蓋範圍安裝在我的基本操作系統(它使用python2.7)。因此,運行tox時,它注意到覆蓋範圍已經安裝並繼承了基本操作系統的覆蓋範圍,而不是將其安裝在它創建的virtualenv中。
這對於py27來說很好,並且很好看,但是會在py34的覆蓋率報告中導致不正確的結果。我有一個冒險的臨時解決方法:我需要稍微早一點的覆蓋範圍(相對於我的基本操作系統上安裝的版本),以便tox將被迫在virtualenv中安裝單獨的覆蓋副本。例如。
[testenv]
deps =
coverage==4.0.2
pytest==2.9.0
py==1.4.30
我不喜歡這個解決方法,但這是我現在發現的最好的。任何建議強制tox將其當前版本的覆蓋率安裝到其virtualenv中,即使我已經在我的基本操作系統上安裝了它。
我不能重現此:覆蓋範圍是告訴我它丟失了py27 ENV線8條,第6行的py35 ENV。我安裝了一個全局的'coverage'命令(一個Python 3.5腳本)。唯一的區別是我添加了'pytest'作爲額外的依賴項,否則我得到一個'InvocationError'(我沒有安裝全局的'pytest'命令)。 – Evert
謝謝你的嘗試。我已經上傳了**應該能夠重現此問題的代碼以及運行tox(和其他工具)的輸出以幫助進行調試。此內容位於[此處](https://drive.google.com/open?id=0B0bHr4crS9cpaWlockpxcmJxelE)。我在OS X 10.11.4上運行這個。只需在「test_project」目錄中運行「tox」,並且(手指交叉),您應該看到與我的結果類似的結果。 – user3188632
奇怪的是,Tox virtualenv默認不應該繼承網站包。檢查Tox ['sitepackages'](http://crospeak.net/tox/config.html#confval-sitepackages=True|False)選項,也許它設置在某個地方。或者,也許你有一些非常古老的virtualenv(IIRC古代版本需要顯式地指定「--no-site-packages」)? – drdaeman