精华内容
下载资源
问答
  • mock模拟接口测试

    2020-12-09 17:49:24
    1.单元测试/接口测试中测试对象依赖其他对象,这些对象的构造复杂、耗时或者根本无法构造(未交付) 2.我们只测试对象内部逻辑的质量,不关心依赖对象的逻辑正确性和稳定性 3.当前端开发在开发页面的时候,需要服务端...

    一、为什么要使用mock

    1.单元测试/接口测试中测试对象依赖其他对象,这些对象的构造复杂、耗时或者根本无法构造(未交付)
    2.我们只测试对象内部逻辑的质量,不关心依赖对象的逻辑正确性和稳定性
    3.当前端开发在开发页面的时候,需要服务端提供API接口
    此时服务端没开发完成,或者说没搭建测试环境,这个时候前端开发会自己mock一个api服务端,自己给自己提供调用接口的返回数据
    mock服务器用途就是开发在开发的过程中,需要依赖一部分的接口,但是对方没有提供或者环境等等情况。
    4.依赖第三方数据的接口测试

    二、mock的环境搭建

    1.git上的位置为:https://github.com/dreamhead/moco
    windows安装,直接点击此处下载:
    2.git上的readme(按照readme的内容进行安装操作也可完成)下:点击下载
    在这里插入图片描述
    3. 下载完成后,保存到电脑本地的一个目录,然后在同一目录下新建一个gy.json文件,里面写入如下内容格式:
    在这里插入图片描述
    4.接下来启动moco服务,打开moco-runner-1.1.0-standalone.jar所在的文件夹目录(E:\mock),地址栏左上角输入cmd,回车打开cmd窗口,输入如下命令

    java -jar moco-runner-1.1.0-standalone.jar http -p 12306 -c gy.json
    

    在这里插入图片描述
    5.打开浏览器,在浏览器输入http://localhost:12306
    在这里插入图片描述
    6.可以根据需要返回的接口信息值,去修改json文件的内容,来满足需要

    三、实战案例

    配置不同的请求

    1. demo1:特定URI
    [
    	{
    		"description":"demo1=特定URI",
    		"request":{
    			"uri":"/demo1"
    		},
    		"response":{
    			"text":"Hello,demo1"
    		}
    	}
    ]
    
    
    1. demo2:特定请求参数
    [
    	{
    		"description":"demo2=特定请求参数",
    		"request":{
    			"uri": "/demo2",
    			"queries":{
    				"key1":"abc",
    				"key2":"123"
    			  }
    			},
    		"response":{
    			"text":"Hello,demo2"
    		}
    
    
    1. demo3:特定请求方法
    [
    	{
    		"description":"demo3=特定请求方法",
    		"request":{
    			"uri":"/demo3",
    			"method":"DELETE"
    	},
    		"response":{
    			"text":"Hello,demo3"
    		}
    	}
    ]
    
    
    1. demo4:约定请求头
    [
    	{
    		"description":"demo4=约定请求头",
    		"request":{
    			"uri":"/demo4",
    			"headers":{
    				"ContentType":"application/xml"
    		}
    		},
    		"response":{
    			"text":"Hello,demo4"
    	}
    	}
    ]
    
    
    1. demo5:约定请求体参数-form
    [
    	{
    		"description":"demo5=约定请求体参数-form",
    		"request":{
    			"uri":"/demo5",
    			"forms":{
    				"key1":"abc"
    				}
    			},
    		"response":{
    			"text":"Hello,demo5"
    		}
    	}
    ]
    
    
    1. demo6:约定请求体参数-json
    [
    	{
    		"description":"demo6=约定请求体参数-json",
    		"request":{
    			"uri":"/demo6",
    			"json":{
    					"key1":"value1",
    					"key2":"value2"
    				}
    			},
    		"response":{
    			"text":"Hello,demo6"
    		}
    	}
    ]
    
    
    1. demo12:重定向
    [
    	{
    		"description":"demo12=重定向",
    		"request":{
    			"uri":"/demo12"
    		},
    		"redirectTo":"http://www.baidu.com"
    	}
    ]
    
    
    1. demo13:返回json格式的数据
    [
    	{
    	    "description":"demo13=返回json格式的数据",
    		"request":{
    			"uri":"/demo13"
    		 }, 
    		"response":{
    			"json":{"key1":"value1","key2":"value2"}
    	    }
    	}
    ]
    
    

    实战操作
    项目1
    url.json

    [
      {
    	"description":"demo1=约定URI",
    	"request":{
    		"uri":"/demo1"
    	},
    	"response":{
    		"text":"Hello,demo1"
    	}
      }
    ]
    
    

    启动服务:

    java -jar moco-runner-1.1.0-standalone.jar http -p 9098 -c url.json
    

    python代码

    import requests
    api_url = 'http://127.0.0.1:9098/demo1'
    reps = requests.get(api_url)
    print(reps.text)
    print(reps.status_code)
    

    运行结果:
    在这里插入图片描述
    在这里插入图片描述

    项目2
    demo1.json

    [
      {
        "description":"1、提交申请接口",
    	"request":{
    		"uri":"/api/order/create/",
    		"json":{
    				"user_id":"001",
    				"goods_id":"123456",
    				"num":1,
    				"amount":100.8
    			}
    	 }, 
    	"response":{
    		"json":{"order_id": "0001"}
        }
       }
    
    ]
    
    

    启动服务:

    java -jar moco-runner-1.1.0-standalone.jar http -p 9098 -c demo1.json
    

    python代码

    import requests
    HOST = "http://127.0.0.1:9098"
    def test():
        url = f"{HOST}/demo2"
        resp = requests.get(url, params={"key1": "abc", "key2": "123"})
        resp = requests.post(url, params={"key1": "abc", "key2": "123"})
        print(resp.text)
    
    if __name__ == '__main__':
        test()
    

    运行结果:
    在这里插入图片描述
    在这里插入图片描述

    项目3
    demo2.json

    [
      {
        "description":"1、提交申请接口",
    	"request":{
    		"uri":"/api/order/create/",
    		"json":{
    				"user_id":"001",
    				"goods_id":"123456",
    				"num":1,
    				"amount":100.8
    			}
    	 }, 
    	"response":{
    		"json":{"order_id": "0001"}
        }
       },
       {
    	"description":"2、查询订单接口",
    	"request":{
    		"uri":"/api/order/get_result/",
    		"method":"GET",
    		"queries":{
    					"order_id": "0001"
    				}
    		},
    	"response":{
    		"status":200,
    		"json":{
    					"user_id": "001",
    					"goods_id": "123456",
    					"num":1,
    					"amount":100.8
    			}
    	}
       }
    ]
    
    
    

    启动服务:

    java -jar moco-runner-1.1.0-standalone.jar http -p 9098 -c demo2.json
    

    python代码

    
    
    
    
    """{
    	"description":"2、查询订单接口",
    	"request":{
    		"uri":"/api/order/get_result/",
    		"method":"GET",
    		"queries":{
    					"order_id": "0001"
    				}
    		},
    	"response":{
    		"status":200,
    		"json":{
    					"user_id": "001",
    					"goods_id": "123456",
    					"num":1,
    					"amount":100.8
    			}
    	}
    }
    """
    
    import time
    import requests
    import threading
    
    HOST = "http://127.0.0.1:9098"
    
    # 1、提交申诉请求
    def create_order():
        url = f"{HOST}/api/order/create/"
        payload = {
            "user_id": "001",
            "goods_id": "123456",
            "num": 1,
            "amount": 100.8
        }
        resp = requests.post(url, json=payload)
        return resp.json()['order_id']
        # print(resp.json()['order_id'])
    
    # if __name__ == '__main__':
    #     create_order()
    #     # 输出:0001
    """
    查询接口:
        1、频率            interval
        2、多少时间超时      timeout
        3、如果在超时时间内,查到结果就不需要继续查询!
    """
    
    # 2、查询申诉请求的结果,使用请求接口的返回id去查询
    def get_order_result(orderID, interval=3, timeout=20):
        """
        :param orderID:  订单id
        :param interval: 频率    s
        :param timeout:  超时时间 s
        :return:
        """
        url = f"{HOST}/api/order/get_result01/"
        payload = {"order_id": orderID}
        # 1、开始时间
        startTime = time.time()  # 获取当时时间  s单位
        # 2、结束时间
        endTime = startTime + timeout
        # 3、选择循环!
        # while   靠条件结束
        # for     知道循环次数或遍历操作
        cnt = 0   # 计数变量
        while time.time() < endTime:
            resp = requests.get(url, params=payload)
            cnt += 1
            if resp.text:  # 有响应数据就结束循环!
                print(f"第{cnt}次查询,已经有查询结果>>> ", resp.text)
                break
            else:
                print(f"第{cnt}次查询,没有结果,请稍等...")
    
            # 4、设置频率
            time.sleep(interval)  # 间隔多久运行一次
        print("查询完成")
        return resp.text
    
    
    
    if __name__ == '__main__':
        # 1、获取id
        id = create_order()
        print(id)
        # 2、查询结果
        # res = get_order_result(id)
        # print(res)
    
        """
        t1 = threading.Thread()  创建线程方法
        target                   希望把哪一个函数作为子线程
        args                     这个函数的实参
        """
        t1 = threading.Thread(target=get_order_result, args=(id,))
    
        # 设置守护线程  主线程退出了,子线程get_order_result 也退出
        t1.setDaemon(True)
        # 启动线程
        t1.start()
        """
        扩展知识点:多线程技术
        并发:
        并行:
            1- io密集型   阻塞
                sleep()  requests库
            2- cpu密集型  计算型,这个多线程不一定省时间!
    
        预期效果:
            希望在异步查询等待3s的时间里可以去执行其他模块接口!
        """
        for one in range(10):
            time.sleep(1)
            print(f'{one}-----我正在执行其他模块的自动化测试----')
    
    
    
    展开全文
  • Spring junit test mock模拟http接口测试

    千次阅读 2018-11-29 15:15:12
    很多时候对项目中的api接口大多是启动项目后用浏览器调用一下接口进行测试,或者用swagger,还有postman等工具,其实在单测里面也可以模拟浏览器进行接口测试。 先定义一个api接口, @RequestMapping(value = "...

    很多时候对项目中的api接口大多是启动项目后用浏览器调用一下接口进行测试,或者用swagger,还有postman等工具,其实在单测里面也可以模拟浏览器进行接口测试。

    先定义一个api接口,

    @RequestMapping(value = "/mockTest", method = RequestMethod.GET)
    @ResponseBody
        public String mock(
                @RequestParam(value = "name") String name
        ) {
            return "参数:" + name;
        }
    

    在单测类里面,添加mock对象

    	private MockMvc mockMvc;
    	
        @Autowired
        private WebApplicationContext context;
    
    
        @Before
        public void before() throws Exception {
            mockMvc = MockMvcBuilders.webAppContextSetup(context).build();
        }
    
        @Test
        public void testMock() throws Exception {
            mockMvc.perform(
                    MockMvcRequestBuilders.get("/mockTest")
                            .param("name", "demo")
            )
                    .andExpect(MockMvcResultMatchers.status().isOk())
                    .andDo(MockMvcResultHandlers.print())
            ;
        }
    
    展开全文
  • 1.接口测试等待开发完成接口开发之后再进行,不符合测试的尽早测试的基本原则,我们可以利用MOCK工具来模拟接口,减少对开发的依赖,从而可使测试与开发同步进行 2.接口存在很多依赖关系,现实中,由于一些客观的...
  • 使用mock进行接口模拟测试

    万次阅读 2018-01-30 22:53:07
    以前我的解决方法是搭建一个本地的服务器,然后来手动修改数据,后来接口返回的数据量比较大,用起来很不方便,今天突然发现使用mock.js进行数据接口数据模拟非常好处,下面是使用mock模拟的一个简单的入门实例: ...

    在工作中,后台一般会在接口开发之前提供接口文档,约定好接口返回的数据格式,以前我的解决方法是搭建一个本地的服务器,然后来手动修改数据,后来接口返回的数据量比较大,用起来很不方便,今天突然发现使用mock.js进行数据接口数据模拟非常好处,下面是使用mock模拟的一个简单的入门实例:

    <!DOCTYPE html>
    <html lang="zh">
    <head>
      <meta charset="UTF-8" />
      <meta name="viewport" content="width=device-width, initial-scale=1.0" />
      <meta http-equiv="X-UA-Compatible" content="ie=edge" />
      <title>Document</title>
    </head>
    
    <body>
      <script src="//cdn.bootcss.com/Mock.js/1.0.0/mock-min.js"></script>
      <script src="//cdn.bootcss.com/zepto/1.2.0/zepto.min.js"></script>
      <script type="text/javascript">
        var url = 'http://api.com'
        var data = Mock.mock(url, {
          "user|5-10": [{
            'name': '@cname', //中文名称
            'age|1-100': 100, //100以内随机整数
            'birthday': '@date("yyyy-MM-dd")', //日期
            'city': '@city(true)' //中国城市
          }]
        });
        $.ajax({
          url: url,
          type: 'post',
          contentType: 'text/plain',
          dataType: 'json',
          success: function(res) {
            console.log(res)
          }
        });
      </script>
    </body>
    </html>
    
    
    

    参考:
    1. 官网
    2. 简书

    展开全文
  • Mock接口测试

    2021-04-16 17:02:50
    项目需要用到第三方接口,如果第三方接口未开发好,或者第三方接口没有测试环境,为了保证进度,需要模拟接口用于调试。 3、如何mock? 可以利用抓包工具比如fiddler;可以利用web框架模拟;Django Flask(python w

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

    2、mock作用
    前后端开发进度不一致,如果前端开发速度快于后端,需要一个假的接口用于模拟后端返回;
    项目需要用到第三方接口,如果第三方接口未开发好,或者第三方接口没有测试环境,为了保证进度,需要模拟接口用于调试。

    3、mock不足
    mock的模拟行为与真实行为可能存在差异(返回结果是自己构造的),其结果就是虽然基于mock的测试通过了,但是基于真实对象的测试可能会存在失败。

    Mock 一个 Server ,构造一个假的服务返回预期的结果,也是为了进行自己的测试。主要适用于接口&性能测试,Mock 方案和程序使用的语言无关,可以用 Java 实现,也可以用 Python 实现等。

    Flask的特点是:结构简单,容易入门,利用Flask编写一个最简单的接口,如果没有Flask,则需要安装;
    Flask的安装

    pip install flask
    

    如果pip没有安装的话,先执行如下代码进行安装pip:

    curl https://bootstrap.pypa.io/get-pip.py | python3
    

    安装成功,可以通过

    pip --version
    

    查看pip的版本。

    下面是Mock 一个 Server ,构造一个假的服务返回预期的结果。
    服务端代码:

    
    from flask import Flask,request,json
    
    app=Flask(__name__)
    
    @app.route('/trade/purchase' ,methods=['POST'])
    def purchase():
        res=json.loads(request.get_data())
        out_trade_no=res['out_trade_no']
        data = {
            'code':'400004',
            'msg':'Business Failed',
            'sub_code':'ACQ.TRADE_HAS_SUCCESS',
            'sub_msg':'交易已被支付',
            'trade_no':'222222222222',
            'out_trade_no':'20150320010101002'
        }
        data['out_trade_no'] = out_trade_no
        if out_trade_no != '20150320010101002':
            return {'code':'404','msg':'请求失败!'}
    
        return data
    
    if __name__  ==  '__main__':
        app.run('127.0.0.1', '9999')
    

    客户端代码:

    import requests
    
    data={
        'out_trade_no':'20150320010101001',
        'auth_code':'28763443843945664',
        'buyer_id':'2088201954065786',
        'seller_id':'2088102146225135',
        'subject':'Iphone6',
        'total_amount':'88.88',
    }
    
    resp=requests.post('http://127.0.0.1:9999/trade/purchase',json=data)
    print(resp.json())
    

    运行截图:
    在这里插入图片描述
    通过对真实的调用信息进行发起请求,生成模拟的返回结果,大大简化了测试对调用接口的依赖,大大提高测试效率。

    展开全文
  • Mock测试(接口测试)

    2021-04-26 19:06:46
    一、关于Mock测试 1、什么是Mock测试 Mock 测试就是在测试过程中,对于某些不容易构造或者不容易获取的比较...Mock 最大的功能是帮你把单元测试的耦合分解开,如果你的代码对另一个类或者接口有依赖,它能够帮你模拟
  • MOCK SERVER 接口模拟

    2019-03-28 11:09:00
    这种情况下,使用mock server来mock这些接口,以便开发和测试能够正常进行。 工具选型 moco Moco is an easy setup stub framework. 安装 首先请安装jdk Standalone Moco Runner ...
  • 1 mock测试 mock 的意思是模拟,模拟出一个我们预期的对象。...前后端分离开发过程中,前端开发完成但后端未开发完成接口未提供,可以通过mock模拟接口辅助前后端代码联调。 后端开发过程中,A接口依赖于...
  • 1:Mock简介 1.1:Mock可以做什么 Mock可以模拟一个http接口的后台响应,就这么简单,可以模拟request、response ...2:Mock模拟一个Get请求 2.1:Mock模拟一个不带参数的Get请求 2.1.1:创建json文件 Test....
  • MockMultipartFile的第一个是请求接口的参数名,跟api的接口参数对应fileupload 控制器的接口为 /** * 共用上传附件等--信息 */ @PostMapping("/uploadEnclosure") @ResponseBody public R uploadEnclosure(@...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 837
精华内容 334
关键字:

mock模拟接口测试