2016-07-29 113 views
1

遇到一些代码覆盖率较小的问题,使用Django Web应用程序的nosetests和覆盖率。我已经创建了一个.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”,它仍然表示通过命令行给出的报告中缺少这些行。这使得很难确定哪些线路实际上未能覆盖我的测试用例。任何人都可以提供一些见解吗?

+0

如何运行测试并且不运行模型定义行?如果报道说他们没有运行,那么你可能运行的覆盖范围是错误的,它开始测量的时间太晚了。你试图排除“来自”是另一个同样问题的迹象。不要试图排除这些线。尽早运行覆盖。看到这个答案:http://stackoverflow.com/a/30653523/14343 –

+0

好,以便解决问题。我很欣赏与其他问题的联系。 –

回答

0

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

0

您的.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

+0

所以问题不在于省略。问题出在文件的“exclude_lines”部分。我得到的代码覆盖率很低,因为我没有在技术上测试我的任何变量声明(我不想测试)。这就是为什么我在“exclude_lines”中添加“= models /”的原因。我不希望coverage.py将这些代码行识别为需要测试的东西。我希望我能以一种合理的方式解释这一点,但我不知道该怎么说。 –

+0

啊,所以你想测试模型上的方法,但不是实际的模型本身?我不确定你可以在coveragerc文件中区分这两者。您可能必须将模型方法移动到另一个文件中,并保持模型未经测试。 – Alex

+0

是的,我希望我可以避免使用exclude_lines中的正则表达式来做这件事,因为Django在技术上说要在实际模型中包含模型的功能。我想我们可以在技术上不遵守Django标准,但是我觉得如果我们沿着这条路走下去,方法会更加复杂。 –