1. 覆盖率工具coverage
pip install coverage
coverage run my_test.py arg1 arg2
coverage html -d covhtml
2. mock patch .
class Dict():
def a(self,n):
if n>0:
return True
else:
return False
def b(self,n):
flag = self.a(n)
print flag
if flag:
return True
else:
return False
#b 中会调用一次a
2.1. @patch( ) 常用于mock class, 装饰器生效的顺序是从下往上,所以 MockClass 1 先传进去。
>>> from unittest.mock import patch
>>> @patch('module.ClassName2')
... @patch('module.ClassName1')
... def test(MockClass1, MockClass2):
... module.ClassName1()
... module.ClassName2()
... assert MockClass1 is module.ClassName1
... assert MockClass2 is module.ClassName2
... assert MockClass1.called
... assert MockClass2.called
...
>>> test()
2.2 @patch( ) Mock 类的成员方法。
>>> with patch.object(ProductionClass, 'method', return_value=None) as mock_method:
... thing = ProductionClass()
... thing.method(x)
...
>>> mock_method.assert_called_once_with(x)
def test_b(self):
with patch.object(Dict, 'a', return_value = True) as mock_method:
d = Dict()
d.a(1) #Mock a 的返回值为True
ret = d.b(0) #b 中会调用a, 无论参数是什么,a都是True
self.assertEqual(ret, False)
@patch.object(Dict, 'a', return_value = True)#作用域整个用例。
#每一次对 a方法的调用值都是True
def test_b_1(self, mock):
d = Dict()
print d.a(3)
ret = d.b(0)
self.assertEqual(ret, True)
还可以指定side_effect, 这样,调用实例方法的每次返回值都可以不一样。
@patch.object(Dict, 'a', side_effect = [False,True])
def test_b_1(self, mock):
d = Dict()
print d.a(3)
ret = d.b(0)
self.assertEqual(ret, True)
2.3 @patch.pbject( ) Mock类方法。
>>> @patch.object(SomeClass, 'class_method')
... def test(mock_method):
... SomeClass.class_method(3)
... mock_method.assert_called_with(3)
...
>>> test()