Python 单元测试工具用法 unittest, mock, coverage

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()

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值