mock模拟接口测试

一、为什么要使用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}-----我正在执行其他模块的自动化测试----')


  • 7
    点赞
  • 70
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值