zoukankan      html  css  js  c++  java
  • 浅谈mock技术

    什么是mock?

    举一个例子来介绍:在当今,很多项目都是前后端分离的,前端和后端开发好接口后需要联调,前端工程师不可能等到后端工程师完全开发完成再开始联调,而是会利用一个mock技术来模拟后端返回的数据,来完成前端的开发。

    moco介绍

    Moco 是类似一个Mock的工具框架,一个简单搭建模拟服务器的程序库/工具,下载就是一个JAR包。有如下特点:

    • 只需要简单的配置request、response等即可满足要求;
    • 支持http、https、socket协议,可以说是非常的灵活性;
    • 支持在request中设置uri, method, headers, queries, Cookies, forms等;
    • 对GET、POST、PUT、DELETE等请求方式都支持;
    • 无需环境配置,有Java环境即可,修改配置后,无需重启,立刻生效;
    • 支持多种数据格式,如JSON、Text、XML、File等;
    • 可与其他工具集成,如Junit、Maven等。

    下载moco

    给一个github源码的地址:(PS: 这里需要手动打成jar包。)

    https://github.com/dreamhead/moco

    配置json文件

    因为我们要把这些请求数据和响应数据都写在这个json文件里面,所以事先要先写好,才能启moco服务。
    新建一个json文件,文件名随便写一个,内容如下:

    [ 
    {
    	"description":"demo1:直接访问http://127.0.0.1:port端口号/demo1",
    	"request":{
    		"method":"GET",
    		"uri":"/demo1"
    		},
    	"response":{
    		"text":"Hello,demo1"
    	}
    }]
    

    命令行启动moco

    这里有一个大前提:需要安装好jdk环境,最好版本>=1.8
    命令窗口cd到json文件(我这里的json文件就是test.json)、jar包所在的目录,执行:
    java -jar moco-runner-1.1.0-standalone.jar http -p 6666 -c test.json
    有以下输出,表示服务启动成功:

    C:UsersAdministratorDownloadsmock>cd C:UsersAdministratorDownloadsmock
    
    C:UsersAdministratorDownloadsmock>java -jar moco-runner-1.1.0-standalone.jar http -p 5555 -c test.json
    06 七月 2020 18:17:58 [main] INFO  Server is started at 6666
    06 七月 2020 18:18:00 [main] INFO  Shutdown port is 11385
    

    其中:

    • -jar 就是表示那个jar包;
    • http 表示http协议的接口;
    • -p 端口号;
    • -c 后面跟的是json文件;
      注意:这里的5555端口号可以任意用,但不要和其他已经使用的端口冲突就行。
      此时,我们来试着用浏览器访问下:http://127.0.0.1:5555/demo1

      这样我们一个get请求的响应值就模拟成功了。

    配置不同的请求

    配置uri

    {
    	"description":"demo1:http://127.0.0.1:5555/demo1",
    	"request":{
    		"method":"GET",
    		"uri":"/demo1"
    		},
    	"response":{
    		"text":"Hello,demo1"
    	}
    }
    

    配置params

    {
    	"description":"demo2:http://127.0.0.1:5555/demo2?key1=abc&key2=123",
    	"request":{
    		"queries":{
    			  "username":"XXX",
    			  "password":"123456"
    		          },
    		"method":"GET",
    		"uri":"/demo2"
    		},
    	"response":{
    		"text":"Hello,demo2"
    	}
    }
    

    配置method

    {
    	"description":"demo3:配置method",
    	"request":{
    		  "method":"DELETE"
    		  },
    	"response":{
    		"text":"Hello,demo3"
    	}
    }
    

    配置request_headers

    {
    	"description":"demo4:配置request_headers",
    	"request":{
    		"headers":{
    			  "Content-Type":"application/json"
    			  }
    		},
    	"response":{
    		"text":"Hello,demo4"
    	}
    }
    

    配置请求体参数form

    {
    	"description":"demo5:配置请求体参数form",
    	"request":{
    		"forms":{
    			"username":"XXX"
    			}
    		},
    	"response":{
    		"text":"Hello,demo5"
    	}
    }
    

    配置请求参数json

    {
    	"description":"demo6:配置请求体参数json",
    	"request":{
    		"json":{
    			"username":"XXXX",
    			"password":"123456"
    			}
    		},
    	"response":{
    		"text":"Hello,demo6"
    	}
    }
    

    配置uri已XX开头

    {
    	"description":"demo7:uri-startsWith匹配",
    	"request":{ 
    		"uri":{
    			"startsWith":"/test"
    		      }
    		},
    	"response":{
    		"text":"Hello,demo7"
    	}
    }
    

    配置uri已XX结尾

    {
    	"description":"demo8:uri-endsWith匹配",
    	"request":{ 
    		"uri":{
    			"endsWith":"test"
    		      }
    		},
    	"response":{
    		"text":"Hello,demo8"
    	}
    }
    

    配置uri包含XX

    {
    	"description":"demo9:uri-contain匹配",
    	"request":{ 
    		"uri":{
    			"contain":"test"
    		      }
    		},
    	"response":{
    		"text":"Hello,demo9"
    	}
    }
    

    响应码

    {
    	"description":"demo10:status_code",
    	"request":{ 
    		"uri":"/demo10"
    		},
    	"response":{
    		"status":400
    	}
    }
    

    响应头

    {
    	"description":"demo11:response_headers",
    	"request":{ 
    		"uri":"/demo11"
    		},
    	"response":{
    		"headers":{
    			"Content-Type":"application/json"
    		}
    	}
    }
    

    重定向

    {
    	"description":"demo12:redirectTo",
    	"request":{ 
    		"uri":"/demo12"
    		},
    	"redirectTo":"https://www.baidu.com"
    	
    }
    

    返回json类型数据

    {
            "description":"demo13:返回json格式的数据",
            "request":{
                    "uri":"/demo13"
                    },
            "response":{
                       "json":{"username":"XXXX","password":"123456"}
                       }
    }
    

    mock实战

    参考接口文档,写一个登录接口:

    {
    	"description":"登录接口",
    	"request":{ 
            "method":"POST",
    		"uri":"/XXX/XXX/loginReq",
            "headers":{
    	          "Content-Type":"application/x-www-form-urlencoded"
    	          },
            "forms":{
    			"username":"XXXX",
    			"password":"XXXXXXXXX"
                }
            },
    	"response":{
    		"headers":{
    			"Content-Type":"application/json"
                },
            "status":200,
            "json":{
                    "retcode":0
                }
            
            }
    }
    

    Python代码如下:

    import requests
    url = "http://127.0.0.1:5555/XXX/XXX/loginReq"
    data = {"username": "XXXX", "password": "XXXXXXXXX"}
    headers = {"Content-Type": "application/x-www-form-urlencoded"}
    
    res = requests.post(url=url, data=data, headers=headers)
    print(res.text)
    

    运行结果:

    {"retcode":0}
    

    cmd里面打印的内容:

    06 七月 2020 20:33:24 [pool-1-thread-241] INFO  Request received:
    
    POST /XXX/XXX/loginReq HTTP/1.1
    Accept: */*
    User-Agent: python-requests/2.22.0
    Connection: keep-alive
    Host: 127.0.0.1:5555
    Accept-Encoding: gzip, deflate
    Content-Length: 32
    Content-Type: application/x-www-form-urlencoded
    
    username=XXXX&password=XXXXXXXXX
    
    06 七月 2020 20:33:24 [pool-1-thread-241] INFO  Response return:
    
    HTTP/1.1 200
    Content-Length: 13
    Content-Type: application/json
    
    {"retcode":0}
    

    Mock测试技术总结

    Moco还可以通过在json文件中添加cookies、header、重定向这些参数,来模拟各种情况下的请求和返回值,可以根据自己工作的需求去对这些东西进行了解。
    Moco是热更新的,所以启动了jar包的服务之后,即使修改了json文件中的内容,也不需要重启服务就生效。
    掌握了mock测试的技术,可以让我们在开发没有完成对应接口的时候,有接口文档就提前进入到测试状态,是现在敏捷模式下不可或缺的技术,也是持续集成中一个重要的组成部分。
    好了,mock初识到此结束。

  • 相关阅读:
    hiberate关系映射大全
    SpringMVC+RestFul详细示例实战教程
    [转]为什么大型网站前端使用 PHP 后台逻辑用 Java?
    offsetWidthoffsetleft 等图文解释
    理解jquery的$.extend()、$.fn和$.fn.extend()
    使用jquery获取url及url参数的方法
    构建高并发高可用的电商平台架构实践
    jquery实现多条件筛选特效代码分享
    【转载】“活在当下”是什么含义呢?
    UL LI 布局 TAB 切换条
  • 原文地址:https://www.cnblogs.com/tedliu/p/13255814.html
Copyright © 2011-2022 走看看