如果py.test从另一个目录执行它,则coverage.py不包括脚本

时间:2013-09-02 12:39:35

标签: python pytest coverage.py

我有一个python脚本,它接受命令行参数,使用一些文件。 我正在编写成功的测试py.test将此脚本放在其脚本中,并使用subprocess.call执行它。

现在我想用coverage.py分析代码覆盖率。 覆盖范围,当通过pytest-cov插件(内置子进程处理)使用时,在从使用{{创建的临时测试目录调用时> 时看不到/覆盖我的脚本 1}} py.test夹具。 覆盖确实看到我的脚本在它所在的目录中被调用(并且filename参数指向一个远程路径)。

在这两种情况下,我的测试通过!覆盖范围3.6,pytest-2.3.5,pytest-cov 1.6,全部来自PyPi。

问题:即使在另一个目录中执行脚本,如何识别我的脚本?这是覆盖范围内的错误,还是一些无法做到的事情?毕竟,tmpdir是py.test的库存机制......后面会感到惊讶。

最小例子:

我得到了一个脚本tmpdir,它只是回显了通过命令行参数提供的文件my_script.py的内容。在两个不同的测试中,一次在arg_file.txt中调用,一次在脚本的位置调用。两个测试都通过了,但是在tmpdir测试中,我没有得到任何覆盖信息!

试运行:

tmpdir

覆盖范围:

~/pytest_experiment$ py.test -s
=================================== test session starts ====================================
platform linux2 -- Python 2.7.4 -- pytest-2.3.5
plugins: cov
collected 2 items 

tests/test_in_scriptdir.py 
set_up: In directory /tmp/pytest-52/test_10
Running in directory /home/cbuchner/pytest_experiment
Command: ./my_script.py /tmp/pytest-52/test_10/arg_file.txt
--Contents of arg_file.txt--

.
tests/test_in_tmpdir.py 
set_up: In directory /tmp/pytest-52/test_11
Running in directory /tmp/pytest-52/test_11
Command: /home/cbuchner/pytest_experiment/my_script.py arg_file.txt
--Contents of arg_file.txt--

.

================================= 2 passed in 0.06 seconds =================================

文件在这里:https://gist.github.com/bilderbuchi/6412754

编辑:在使用~/pytest_experiment$ py.test --cov=my_script.py tests/test_in_scriptdir.py=================================== test session starts ==================================== platform linux2 -- Python 2.7.4 -- pytest-2.3.5 plugins: cov collected 1 items tests/test_in_scriptdir.py . --------------------- coverage: platform linux2, python 2.7.4-final-0 ---------------------- Name Stmts Miss Cover ------------------------------- my_script 3 0 100% ================================= 1 passed in 0.09 seconds ================================= ~/pytest_experiment$ py.test --cov=my_script.py tests/test_in_tmpdir.py=================================== test session starts ==================================== platform linux2 -- Python 2.7.4 -- pytest-2.3.5 plugins: cov collected 1 items tests/test_in_tmpdir.py .Coverage.py warning: No data was collected. --------------------- coverage: platform linux2, python 2.7.4-final-0 ---------------------- Name Stmts Miss Cover --------------------------- ================================= 1 passed in 0.09 seconds ================================= 运行覆盖率测试时,间隔性地,还有更好奇的输出 - 覆盖范围警告-s,显然已收集,并且No data was collected测试警告tmpdir ??

Module my_script.py was never imported.

4 个答案:

答案 0 :(得分:15)

我在调用" py.test --cov ..."时遇到了同样的问题。来自tox。我在这个页面上找到了一个提示:http://blog.ionelmc.ro/2014/05/25/python-packaging/即使它没有明确提到这一点。使用" - 开发" for tox将确保从覆盖率分析的同一目录中调用覆盖数据收集。 tox.ini 中的这一部分让我有一个覆盖测试环境:

[tox]
envlist = ...,py34,cov

[testenv:cov]
# necessary to make cov find the .coverage file
# see http://blog.ionelmc.ro/2014/05/25/python-packaging/
usedevelop = true
commands = py.test --cov=<MODULE_NAME>
deps = pytest pytest-cov

答案 1 :(得分:6)

当从另一个目录运行测量脚本时,这就是相对路径混淆覆盖的问题。覆盖率结果文件最终在该目录中,而不是项目的根目录。

要解决此问题,我停止使用pytest-cov,并使用纯coverage代替。我使用完整路径而不是相关路径。

所以,例如 定义通过export COVERAGE_PROCESS_START=/full/path/to/.coveragerc启用子进程覆盖所需的环境变量。 在.coveragerc中,覆盖结果文件通过

指定
     [run]
     data_file = /full/path/to/.coverage

并且任何--source--include选项也应使用完整路径。 然后就可以得到正确的覆盖率测量。

答案 2 :(得分:0)

tox的另一个选项是在PYTHONPATH中设置tox.ini

[testenv] setenv = PYTHONPATH = {toxinidir} commands = pytest --cov=<your package> - codecov

答案 3 :(得分:0)

根据此博客: https://thomas-cokelaer.info/blog/2017/01/pytest-cov-collects-no-data-on-travis/

您应该将所有__init__.py文件添加到tests文件夹中!此解决方案对我有用。