28

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

.
├── 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

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

4

3 回答 3

14

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

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

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

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

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

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

于 2014-12-08T09:09:14.630 回答
7

我的测试/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 文件中)并从测试目录中执行让我覆盖了我所有的 python 目录,但不包括 django 和其他 3rd 方的东西。

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

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

最后,虽然它似乎没有记录,但从nosetests 运行的覆盖率将选择并使用当前(测试)目录中的.coveragerc文件(您不能通过命令行或nose cfg 文件传递​​它,这是为了封面插件)。

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

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

在 bash 中执行测试:

nosetests -c nose_setup_coverage.cfg

ps 添加--cover-erase到上述内容,重置覆盖范围

编辑,FWIW:

我通常用pytest作为测试运行器替换了nose/nose2 。如果您不引入高级 pytest 功能,它可以与普通的旧单元测试一起正常工作,并且有更多的插件、支持和积极的开发。这不是为了贬低鼻子,也不是为了推广 pytest,而只是说如果你反复用鼻子碰到边缘情况,这是一种替代方案。

于 2017-06-13T19:42:23.383 回答
1

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

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

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

于 2013-09-16T22:55:15.980 回答