【问题标题】:Nosetests and Coverage not excluding linesNosetests 和 Coverage 不排除行
【发布时间】:2016-07-29 17:29:43
【问题描述】:

在使用鼻子测试和覆盖 Django Web 应用程序时遇到了一些代码覆盖率的小问题。我创建了一个 .coveragerc 文件来排除大量代码(例如类声明),但仍然得到一些奇怪的结果。

这是我的 .coveragerc 文件:

[run]
omit = ../*migrations*, ../*admin.py

[report]
show_missing = True
exclude_lines =
         pragma: no cover
         from
         = models\.

这是 models.py 文件之一的示例:

from django.db import models

class Query(models.Model):
    variable1 = models.CharField(max_length=100)
    variable2 = models.CharField(max_length=100)
    variable3 = models.CharField(max_length=100)
    variable4 = models.CharField(max_length=100)
    variable5 = models.CharField(max_length=100)
    id = models.AutoField(primary_key=True)

def some_function(self):
     self.variable1 = self.variable2 + self.variable3 + self.variable4 + self.variable 5
     return self.variable1

因此,当我运行代码覆盖率时,我遇到的问题是,尽管我告诉覆盖率明确排除带有字符串“= models.”的任何内容,但它仍然说通过命令行给出的报告中缺少这些行。这使得很难确定我在测试用例中实际上没有涵盖哪些行。任何人都可以对此提供一些见解吗?

【问题讨论】:

  • 如何运行测试而不运行模型定义行?如果覆盖显示它们没有运行,那么您可能运行覆盖错误,并且开始测量为时已晚。您试图排除“从”是同一问题的另一个迹象。不要试图排除这些行。早点运行覆盖。看到这个答案:stackoverflow.com/a/30653523/14343
  • 好的,这样就解决了问题。我很欣赏另一个问题的链接。

标签: python django coverage.py


【解决方案1】:

您的 .coveragerc 文件应列出从您的目录根目录开始排除的内容。

例如:

proj
|-- app1
   |
   -- models.py
   -- migrations.py
|-- app2

那么您的coverage.rc 文件应该如下所示:

[run]
omit = app1/migrations.py, app1/admin.py

[run]
omit = proj/*/migrations.py, proj/*/admin.py

【讨论】:

  • 所以问题不在于省略。问题在于文件的“exclude_lines”部分。我的代码覆盖率很低,因为我没有在技术上测试我的任何变量声明(我不想测试)。这就是为什么在“exclude_lines”中我添加了“= models/.”我不希望 coverage.py 将这些代码行识别为需要测试的东西。我希望我能以一种有意义的方式来解释这一点,但我不知道该怎么说。
  • 啊,所以您想测试模型上的方法,而不是实际模型本身?我不确定您是否可以在 coveragerc 文件中区分两者。您可能必须将模型方法移动到另一个文件中并保持模型未经测试。
  • 是的,我希望我可以避免在 exclude_lines 中使用正则表达式,因为 Django 在技术上说要在实际模型中包含模型的功能。我想我们在技术上可以不遵守 Django 标准,但我觉得如果我们走这条路,这些方法会更加复杂。
  • 是的,我个人会将方法保存在 models.py 文件中。可能不得不牺牲代码覆盖率以获得最佳实践。
  • 唯一的问题是代码覆盖率是整个 8% 哈哈。 models.py 中没有很多方法,但是有很多变量声明,我不知道如果我们说有 8% 的代码覆盖率,它对客户来说会有多好,即使我们解释为什么它这么低:-/
【解决方案2】:

找到了我的问题的解决方案。事实证明我根本不需要使用nosetests。我可以简单地运行coverage.pymanage.py 测试并传入测试模块。代码覆盖率很好,我的覆盖率高达 96% :-)

【讨论】:

    猜你喜欢
    • 2019-06-16
    • 2017-07-03
    • 2020-07-29
    • 1970-01-01
    • 1970-01-01
    • 2017-12-01
    • 1970-01-01
    • 2017-10-22
    • 1970-01-01
    相关资源
    最近更新 更多