python接口测试之mock(三)
前面介绍了moco的详细的使用,它主要是基于moco-runner-0.11.0-standalone.jar,通过编写json的文件来实现,mock翻译过来就是模拟的意思,也就是说,它是将测试对象所依存的对象替换为虚构对象的库,该虚构对象的调用允许事后查看。Python中有几个库是可以模拟请求和响应的.
1. mock
在python的2.x版本中,mock是属于第三方的库,需要单独的按钮,在python3.3的版本以后,不需要单独的安装,从unitest里直接导入就可以了
接下来我们来看mock库的经常使用的方法以及它的详细的帮助信息,见以下的代码:
class Count: def add(self): pass from unittest import mock import unittest class test_add(unittest.TestCase): def test_add(self): count = Count() #找到要替换的对象,这个对象可以是一个类,或者是一个函数,或者是一个类实例 #实例化Mock类得到一个mock对象,并且设置这个mock对象的行为,比如被调用的时候返回什么值,被访问成员的时候返回什么值等 count.add = mock.Mock(return_value=12) result = count.add(8,4) self.assertEqual(result,12) if __name__ == '__main__': unittest.main()
2. responses库
安装: pip install responses
接下来看看responses的使用方法:
import responses import requests, unittest class responsesTest(unittest.TestCase): def setUp(self): pass def tearDown(self): pass @responses.activate def test_simple1(self): responses.add(responses.GET, 'http://twitter.com/api/1/foobar', json={'error': 'not found'}, status=404) url = 'http://twitter.com/api/1/foobar' r = requests.get(url) # print(r.json()) self.assertEqual(r.json()['error'], 'not found') if __name__ == '__main__': unittest.main()
import json,responses, requests, unittest class responseTest(unittest.TestCase): def setUp(self): pass def tearDown(self): pass @responses.activate def test_case1(self): def request_callback(request): payload = json.loads(request.body) resp_body = {'value': sum(payload['numbers'])} headers = {'request-id': '728d329e-0e86-11e4-a748-0c84dc037c13'} return (200, headers, json.dumps(resp_body)) responses.add_callback( responses.POST, 'http://calc.com/sum', callback=request_callback, content_type='application/json', ) resp = requests.post( 'http://calc.com/sum', json.dumps({'numbers': [1, 2, 3]}), headers={'content-type': 'application/json'}, ) self.assertEqual(resp.json()['value'], 6) self.assertEqual(resp.status_code,200) self.assertEqual(resp.headers['request-id'], '728d329e-0e86-11e4-a748-0c84dc037c13') if __name__ == '__main__': unittest.main()