在python的LLT测试中,需要保证覆盖率,但是有一个问题就是,python代码本来就很短,一个函数可能就几行,而且工程代码为了方便定位错误,会在函数的前后包围try_except_else块,这一个块就占了几行,如果没一个函数都无法覆盖这个异常处理的块,那么覆盖率将会受到很大的影响,这篇博客演示如何用python模拟异常。
其实只需要知道mock有一个side_effect的参数就很容易了,这个参数就是返回打桩函数的异常情况的。
import os
class classA():
def getnum(self):
return 0
def self_function(self):
if self.getnum()==0:
print("test_self_function you are very good")
except:
print("test_self_function the except module")
else:
print("test_self_function the else module")
定义测试函数:
@patch("aa.classA.getnum")
def test_self_function(self,mock_getnum):
mock_getnum.side_effect = IOError()
classA().self_function()
这样运行这个测试函数就会被捕获到异常。
当然这么强大的函数不仅仅可以打桩自己写的函数,甚至可以捕获python的内置库函数。
加上一个函数:
def python_function(self,path):
if os.path.exists(path):
print(" test_python_function you are very good")
except:
print("test_python_function the except module")
else:
print("test_python_function the else module")
其测试函数:
@patch("os.path.exists")
def test_python_function(self,mock_exists):
mock_exists.side_effect = IOError
classA().python_function("/you")
可以看到,这个地方也成功的捕获到了异常。
总述:在python的LLT测试中,需要保证覆盖率,但是有一个问题就是,python代码本来就很短,一个函数可能就几行,而且工程代码为了方便定位错误,会在函数的前后包围try_except_else块,这一个块就占了几行,如果没一个函数都无法覆盖这个异常处理的块,那么覆盖率将会受到很大的影响,这篇博客演示如何用python模拟异常。做法:其实只需要知道mock有一个side_effec...
数据类型、模型或节点——这些都只是
mock
对象可承担的角色。但
mock
在单元测试中扮演一个什么角色呢?有时,你需要为单元测试的初始设置准备一些“其他”的代码资源。但这些资源兴许会不可用,不稳定,或者是使用起来太笨重。你可以试着找一些其他的资源替代;或者你可以通过创建一个被称为
mock
的东西来模拟它。
Mock
s能够让我们模拟那些在单元测试中不可用或太笨重的资源。在
Python
中创建
mock
是通过
Mock
模块完成的。你可以通过每次一个属性(one-attribute-at-a-time)或一个健全的字典对象或是一个类接口来创建
mock
。你还可以定义
mock
的行为并且在测试过程中检查它的使用。让我们
mock
总所周知是模拟的意思,我们在做接口测试的时候有时候会发现部分功能依赖其他业务场景或者第三方功能或者是线上数据或者业务场景过于复杂(需要大量调用)的情况,没有办法通过接口调用或者做断言,这个时候就需要
mock
了
python
2中需要pip install
mock
来导入
mock
第三方模块,而
python
3中被引入到unittest框架中,直接from unittest import
mock
就可以导入
mock
模块了
在单元测试中只针对当前单元做测试,就是测试当前方法或者是当前类,但是如果出现这个方法依赖其他第三方模块,那不是还要校验其他方法了吗,那就违背了单元测试这个概念了,所有将外部
Mock
ito作为一款不错的单元测试
mock
工具,极大的提升单元测试效率,但是在使用该工具时需要注意
Mock
ito
打桩
的方法参数一定不能是基础类型(boolean、int),否则使用any()的时候就会报空指针
异常
:
int save(DeviceType deviceType, boolean isCreate) --错误命名
Mock
ito.when(deviceTypeManager.save(any(), any())).thenReturn(
mock
DevType);
int sa
Mock
ito,针对方法void 返回值
mock
测试 正常调用,
抛出异常
正常调用doNothing().when(xxxService).methodName(any());
eg:doNothing().when(UserService).insert(any());
doThrow(new RuntimeException()).when(xxxService).methodNa...
在进行单元测试时,有时需要模拟某个方法
抛出异常
的情况,可以使用
Mock
ito框架来实现。首先需要使用
Mock
ito.
mock
()方法创建一个被模拟的对象,然后使用
Mock
ito.when()方法指定当调用该对象的某个方法时
抛出异常
,例如:
// 创建被模拟的对象
SomeClass someObject =
Mock
ito.
mock
(SomeClass.class);
// 指定当调用该对象的某个方法时
抛出异常
Mock
ito.when(someObject.someMethod()).thenThrow(new RuntimeException("error message"));
这样,在测试代码中调用该对象的该方法时就会抛出指定的
异常
。