我在Django网站上运行简单的鼻子测试(代码可用here) . 根据CLI命令的发布顺序,我会得到截然不同的结果!
看看很多帖子,它似乎与覆盖开始时的加载过程有关 . 我不明白的是:
-
为什么两种方法之间错过的陈述如此不同?
-
如果我一个接一个地运行一个方法,为什么覆盖率会上升?
我专注于 minerals/views.py
的报道
Django settings.py
文件包含配置信息:
# Use nose to run all tests
TEST_RUNNER = 'django_nose.NoseTestSuiteRunner'
# Nose will measure coverage on the folllowing apps
NOSE_ARGS = [
'--with-coverage',
'--cover-package=minerals',
'--cover-html',
]
我使用virtualenv需求文件运行Ubuntu 14.04LTS,使用Python 3.5.1:
coverage==4.1
Django==1.9.6
django-debug-toolbar==1.4
django-nose==1.4.3
nose==1.3.7
sqlparse==0.1.19
运行测试方法1:
当我使用 coverage run --source '.' manage.py test minerals
运行测试时, minerals/views.py
是 missing statements: 12-13, 18-49 .
$ coverage run --source '.' manage.py test minerals
nosetests minerals --with-coverage --cover-package=minerals --cover-html --verbosity=1
Creating test database for alias 'default'...
..
Name Stmts Miss Cover
--------------------------------------------------------------------
[...]
minerals/views.py 18 8 56%
--------------------------------------------------------------------
TOTAL 73 48 34%
----------------------------------------------------------------------
Ran 2 tests in 0.809s
注意:是的,由于某些未知原因,上述运行与下面报告之间的错过报表数量会发生变化 .
完整报道 report -m
(来自文件 report_source
):
Name Stmts Miss Cover Missing
---------------------------------------------------------------------------
manage.py 6 0 100%
mineral_catalog/__init__.py 0 0 100%
mineral_catalog/settings.py 21 0 100%
mineral_catalog/urls.py 6 0 100%
mineral_catalog/views.py 4 1 75% 6
mineral_catalog/wsgi.py 4 4 0% 10-16
minerals/__init__.py 0 0 100%
minerals/admin.py 3 0 100%
minerals/apps.py 3 3 0% 1-5
minerals/migrations/0001_initial.py 6 6 0% 3-15
minerals/migrations/0002_auto_20160608_1153.py 5 5 0% 3-14
minerals/migrations/__init__.py 0 0 100%
minerals/models.py 24 1 96% 30
minerals/templatetags/__init__.py 0 0 100%
minerals/templatetags/mineral_extras.py 12 6 50% 13-16, 22-23
minerals/tests.py 20 20 0% 1-31
minerals/urls.py 5 0 100%
minerals/views.py 18 11 39% 12-13, 18-49
------------------------------------------------------------------------------
TOTAL 137 57 58%
运行测试方法2:
如果我使用 ./manage.py test minerals
运行测试,那么 minerals/views.py
是 missing statements 1-10, 16, 42 .
$ ./manage.py test minerals
nosetests minerals --with-coverage --cover-package=minerals --cover-html --verbosity=1
Creating test database for alias 'default'...
..
Name Stmts Miss Cover
--------------------------------------------------------------------
[...]
minerals/views.py 18 8 56%
--------------------------------------------------------------------
TOTAL 73 48 34%
----------------------------------------------------------------------
Ran 2 tests in 0.818s
完整报道 report -m
(来自文件 report_manage
):
Name Stmts Miss Cover Missing
------------------------------------------------------------------------------
minerals/__init__.py 0 0 100%
minerals/admin.py 3 3 0% 1-6
minerals/apps.py 3 3 0% 1-5
minerals/migrations/0001_initial.py 6 0 100%
minerals/migrations/0002_auto_20160608_1153.py 5 0 100%
minerals/migrations/__init__.py 0 0 100%
minerals/models.py 24 24 0% 1-30
minerals/templatetags/__init__.py 0 0 100%
minerals/templatetags/mineral_extras.py 12 8 33% 1-10, 19-23
minerals/tests.py 20 0 100%
minerals/urls.py 5 5 0% 1-10
minerals/views.py 18 8 56% 1-10, 16, 42
------------------------------------------------------------------------------
TOTAL 96 51 47%
运行测试方法3:
如果我在测试运行之间删除 cover/
目录和 .coverage
文件,则上述方法1和2每次都会产生相同的结果 . 但是,如果我运行方法1,然后运行方法2(从方法1中保留 cover/
dir和 .coverage
),我会得到很多不同的结果 . minerals/views.py
仅为 missing statement 42 .
$ ./manage.py test minerals
nosetests minerals --with-coverage --cover-package=minerals --cover-html --verbosity=1
Creating test database for alias 'default'...
..
Name Stmts Miss Cover
--------------------------------------------------------------------
[...]
minerals/views.py 18 1 94%
--------------------------------------------------------------------
TOTAL 73 4 95%
----------------------------------------------------------------------
Ran 2 tests in 0.788s
完整报道 report -m
(来自档案 report_sourceTHENmanage
):
Name Stmts Miss Cover Missing
------------------------------------------------------------------------------
manage.py 6 0 100%
mineral_catalog/__init__.py 0 0 100%
mineral_catalog/settings.py 21 0 100%
mineral_catalog/urls.py 6 0 100%
mineral_catalog/views.py 4 1 75% 6
mineral_catalog/wsgi.py 4 4 0% 10-16
minerals/__init__.py 0 0 100%
minerals/admin.py 3 0 100%
minerals/apps.py 3 3 0% 1-5
minerals/migrations/0001_initial.py 6 0 100%
minerals/migrations/0002_auto_20160608_1153.py 5 0 100%
minerals/migrations/__init__.py 0 0 100%
minerals/models.py 24 1 96% 30
minerals/templatetags/__init__.py 0 0 100%
minerals/templatetags/mineral_extras.py 12 2 83% 22-23
minerals/tests.py 20 0 100%
minerals/urls.py 5 0 100%
minerals/views.py 18 1 94% 42
------------------------------------------------------------------------------
TOTAL 137 12 91%
我不确定如何从这一点开始 . 我希望能够使用单个CLI命令获得一致的结果 .
如果有更多信息需要提供帮助调试,请告诉我!
Update:
尝试使用 py.test
,我可以使用以下方法获得单行覆盖:
$ coverage run --source minerals -m py.test minerals/tests.py
============================================ test session starts =============================================
platform linux -- Python 3.5.1, pytest-2.9.2, py-1.4.31, pluggy-0.3.1
django settings: mineral_catalog.settings (from ini file)
rootdir: [...]/mineral_catalog, inifile: pytest.ini
plugins: django-2.9.1
collected 2 items
minerals/tests.py ..
========================================= 2 passed in 10.88 seconds ==========================================
$ coverage report -m
Name Stmts Miss Cover Missing
------------------------------------------------------------------------------
minerals/__init__.py 0 0 100%
minerals/admin.py 3 0 100%
minerals/apps.py 3 3 0% 1-5
minerals/migrations/0001_initial.py 6 0 100%
minerals/migrations/0002_auto_20160608_1153.py 5 0 100%
minerals/migrations/__init__.py 0 0 100%
minerals/models.py 24 1 96% 30
minerals/templatetags/__init__.py 0 0 100%
minerals/templatetags/mineral_extras.py 12 2 83% 22-23
minerals/tests.py 20 0 100%
minerals/urls.py 5 0 100%
minerals/views.py 18 1 94% 42
TOTAL 96 7 93%