coverage.py 是否测量函数和类的定义?

18 投票
2 回答
6867 浏览
提问于 2025-04-17 09:01

我正在尝试让一个基本的Python模块的测试覆盖率达到100%。

我使用Ned Batchelder的coverage.py模块来进行测试。

1 class account(object):
2   def __init__(self, initial_balance=0):
3     self.balance = initial_balance
4   def add_one(self):
5    self.balance = self.balance + 1

这些是我的测试。

class TestAccount(unittest.TestCase):
  def test_create_edit_account(self):
    a = account1.account()
    a.add_one()

这是我得到的覆盖率报告。

    COVERAGE REPORT =
    Name                    Stmts   Miss  Cover   Missing
   -----------------------------------------------------
   __init__                    1      1     0%   1
   account1                    5      3    40%   1-2, 4
   account2                    7      7     0%   1-7

从报告中可以看到,第1-2行和第4行没有被覆盖,这些是函数的定义。其余的行都被执行了。

2 个回答

5

根据jcollado的回答:

我在使用Django nose时遇到了一个问题,它只统计测试用到的代码行。

为了解决这个问题,我首先运行manage.py来收集代码覆盖率,然后再运行测试。

这样生成的.coverage文件就会包含两者的报告。

我的第一个命令是一个自定义命令,它会打印出我的项目设置。举个例子:

coverage run ./manage.py settings && ./manage.py test myapp
22

我觉得你的问题可以在这个常见问题解答里找到答案:

问:为什么函数(或类)的主体显示为已执行,但定义行却没有?

这是因为覆盖率测量是在函数定义之后开始的。定义行在没有覆盖率测量的情况下执行,然后才开始测量覆盖率,接着才调用这个函数。这就意味着函数的主体被测量了,但函数本身的定义却没有。

要解决这个问题,可以提前开始覆盖率测量。如果你通过命令行运行程序并开启覆盖率,那么整个程序都会被监控。如果你使用的是API,那么在导入定义函数的模块之前,需要先调用coverage.start()。

撰写回答