10-Mock技术

一、Mock技术简介

 在软件测试过程中,对于一些不容易构造、获取的对象,用一个虚拟的对象来替代它,以达到相同的效果,这个虚拟的对象就是Mock对象。Mock对象就是真实对象在调试期间的代替品。

Moco框架

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

Moco框架特点:

  • 简单配置requests、response即可满足要求
  • 支持http、https、socket协议
  • 支持request中设置headers、cookies、statusCode
  • 支持GET、POST、PUT、DELETE方法
  • 使用Java环境
  • 修改配置后,即刻生效
  • 支持多种数据格式:JSON、Text、XML、File等
  • 可与其他工具集成:Junit

二、Moco服务环境搭建

1、Moco服务搭建

步骤1: Moco项目是采用java开发的,所以需要安装jdk
步骤2: 官网下载Moco的jar包https://repo1.maven.org/maven2/com/github/dreamhead/moco-runner/1.1.0/

2、Moco服务运行

在jar包的地址栏中,cmd进入命令窗口并输入:
java -jar moco-runner-1.1.0-standalone.jar http -p 9090 -c test.json

其中:

  • moco-runner-1.1.0-standalone.jar 需要按照自己jar包名填写
  • http  代表模拟的是http请求
  • -p 9090  定义端口号
  • -c test.json  就是用来模拟发请求的的json文件,这个文件需要放在jar包同一文件夹下

如下表示Moco服务已启动:
在这里插入图片描述
test.json文件内容:
在这里插入图片描述
浏览器发起请求:http://localhost:9090/demo ,访问成功,完成模拟:
在这里插入图片描述

三、Moco技术构建请求

1、约定URI

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

2、约定请求参数

[
	{
    
    
		"description": "demo2=约定请求参数",
		"request": {
    
    
			"uri": "/demo2",
			"queries": {
    
    
				"key1": "abc",
				"key2": "123"
			}
		},
		"response": {
    
    
			"text": "Hello,marry2"
		}
	}
]

3、约定请求方法

[
	{
    
    
		"description": "demo3=约定请求方法",
		"request": {
    
    
			"uri": "/demo3",
			"method": "POST"
		},
		"response": {
    
    
			"text": "Hello,marry3"
		}
	}
]

4、约定请求头

[
	{
    
    
		"description": "demo4=约定请求头",
		"request": {
    
    
			"uri": "/demo4",
			"headers": {
    
    
				"Content-Type": "application/xml"
			}
		},
		"response": {
    
    
			"text": "Hello,marry4"
		}
	}
]

5、约定请求体参数-form

[
	{
    
    
		"description": "demo5=约定请求体参数form",
		"request": {
    
    
			"uri": "/demo5",
			"forms": {
    
    
				"key1": "abc"
			}
		},
		"response": {
    
    
			"text": "Hello,marry5"
		}
	}
]

6、约定请求体参数-json

[
	{
    
    
		"description": "demo6=约定请求体参数json",
		"request": {
    
    
			"uri": "/demo6",
			"json": {
    
    
				"key1": "value1",
				"key2": "value2"
			}
		},
		"response": {
    
    
			"text": "Hello,marry6"
		}
		}
	}
]

7、uri-startsWith匹配、uri-endsWith匹配、uri-contain包含

[
	{
    
    
		"description": "demo7=uri-startsWith匹配",
		"request": {
    
    
			"uri": {
    
    
				"startsWith": "/demo7"
			}
		},
		"response": {
    
    
			"text": "Hello,marry7"
		}
	},
	{
    
    
		"description": "demo8=uri-endsWith匹配",
		"request": {
    
    
			"uri": {
    
    
				"endsWith": "/demo8"
			}
		},
		"response": {
    
    
			"text": "Hello,marry8"
		}
	},
	{
    
    
		"description": "demo9=uri-contain匹配",
		"request": {
    
    
			"uri": {
    
    
				"contain": "/demo9"
			}
		},
		"response": {
    
    
			"text": "Hello,marry9"
		}
	}
]

8、返回状态码

[
	{
    
    
		"description": "demo10=返回状态码",
		"request": {
    
    
			"uri": "/demo10"
		},
		"response": {
    
    
			"status": 200
		}
	}
]

9、返回响应头

[
	{
    
    
		"description": "demo11=返回响应头",
		"request": {
    
    
			"uri": "/demo11"
		},
		"response": {
    
    
			"headers": {
    
    
				"Content-Type": "application/json"
			}
		}
	}
]

10、重定向

[
	{
    
    
		"description": "demo12=重定向",
		"request": {
    
    
			"uri": "/demo12"
		},
		"redirectTo": "http://www.baidu.com"
	}
]

11、返回JSON格式的数据

[
	{
    
    
		"description": "demo13=返回JSON格式的数据",
		"request": {
    
    
			"uri": "/demo13"
		},
		"response": {
    
    
			"json": {
    
    
				"key1": "value1",
				"key2": "value2"
			}
		}
	}
]

四、测试接口实战

案例:模拟两个接口:提交生成订单申请、查询订单结果接口,第一个接口返回订单id,供第二个接口使用

# 1、test.json文件,模拟后端接口
{
    
    
		"description": "1-提交生成订单申请",
		"request": {
    
    
			"uri": "/api/order/create/",
			"json": {
    
    
				"user_id": "user1",
				"goods_id": "1234",
				"num": 1,
				"amount": 100
			}
		},
		"response": {
    
    
			"json": {
    
    
				"order_id": "6666"
			}
		}
	},
	{
    
    
		"description": "2-查询订单结果接口",
		"request": {
    
    
			"uri": "/api/order/get_result/",
			"queries": {
    
    
				"order_id": "6666"
			}
		},
		"response": {
    
    
			"json": {
    
    
				"user_id": "user1",
				"goods_id": "1234",
				"num": 1,
				"amount": 100,
				"msg": "success"
			}
		}
	}
# 2、测试代码
import requests
import time

Host = "http://127.0.0.1:9090"

#提交订单接口
def create_oredr():
    url = f'{Host}/api/order/create/'
    inData = {
    
    "user_id": "user1","goods_id": "1234","num": 1,"amount": 100}
    req = requests.post(url,json=inData)
    return req.json()['order_id']

#查询订单结果接口
def get_oredr_result(orderId,interval = 3,timeout = 20):  #interval 频率   timeout 超时
    url = f'{Host}/api/order/get_result/'
    inData = {
    
    "order_id": orderId}
    # 1- 查询开始计时间
    startTime = time.time()
    # 2- 询开始计时间
    endTime = startTime + timeout
    cnt = 0  #计算查询次数
    while time.time()<endTime:
        req = requests.get(url,params=inData)
        cnt+=1
        print(f'第{cnt}次查询,等待响应...',req.text)
        if req.text:  #如果再超时范围内,提前有返回的,就不查询
            break
        time.sleep(interval)
    return req.text


if __name__ == '__main__':
    orderId = create_oredr()
    print(get_oredr_result(orderId))

url及参数传入正确时,正常返回数据:
在这里插入图片描述

url及参数传入错误时,会间隔3s再次查询,超过20s结束进程:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_45128456/article/details/113258851