python mock简单了解使用

Python011

python mock简单了解使用,第1张

Mock就是模拟,在测试一个对象或服务时,为排除其他因素对本身对象或服务的测试,事先设定且符合预期的(正常和异常处理)Mock对象。来被测对象功能是否满足需求,异常逻辑或压力情况下工作是否正常

如此例模拟通过第三方接口返回的状态,假设自己写的一个处理逻辑是oneurl_is_accessable()

oneurl()的功能是访问 http://XXX.com ,状态需要依赖的第三方接口的返回,要验证的自己写的逻辑oneurl_is_accessable()判断第三方接口返回的状态码,如果是200返回‘访问正常’,否则‘访问异常’

tmptestdemo.py文件为被测逻辑所在文件,具体内容如下

testdemo.py为测试模块

对被测对象oneurl_is_accessable()编写用例,利用mock模拟oneurl()的返回状态

执行结果:

使用mock,可以将某个函数所依赖的对象或者变量mock掉,从而降低测试条件的负责度。如下所示:

上述是mock对象的简单使用方法,通过实例化一个Mock对象从而模拟掉原始函数的返回值,高级一些的用法就是通过mock.patch装饰器,装饰在类或者函数上进行模拟测试,如下在test.py文件中有两个类:

测试用例设计如下:

以上测试用例说明,通过patch装饰器模拟了 test.ProductionClass1 这个类,在 test_01 中使用 mock_class 模拟 test.ProductionClass1 。首先通过 mock_class.return_value 获取类实例(如果模拟的是函数,则不需要这一步),然后通过 obj1.pro1_method.return_value 设置方法的返回值,并进行测试。测试结果说明无论是通过 mock_class 还是 test.ProductionClass1 还是 obj1 执行方法,获取到的结果都是设置的值,并且在另一个类中调用模拟类的方法,也能成功获取到设置的 return_value 。

在做一些项目的时候,因为用到了第三方的接口,而第三方的接口可能没有做好或者第三方的接口不方便访问的时候,一般都会用到Mock的技术。

Mock这个词在英语中有模拟的这个意思。Python3.x中本身就自带了Mock库,(Python2.x中还是单独的)Mock是Python中一个用于支持单元测试的库,它的主要功能是使用mock对象替代掉指定的Python对象,以达到模拟对象的行为。

简单的说,mock库用于如下的场景:

假设你开发的项目叫a,里面包含了一个模块b,模块b中的一个函数c(也就是a.b.c)在工作的时候需要调用发送请求给特定的服务器来得到一个JSON返回值,然后根据这个返回值来做处理。如果要为a.b.c函数写一个单元测试,该如何做?

一个简单的办法是搭建一个测试的服务器,在单元测试的时候,让a.b.c函数和这个测试服务器交互。但是这种做法有两个问题:

1 . 测试服务器可能很不好搭建,或者搭建效率很低。

2 . 你搭建的测试服务器可能无法返回所有可能的值,或者需要大量的工作才能达到这个目的。

httmock库是基于Mock库的,它更方便于用requests的方式来返回接口的值。

使用pip命令来安装:

用法:

1 您可以使用它来模拟第三方API和在内部使用 requests 的测试库,有条件地使用 urlmatch 装饰器:

控制台显示:

2 all_requests 装饰器没有条件地阻止实际的请求。 如果您返回一个字典,它将映射到返回的“request.Response”对象:

控制台显示:

3 如果你传递 Set-Cookie 头, request.Response.cookies 将包含这些值。 您也可以直接使用 response 方法,而不是返回一个dict:

控制台显示:

CC先生说:

要明白上面的例子,预备知识至少需要有:

-Python 中requests库的用法

-Python中装饰器的用法

or 你直接套用上面的用法就可以返回第三方接口或者依赖的模块的值了。

以上