mock测试【创建服务、fiddler、单元测试】

mock测试就是在测试过程中,对于某些不容易构造或者不容易获取的对象,用一个虚拟的对象来创建以便测试的测试方法。

一、创建服务的方式——flask、django

import flask
from flask import request

# 创建接口后台服务
server = flask.Flask(__name__)


@server.route('/', methods=['get', 'post'])
def demo():
    # 获取get请求参数
    arg = request.args.get("key")
    # post 获取表单请求数据
    form = request.form.get("key", type=str, default=None)

    # 获取所有请求参数,不能获取json
    values = request.values.get("key")
    # 获取请求json
    json = request.get_json()

    print("arg", arg)
    print("form", form)
    print("values", values)
    print("json", json)
    return "你想返回的内容"


server.run(host="127.0.0.1", port=9000, debug=True)

  flask是python的一个轻量级web框架,比较简单。

  django稍微比较复杂,可以参考:https://blog.csdn.net/weixin_30268071/article/details/98903930,这个已经做成了一个小项目的形式

遇到的问题:

1、post请求,结果获取参数的时候,却是如下方式

request.values.get("key")

2、post请求,因为Content-Type的问题,通过如下方式解决

request.get_json(force=True)

3、get请求,按道理参数是?后面拼接字段名=字段值,但是遇到的是直接放在/后面,解决示例如下

@server.route('/SeonRestService/email-api/v2.0/<email>', methods=['get'])
def seon_email_api(email):
    """https://api.seon.io"""
    print("seon_email_api服务,email是:", email)

4、容器中安装vim

先执行:apt-get update

再执行:apt-get install vim

5、获取请求头,请求url,请求方法等信息都有对应的方法

二、创建服务的方式—— tornado

  tornado也是python自带的一个轻量级web框架,是一个群友提供的一个mock示例时,了解到的这个框架,可以参考:https://blog.csdn.net/xc_zhou/article/details/80637714

import tornado.ioloop
import tornado.web


class MainHandler(tornado.web.RequestHandler):
    '''http服务端'''

    def get(self):
        '''get请求'''
        a = self.get_argument('a')
        self.write({'我有这么多钱': int(a)})

    def post(self):
        '''post请求'''
        h = self.request.headers
        u = self.request.uri
        b = self.request.body
        print("h", h)
        print("u", u)
        print("b", b)

        # 下面2行代码是设置返回的信息,目前没有想到使用场景
        # self.set_header('Content-Type', 'application/json; charset=UTF-8;')
        # self.set_status(200, '失败')

        self.write("返回的内容")

if __name__ == '__main__':
    application = tornado.web.Application([('/', MainHandler)])
    # 默认host: 127.0.0.1
    application.listen(address="127.0.0.2", port=8866)
    tornado.ioloop.IOLoop.instance().start()

    #和上面启动方式不同的地方就多了参数:decompress_request=True
    #在有这个配置项的时候,如果post请求的报文头部有说明编码方式是 gzip时,tornado将会对这个请求进行解压操作
    # http_server = tornado.httpserver.HTTPServer(application, decompress_request=True)
    # http_server.listen(8866)
    # tornado.ioloop.IOLoop.instance().start()

三、fiddler的mock 

实际上是劫持的方式给的自定义响应,如下图,在AutoResponder选项卡下添加规则即可

四、unittest中的mock

from unittest.mock import patch
from unittest import mock
import unittest


class C:
    def a(self):
        return 666

    def b(self):
        return 666


class TestXXX(unittest.TestCase):
    """单元测试的2种mock方式
       mock不能凭空创建属性a,只能应用于对象逻辑还没完成但是需要这个对象的返回信息
       感觉意义不是很大"""

    @patch.object(C, 'b')
    @patch.object(C, 'a')
    def test_xxx1(self, a, b):
        # 注意测试方法中的参数和装饰器的参数对应关系
        a.return_value = 20
        b.return_value = 30
        c = C()
        print("test_xxx1", c.a(), c.b())

    def test_xxx2(self):
        c = C()
        c.a = mock.Mock(return_value=20)
        print("test_xxx2", c.a())


if __name__ == '__main__':
    unittest.main()
测试进阶轨迹
原文地址:https://www.cnblogs.com/yinwenbin/p/14773632.html