使py.test,coverage和tox一起工作:__ init__.py在tests文件夹中?

时间:2013-11-29 20:30:08

标签: python code-coverage pytest coverage.py tox

toxpy.testcoveragepytest-cov我遇到了一个奇怪的问题:当py.test选项--cov时从tox启动,似乎需要__init__.py文件夹中的tests文件,这个文件并不是很明显。

在撰写这篇文章时,我有点通过添加上述tests/__init__.py来解决最初的问题,但到目前为止我还不完全理解为什么它确实有效或无效,所以我是仍在寻求帮助。请参阅下面的详细信息。

我在SO上找到了一个相关的问题,但它只会让它更加混乱,因为答案似乎与我到目前为止的想法相反: `py.test` and `__init__.py` files

另请参阅此处的官方文档:py.test - Good Integration Practices(页面底部)。


简化的项目结构:

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从项目root =>运行正确覆盖是否存在tests/__init__.py文件。
  • tox -e check没有tests/__init__.py =>发现并运行测试,但我收到警告“Coverage.py警告:没有收集数据。”并且所有模块的覆盖率为0%
  • tox -e check tests/__init__.py =>再次正确覆盖。

对我来说,为tests/__init__.py运行tox文件必须存在(添加此空文件解决了初始问题)并不是很明显,但是当你运行它时无关紧要手动测试/覆盖。有什么想法吗?

感谢。

2 个答案:

答案 0 :(得分:39)

在tox.ini中使用--cov {envsitepackagesdir}/<your-package-name>

答案 1 :(得分:4)

请参阅: Using py.test with coverage doesn't include imports

我摆脱了使用pytest-cov并直接运行覆盖..

还注意到pytest,我确实需要在我的测试目录中使用空白<​​strong> init .py才能正常运行。可能是某种原因。

我意识到这已经有几年了,但万一其他人遇到这个......