我对tox
、py.test
、coverage
和pytest-cov
有一个奇怪的问题:当从tox
启动带有--cov
选项的py.test
时,似乎需要tests
文件夹中的__init__.py
文件,这一点并不明显。
在写这篇文章的时候,我添加了前面提到的tests/__init__.py
,已经解决了最初的问题,但到目前为止,我还不完全理解为什么它确实有效或无效,所以我仍然在寻求帮助。请参阅下面的详细信息。
我在SO上发现了一个相关的问题,但这只会让它更加令人困惑,因为答案似乎与我迄今为止的想法相反:`py.test`和`__init__.py`文件
另请参阅此处的官方文档:py.test-良好集成实践(页面底部)。
简化的项目结构:
setup.py
tox.ini
.coveragerc
project/
__init__.py
module1.py
module2.py
tests/
__init__.py (optional, an empty file)
test_module1.py
test_module2.py
tox.ini
:的相关部分
[testenv:check]
commands = py.test --cov=project --cov-report=term
deps =
pytest
coverage
pytest-cov
[pytest]
python_files = test_*.py
norecursedirs = .tox
.coveragerc
:的相关部分
[run]
branch = True
omit = project/tests/*
现在,结果:
- 从项目根目录运行
py.test --cov=project --cov-report=term
=>无论是否存在tests/__init__.py
文件,都要更正覆盖率 - 没有
tests/__init__.py
的tox -e check
=>测试被发现并运行,但我收到警告"Coverage.py warning:No data was collected.",所有模块的覆盖率为0% tox -e check
与tests/__init__.py
=>再次校正覆盖范围
我不清楚为什么tests/__init__.py
文件必须在那里(添加这个空文件解决了最初的问题)才能运行tox
,但手动运行测试/覆盖率并不重要。有什么想法吗?
在tox.ini中使用--cov {envsitepackagesdir}/<your-package-name>
。
请参阅:在覆盖范围内使用py.test;不包括进口
我不再使用pytest-cov
,而是直接运行coverage
。。
还注意到,对于pytest
,我确实需要测试目录中的空白__init__.py
才能正常工作。这可能是有原因的。
我知道这是几年前的事了,但万一其他人遇到这个。。