【问题标题】:Using coverage, how do I test this line?使用覆盖率,我如何测试这条线?
【发布时间】:2015-08-15 11:06:04
【问题描述】:

我有一个简单的测试:

class ModelTests(TestCase):

    def test_method(self):
        instance = Activity(title="Test")
        self.assertEqual(instance.get_approved_member_count(), 0)

我的问题是覆盖率仍然显示get_approved_member_count 行未测试:

我如何满足上述要求?

为了运行测试,我使用了带有 Coverage 的 Django Nose:

TEST_RUNNER = 'django_nose.NoseTestSuiteRunner'

NOSE_ARGS = [
    '--with-coverage',
    '--cover-html',
    '--cover-package=apps.users,apps.activities',
]

控制台:

python manage.py test
/Users/user/Documents/workspace/api/env/lib/python3.4/importlib/_bootstrap.py:321: RemovedInDjango19Warning: django.contrib.contenttypes.generic is deprecated and will be removed in Django 1.9. Its contents have been moved to the fields, forms, and admin submodules of django.contrib.contenttypes.
  return f(*args, **kwds)

/Users/user/Documents/workspace/api/env/lib/python3.4/importlib/_bootstrap.py:321: RemovedInDjango19Warning: The utilities in django.db.models.loading are deprecated in favor of the new application loading system.
  return f(*args, **kwds)

nosetests --with-coverage --cover-html --cover-package=apps.users,apps.activities --verbosity=1




Name                                                      Stmts   Miss  Cover   Missing
---------------------------------------------------------------------------------------
apps.activities                                          0      0   100%
apps.activities.admin                                    8      8     0%   1-14
activities.migrations                               0      0   100%
activities.migrations.0001_initial                  9      0   100%
apps.activities.urls                                     8      0   100%


etc etc etc
---------------------------------------------------------------------------------------
TOTAL                                                       670    232    65%
----------------------------------------------------------------------
Ran 79 tests in 17.101s

【问题讨论】:

  • 你走的路是对的。如果直接调用这个测试,测试输出是什么?
  • @omeinusch 测试仅在测试期间返回一个计数,在生产中为 0,这更多。我假设上面覆盖了它,但覆盖范围仍然说get_approved_member_count() 没有被覆盖。
  • 请发布完整的控制台输出,包括您的调用和测试运行者给出的输出。
  • 可能的原因是您在覆盖范围之外导入了被测模块。而且您没有提及您的测试运行程序或您的环境的任何其他细节,并且该示例无法以任何方式重现,因为不完整。
  • @jhermann 更新了我的 OP,希望对您有所帮助:)

标签: python django django-testing


【解决方案1】:

覆盖率报告显示正在调用该方法(第 80 行为绿色)。但它也表明它从未被定义(第 75 行是红色的)。

这是开始报道太晚的典型问题。解决此问题的最简单方法是使用覆盖率来运行您的测试运行程序,而不是使用测试运行程序运行覆盖率:

$ coverage run -m nose --verbosity=1

更新:与您的原始命令一起使用:

$ coverage run manage.py test

但您需要先卸载鼻子覆盖插件。

【讨论】:

  • 我可以确认我已经看到了同样的行为,Ned 的解决方案为我解决了这个问题。我以为我在过去看到过这个文档(在coverage 的文档或nose 的文档中),但现在似乎找不到。
  • 感谢您的回复。这很有意义。我正在使用 Django 和 Django Nose 测试运行程序,我有什么选择吗?
猜你喜欢
  • 2017-10-14
  • 2015-02-12
  • 2021-10-23
  • 2015-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多