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

 

posted on 2018-01-05 18:20  小王子1110  阅读(675)  评论(0编辑  收藏  举报

导航