运行nose --with-coverage来获取所有包文件,但不包含其他依赖项和库

时间:2013-09-06 21:42:21

标签: python nose nosetests

我的项目文件夹(是的 - 我知道这是最佳做法)类似于:

.
├── app.py
├── otherscript.py
├── tests/
└── tools/
    ├── __init__.py
    └── toolfile.py

我需要nose --with-coverage来测试主文件夹.py文件夹中的tools脚本,并排除tests文件夹(尽管我并不关心将其排除在外) )

当我运行基本

nose --with-coverage

我了解所有已安装的依赖项和库(烧瓶,请求等)

当我跑

nose --with-coverage --cover-package=folder name (or . or ./)

我获得了测试文件夹的覆盖范围。 tools/__init__.py文件和app.py但不包括其他脚本:

> (opentaba-server) D:\username\pathto\opentaba-server>nosetests --with-coverage -- cover-package=./ ... Name                                      

> Stmts   Miss  Cover   Missing
> ----------------------------------------------------------------------- Tests\functional_tests\test_return_json      26      0   100%
> Tests\unit_test\test_createdb                 0      0   100%
> Tests\unit_test\test_scrape                   0      0   100% app     
> 63     15    76%   22, 24, 72-81, 8 8-106, 133 tools\__init__         
> 0      0   100%
> ----------------------------------------------------------------------- TOTAL                                        89     15    83%
> ---------------------------------------------------------------------- Ran 3 tests in 5.182s OK

当我使用--cover-inclusive flag时。它只是失败了:

nosetests-scripts.py: error: no such option: --with-coverage

我很乐意为此提供任何帮助

3 个答案:

答案 0 :(得分:12)

我对生成的代码有一个非常类似的问题。解决方案是仅从报告中排除生成的代码或工具代码。

所以我们现在使用nosetests来运行我们的测试,比如

nosetests --with-coverage --cover-inclusive --cover-package=$(PACKAGE)

之后,我们手动创建报告,所以

coverage combine
coverage report --omit 'tools/*'

因此,coverage.py将涵盖您的工具包,但它们不会出现在报告中。

答案 1 :(得分:5)

我的 tests / nose_setup_coverage.cfg 文件:

[nosetests]
verbosity=1
detailed-errors=1

with-coverage=1
cover-html=1
cover-html-dir=../../out/cover

#this is the line that fixed my equivalent of your issue
#by "climbing up" from tests/ but skipping python's **site-packages**
cover-package=..   

where=/Users/jluc/kds2/py/tests

添加cover-package=..(在cfg文件中)并在tests目录中执行,让我覆盖了所有的python目录,但不包括django和其他第三方的东西。

这是我的目录结构(减去一些非Python的东西):

.
├── lib
├── non_app
├── ps_catalog
├── pssecurity
├── pssystem
├── static
├── static_src
├── staticfiles
├── templates
├── tests
└── websec

最后,虽然它似乎没有记录,但是从nosetests运行的覆盖范围将在当前(测试)目录中选择并使用 .coveragerc 文件(你无法通过它命令行或在鼻子cfg文件中,这是封面插件)。

在该文件中,省略部分允许您更好地控制要排除的目录:

omit=/Users/jluc/kds2/env/lib/python2.7/*
     */batch/*
     /Users/jluc/kds2/py/non_app/*
     */migrations/*

在bash中执行测试:

nosetests -c nose_setup_coverage.cfg

P.S。将--cover-erase添加到上面,重置覆盖

答案 2 :(得分:1)

默认情况下,测试不会包含在覆盖率报告中。您可以使用--cover-tests

让它们显示(实际上是一个非常好的主意,以确保您的测试正确执行,并且没有重复的名称测试被忽略)

无论如何,nosetests --help是你的朋友。最有可能--cover-inclusive标记终止覆盖插件,其他选项(对于插件)变得不可用。您可以尝试通过pdb启动鼻子来调试它。

作为替代方案,您可以将覆盖作为独立模块启动鼻子测试。