Python的装饰器的作用
装饰器模式是一个强大的模式,可以给一个函数增加额外的方法而不用修改原来的代码 比如,当我们需要给原来的代码添加日志记录时,需要将原来的代码进行修改,在函数里面增加日志记录的代码。但如果使用装饰器模式,使用装饰器装饰原来的代码,将日志记录放在装饰器里,就可以避免修改原有的代码,同时又实现了所需的功能。这种编程模式就叫做面向切片编程
作用和使用场景
-
引入日志 -
函数执行时间统计 -
执行函数前预备处理 -
执行函数前的清理功能 -
权限效验等
参考阅读 Python的装饰器的作用
Python Mock单元测试
为什么要使Mock
场景模拟1:比如有A和B两个模块,A模块中有调用到B模块的方法,但是很不幸,B模块中被A模块调用的方法由于一定的原因需要被修改,然而我们又不想让影响A模块的功能测试,所以就用到了单元测试模块unittest中的mock模块;mock模块就是模拟出一个假的B模块
场景模拟2:有时需要为单元测试的初始设置准备一些其他的资源,但是这些资源又不太经常使用或者是使用起来比较笨拙,此时我们就可以定义一个mock对象来模拟一个需要使用的资源;mock对象用于代替测试的准备资源
Mock基本使用
-
Mock构造器 init是mock对象的构造器,init(name = None, return_ralue = DEFAULT, side_effect =None, spec = None) name是mock对象的唯一标识 spec设置的是mock对象的属性,可以是property或者方法,也可以是其他的列表字符串或者其他的python类 return_value设置的是,当这个mock对象被调用的时候,显示出的结果就是return_value的值 side_effect是和return_value是相反的,覆盖了return_value,也就是说当这个mock对象被调用的时候,返回的是side_effect的值,而不是return_value -
Mock断言 assert_called_with(*argSeq, **argKW):检查mock方法是否获得了正确的参数;当至少有一个参数有错误的值或者类型时,当参数的个数出错时,当参数的顺序不正确时,这个断言就会发生错误 assert_called_once_with(*argSeq, **argKW)这个断言,当某个方法被多次调用的时候,它就会报错 assert_any_call()用于检查测试的mock对象在测试例程中是否调用了方法,和前边的两个断言不一样,前边的两个只是检查最近一次的调用;看下边的例子(mock的构造仍和上边的例子一样) assert_has_calls()检查是否按照正确的顺序和正确的参数进行调用的;所以,我们需要给出一个方法的调用顺序,assert的时候按照这个顺序进行检查 -
Mock管理方法 attach_mock():将一个mock对象添加到另一个mock对象中 configure_mock():更改mock对象的return_value值 mock_add_spec(aSpec, spec_set = False):这个函数就是给mock对象添加一个新的属性(mock对象原来的属性就会被擦除),第二个参数是指属性是可读可写,默认是只读,如果想让其拥有写权限,可以将其设置为true reset_mock():将mock对象恢复到测试之前的状态,这里也就是避免了重新构造mock对象带来的开销。这里就不给出举例
Mock统计
called: 跟踪mock对象所做的任意调用的访问器 call_count:mock对象被工厂调用的次数 call_args:获取工厂调用时的参数(最近使用的参数) call_args_list:获取工厂调用的的所有参数,是个列表 method_calls:测试一个mock对象都调用了哪些方法,结果是一个list mock_calls:显示工厂调用和方法调用
参考阅读
return_value 和 side_effec Python中的模块学习之mock模块
参考阅读 Python中的模块学习之mock模块 return_value 和 side_effect 使用
Python代码中func(*args, **kwargs)
参考阅读 Python代码中func(*args, **kwargs)
|