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