Django 休息框架的覆盖率错误报告
Coverage wrongly reports for Django rest framework
我尝试使用 Django Rest Framework 创建简单的 api 并使用书中的结构 Two Scopes of Django 3.x
。我尝试创建简单的测试和覆盖率报告,几乎 100% 覆盖我应用程序中的所有 python 来源。即使我完全删除该测试。我尝试了 pytest、nose 和我在这里找到的任何东西,结果仍然相同。
我的项目结构如下:
.
├── api
│ ├── apps.py
│ ├── __init__.py
│ ├── urls.py
│ └── v1
│ ├── admin.py
│ ├── __init__.py
│ ├── migrations
│ ├── models.py
│ ├── serializers.py
│ ├── tests
│ │ ├── __init__.py
│ │ ├── test_api.py
│ │ ├── test_models.py
│ │ ├── test_serializers.py
│ │ └── test_views.py
│ ├── urls.py
│ └── views.py
├── config
│ ├── asgi.py
│ ├── __init__.py
│ ├── settings
│ │ ├── base.py
│ │ ├── dev.py
│ │ ├── __init__.py
│ │ ├── production.py
│ │ └── test.py
│ ├── urls.py
│ └── wsgi.py
├── manage.py
├── README.md
├── requirements
│ ├── base.txt
│ ├── dev.txt
│ ├── production.txt
│ └── test.txt
└── venv
我还尝试修改 manage.py
进行以下更改:
is_testing = 'test' in sys.argv
if is_testing:
import coverage
cov = coverage.coverage(source=['api'], omit=['*/tests/*'])
cov.erase()
cov.start()
execute_from_command_line(sys.argv)
if is_testing:
cov.stop()
cov.save()
cov.report()
但这也没有帮助。
这里是一个覆盖结果示例:
(venv) ➜ project ./manage.py test
System check identified no issues (0 silenced).
----------------------------------------------------------------------
Ran 0 tests in 0.000s
OK
Name Stmts Miss Cover
-------------------------------------------------------
api/__init__.py 0 0 100%
api/apps.py 3 3 0%
api/urls.py 2 0 100%
api/v1/__init__.py 0 0 100%
api/v1/admin.py 4 0 100%
api/v1/migrations/0001_initial.py 10 10 0%
api/v1/migrations/__init__.py 0 0 100%
api/v1/models.py 38 3 92%
api/v1/serializers.py 23 0 100%
api/v1/urls.py 10 0 100%
api/v1/views.py 19 0 100%
-------------------------------------------------------
TOTAL 109 16 85%
测试是:
from django.urls import reverse
from rest_framework import status
from rest_framework.test import APITestCase
from rest_framework_simplejwt.tokens import RefreshToken
from api.v1.models import User
class BrandTests(APITestCase):
def setUp(self) -> None:
self.user = User.objects.create(username='testUser', password='testPass')
self.token = RefreshToken.for_user(self.user).access_token
self.client.credentials(HTTP_AUTHORIZATION='JWT ' + str(self.token))
def test_create_brand(self):
"""
Ensure that we can create brand
"""
url = reverse('brand-list')
response = self.client.get(url)
self.assertEqual(status.HTTP_200_OK, response.status_code)
编辑:我在 django 中创建了简单的应用程序,但得到了相同的结果。所以它不是由项目结构引起的,也不是组合 django+djangorestframework
有人遇到同样的问题吗?
请记住,导入模块将 运行 该模块的所有顶级语句。因此,仅导入一个模块将覆盖该模块中 100% 的 import/class/def 行。如果你从一个几乎空无一人的项目开始,里面的大部分行都是那种行,覆盖率会很高。
忽略您不想覆盖的内容(或者您认为不应该覆盖的内容,例如迁移和设置。.coveragerc 可以帮助您控制您想要覆盖的内容。示例 .coveragerc 文件可能包含以下内容。
[run]
source = '.'
omit =
*tests*
*apps.py
*manage.py
*__init__.py
*migrations*
*asgi*
*wsgi*
*admin.py
*urls.py
*/settings/*
[report]
omit =
*tests*
*apps.py
*manage.py
*__init__.py
*migrations*
*asgi*
*wsgi*
*admin.py
*urls.py
*/settings/*
fail_under = 98
show_missing = True
skip_covered = True
我尝试使用 Django Rest Framework 创建简单的 api 并使用书中的结构 Two Scopes of Django 3.x
。我尝试创建简单的测试和覆盖率报告,几乎 100% 覆盖我应用程序中的所有 python 来源。即使我完全删除该测试。我尝试了 pytest、nose 和我在这里找到的任何东西,结果仍然相同。
我的项目结构如下:
.
├── api
│ ├── apps.py
│ ├── __init__.py
│ ├── urls.py
│ └── v1
│ ├── admin.py
│ ├── __init__.py
│ ├── migrations
│ ├── models.py
│ ├── serializers.py
│ ├── tests
│ │ ├── __init__.py
│ │ ├── test_api.py
│ │ ├── test_models.py
│ │ ├── test_serializers.py
│ │ └── test_views.py
│ ├── urls.py
│ └── views.py
├── config
│ ├── asgi.py
│ ├── __init__.py
│ ├── settings
│ │ ├── base.py
│ │ ├── dev.py
│ │ ├── __init__.py
│ │ ├── production.py
│ │ └── test.py
│ ├── urls.py
│ └── wsgi.py
├── manage.py
├── README.md
├── requirements
│ ├── base.txt
│ ├── dev.txt
│ ├── production.txt
│ └── test.txt
└── venv
我还尝试修改 manage.py
进行以下更改:
is_testing = 'test' in sys.argv
if is_testing:
import coverage
cov = coverage.coverage(source=['api'], omit=['*/tests/*'])
cov.erase()
cov.start()
execute_from_command_line(sys.argv)
if is_testing:
cov.stop()
cov.save()
cov.report()
但这也没有帮助。
这里是一个覆盖结果示例:
(venv) ➜ project ./manage.py test
System check identified no issues (0 silenced).
----------------------------------------------------------------------
Ran 0 tests in 0.000s
OK
Name Stmts Miss Cover
-------------------------------------------------------
api/__init__.py 0 0 100%
api/apps.py 3 3 0%
api/urls.py 2 0 100%
api/v1/__init__.py 0 0 100%
api/v1/admin.py 4 0 100%
api/v1/migrations/0001_initial.py 10 10 0%
api/v1/migrations/__init__.py 0 0 100%
api/v1/models.py 38 3 92%
api/v1/serializers.py 23 0 100%
api/v1/urls.py 10 0 100%
api/v1/views.py 19 0 100%
-------------------------------------------------------
TOTAL 109 16 85%
测试是:
from django.urls import reverse
from rest_framework import status
from rest_framework.test import APITestCase
from rest_framework_simplejwt.tokens import RefreshToken
from api.v1.models import User
class BrandTests(APITestCase):
def setUp(self) -> None:
self.user = User.objects.create(username='testUser', password='testPass')
self.token = RefreshToken.for_user(self.user).access_token
self.client.credentials(HTTP_AUTHORIZATION='JWT ' + str(self.token))
def test_create_brand(self):
"""
Ensure that we can create brand
"""
url = reverse('brand-list')
response = self.client.get(url)
self.assertEqual(status.HTTP_200_OK, response.status_code)
编辑:我在 django 中创建了简单的应用程序,但得到了相同的结果。所以它不是由项目结构引起的,也不是组合 django+djangorestframework
有人遇到同样的问题吗?
请记住,导入模块将 运行 该模块的所有顶级语句。因此,仅导入一个模块将覆盖该模块中 100% 的 import/class/def 行。如果你从一个几乎空无一人的项目开始,里面的大部分行都是那种行,覆盖率会很高。
忽略您不想覆盖的内容(或者您认为不应该覆盖的内容,例如迁移和设置。.coveragerc 可以帮助您控制您想要覆盖的内容。示例 .coveragerc 文件可能包含以下内容。
[run]
source = '.'
omit =
*tests*
*apps.py
*manage.py
*__init__.py
*migrations*
*asgi*
*wsgi*
*admin.py
*urls.py
*/settings/*
[report]
omit =
*tests*
*apps.py
*manage.py
*__init__.py
*migrations*
*asgi*
*wsgi*
*admin.py
*urls.py
*/settings/*
fail_under = 98
show_missing = True
skip_covered = True