coverage.py 是否测量函数和类的定义?
我正在尝试让一个基本的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()。