[英]Tox 0% coverage
我有一個 python 項目,我在其中使用:
還有很多。
基本上,我想將tox
添加到我的 gitlab 管道中。 幾乎一切似乎都能正常工作,從 tox 調用mypy
、 flake8
或black
工作正常。 但是當我在啟用覆蓋的情況下調用tox -e py37
(所以我想運行測試)時,測試運行了,我可以看到它們的結果,但是覆蓋率為0%
( 100%
僅在空的__init__
文件等上)並且我收到警告: Coverage.py warning: No data was collected. (no-data-collected)
Coverage.py warning: No data was collected. (no-data-collected)
。
這是我的 tox.ini 的tox.ini
相關部分:
[tox]
envlist = flake8,mypy,black,py37
[testenv]
extras = tests
commands=
pytest --cov -ra --tb=short {posargs}
這是我的.coveragerc
:
[run]
branch = True
source =
foo
omit =
foo/__init__.py
foo/__main__.py
foo/bar/__init__.py
foo/baz/__init__.py
[report]
exclude_lines =
pragma: no cover
if __name__ == .__main__.
show_missing = True
我有一個有效的setup.py
,其中包括所有需要的包: pytest
、 pytest-cov
以及更多樣式等(有效)。 我的tests
文件夾中也有__init__.py
。
有趣的是,如果我從命令行(在tox.ini
中)調用pipenv
中的相同命令: pytest --cov -ra --tb=short
,我會得到相同的結果,但覆蓋范圍正常(在我的例子中它是100%
)。
有辦法解決嗎? 我不希望我的管道顯示錯誤的覆蓋范圍 + 即使它們以某種方式神奇地得到正確的覆蓋范圍,我仍然希望在本地看到它。
PS 當我試圖解決我用tox --sitepackages -e py37
調用 tox 的問題時,我遇到了一些錯誤,例如test command found but not in testenv
。 除了這些錯誤之外,我當時的報道還不錯。 但是后來我從我的全局 pip 寄存器中卸載了tox
、 pytest
和pytest-cov
現在無論有沒有--sitepackages
標志我仍然得到0%
的覆蓋率
根本原因是pytest
在運行tox
期間使用已安裝的源(在站點包下),而覆蓋率報告者計算工作目錄中的命中文件(即您的本地 git 存儲庫)。
解決方案
將 tox 的 virtual-env 路徑添加到覆蓋范圍:
[testenv]
pytest --cov={envsitepackagesdir}/foo
有關更多詳細信息,請閱讀virtualenv 相關部分的替換
解決方法
將PYTHONPATH
設置為工作目錄(即export PYTHONPATH=.
)。 請注意,您需要通過以下方式將PYTHONPATH
傳遞給tox
:
[testenv]
passenv =
PYTHONPATH
這很簡單,但是使用這種方式,您不需要測試安裝,因為測試在工作目錄中的文件上運行。
在 tox.ini 中使用usedevelop=True
:
[testenv]
usedevelop=True
pytest --cov=foo
這導致與@zvi-baratz 的解決方案相同的行為,但不那么駭人聽聞。
此處唯一需要注意的是,如果 package 具有自定義install_command
,則無法使用此解決方案。 請參閱文檔以獲取更多信息。
如果是這種情況,您可以使用--cov={envsitepackagesdir}/foo
作為解決方法。
envsitepackagesdir
?因為它會導致覆蓋率報告具有更長的路徑,這些路徑指向由 tox 創建的 python 環境中的文件,而不是實際的項目路徑。
基於@betontalpfa 的回答,我認為另一種可能的解決方案(在我的用例中似乎效果很好)是修改tox.ini
以包括:
[testenv]
deps = -e .
...
AFAIK,通過使用 pip 的可編輯模式在工作目錄中安裝 package,您可以測試已安裝的 package 並避免文件路徑不匹配導致 0% 覆蓋率得分。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.