json schema生成工具_服务端测试之PostMan自动生成测试脚本

在使用PosMan做服务端的自动化测试中,简单的地方在于也是工具,我们可以把测试用例加到一个Collection中,但是随着测试用例越来越多,以及工作的需求,我们需要把PostMan中的测试用例需要迁移到脚本的方式实现,平常的迁移思路是我们在脚本里面把之前的接口测试用例重新实现,这样相对而言它的成本是比较高的,特别是涉及的自动化测试用例特别多的时候。我们可以把Collection里面的测试用例导入出来,它是JSON的文件,然后我们解析这些JSON文件,让它自动的转成Python测试代码,从而轻松的完成这样的一个过程。被测试的API代码如下:
#!/usr/bin/env python
#!coding:utf-8
from flask import Flask,jsonify
from flask_restful import Api,Resource
app=Flask(__name__)
api=Api(app)
class LoginView(Resource):
def get(self):
return {'status':0,'msg':'ok','data':'this is a login page'}
def post(self):
parser=reqparse.RequestParser()
parser.add_argument('username', type=str, required=True, help='用户名不能为空')
parser.add_argument('password',type=str,required=True,help='账户密码不能为空')
parser.add_argument('age',type=int,help='年龄必须为正正数')
parser.add_argument('sex',type=str,help='性别只能是男或者女',choices=['女','男'])
args=parser.parse_args()
return jsonify(args)
api.add_resource(LoginView,'/login',endpoint='login')
if __name__ == '__main__':
app.run(debug=True)
在PostMan里面创建Collection名称login,里面的接口测试用例具体如下:

v2-fa486b98ce78c490029556644cc6597a_b.jpg


在PostMan里面导出该Collection,命名为login.json,login.json文件的内容为:
{
"info": {
"_postman_id": "982a3108-6710-4a71-aaf8-e62a00d1813c",
"name": "login",
"schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
},
"item": [
{
"name": "校验用户名不能为空",
"request": {
"method": "POST",
"header": [
{
"key": "Content-Type",
"name": "Content-Type",
"value": "application/json",
"type": "text"
}
],
"body": {
"mode": "raw",
"raw": "{nt"password":"admin",nt"sex":"男",nt"age":18n}",
"options": {
"raw": {
"language": "json"
}
}
},
"url": {
"raw": "http://localhost:5000/login",
"protocol": "http",
"host": [
"localhost"
],
"port": "5000",
"path": [
"login"
]
}
},
"response": []
},
{
"name": "校验密码不能为空",
"request": {
"method": "POST",
"header": [
{
"key": "Content-Type",
"name": "Content-Type",
"value": "application/json",
"type": "text"
}
],
"body": {
"mode": "raw",
"raw": "{nt"username":"wuya",nt"sex":"男",nt"age":18n}",
"options": {
"raw": {
"language": "json"
}
}
},
"url": {
"raw": "http://localhost:5000/login",
"protocol": "http",
"host": [
"localhost"
],
"port": "5000",
"path": [
"login"
]
}
},
"response": []
},
{
"name": "校验性别参数不是男或者女",
"request": {
"method": "POST",
"header": [
{
"key": "Content-Type",
"name": "Content-Type",
"value": "application/json",
"type": "text"
}
],
"body": {
"mode": "raw",
"raw": "{nt"username":"wuya",nt"password":"admin",nt"sex":"asdf",nt"age":18n}",
"options": {
"raw": {
"language": "json"
}
}
},
"url": {
"raw": "http://localhost:5000/login",
"protocol": "http",
"host": [
"localhost"
],
"port": "5000",
"path": [
"login"
]
}
},
"response": []
},
{
"name": "校验年龄不是正整数",
"request": {
"method": "POST",
"header": [
{
"key": "Content-Type",
"name": "Content-Type",
"value": "application/json",
"type": "text"
}
],
"body": {
"mode": "raw",
"raw": "{nt"username":"wuya",nt"password":"admin",nt"sex":"男",nt"age":"rrest"n}",
"options": {
"raw": {
"language": "json"
}
}
},
"url": {
"raw": "http://localhost:5000/login",
"protocol": "http",
"host": [
"localhost"
],
"port": "5000",
"path": [
"login"
]
}
},
"response": []
},
{
"name": "校验登录成功",
"request": {
"method": "POST",
"header": [
{
"key": "Content-Type",
"name": "Content-Type",
"value": "application/json",
"type": "text"
}
],
"body": {
"mode": "raw",
"raw": "{nt"username":"wuya",nt"password":"admin",nt"sex":"男",nt"age":"18"n}",
"options": {
"raw": {
"language": "json"
}
}
},
"url": {
"raw": "http://localhost:5000/login",
"protocol": "http",
"host": [
"localhost"
],
"port": "5000",
"path": [
"login"
]
}
},
"response": []
}
],
"protocolProfileBehavior": {}
}
本质上而言,它就是一个JSON文件,使用Python文件对它进行反序列化处理成字典数据类型,然后操作字典,这个过程相对来说不难,具体实现的代码如下:
#!/usr/bin/env python
#!coding:utf-8
import requests
import json
import pytest
def operationJson():'''对login.json文件进行处理'''
return json.load(open('login.json','r'))['item']
@pytest.mark.parametrize('datas',operationJson())
def test_api_login(datas):'''登录API的校验测试'''
r=requests.request(
method=datas['request']['method'],
url=datas['request']['url']['raw'],
json=json.loads(datas['request']['body']['raw']))
print(json.dumps(r.json(),ensure_ascii=False))
if __name__ == '__main__':
pytest.main(["-s","-v","test_login.py"])
使用Pytest框架的参数化几行代码就可以搞定了,当然断言需要单独的加。这个过程的思路其实非常简单,就是对JSON的文件处理成字典,然后利用Pytest框架的参数化来循环处理。当然可以把JSON文件简单的添加下断言,就更加智能化,添加的内容添加到response的里面内容,对login.json都在里面添加下验证点,完善后的文件内容为:
{
"info": {
"_postman_id": "982a3108-6710-4a71-aaf8-e62a00d1813c",
"name": "login",
"schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
},
"item": [
{
"name": "校验用户名不能为空",
"request": {
"method": "POST",
"header": [
{
"key": "Content-Type",
"name": "Content-Type",
"value": "application/json",
"type": "text"
}
],
"body": {
"mode": "raw",
"raw": "{nt"password":"admin",nt"sex":"男",nt"age":18n}",
"options": {
"raw": {
"language": "json"
}
}
},
"url": {
"raw": "http://localhost:5000/login",
"protocol": "http",
"host": [
"localhost"
],
"port": "5000",
"path": [
"login"
]
}
},
"response":
{
"message": {
"username": "用户名不能为空"
}
}
},
{
"name": "校验密码不能为空",
"request": {
"method": "POST",
"header": [
{
"key": "Content-Type",
"name": "Content-Type",
"value": "application/json",
"type": "text"
}
],
"body": {
"mode": "raw",
"raw": "{nt"username":"wuya",nt"sex":"男",nt"age":18n}",
"options": {
"raw": {
"language": "json"
}
}
},
"url": {
"raw": "http://localhost:5000/login",
"protocol": "http",
"host": [
"localhost"
],
"port": "5000",
"path": [
"login"
]
}
},
"response":
{
"message": {
"password": "账户密码不能为空"
}
}
},
{
"name": "校验性别参数不是男或者女",
"request": {
"method": "POST",
"header": [
{
"key": "Content-Type",
"name": "Content-Type",
"value": "application/json",
"type": "text"
}
],
"body": {
"mode": "raw",
"raw": "{nt"username":"wuya",nt"password":"admin",nt"sex":"asdf",nt"age":18n}",
"options": {
"raw": {
"language": "json"
}
}
},
"url": {
"raw": "http://localhost:5000/login",
"protocol": "http",
"host": [
"localhost"
],
"port": "5000",
"path": [
"login"
]
}
},
"response":
{
"message": {
"sex": "性别只能是男或者女"
}
}
},
{
"name": "校验年龄不是正整数",
"request": {
"method": "POST",
"header": [
{
"key": "Content-Type",
"name": "Content-Type",
"value": "application/json",
"type": "text"
}
],
"body": {
"mode": "raw",
"raw": "{nt"username":"wuya",nt"password":"admin",nt"sex":"男",nt"age":"rrest"n}",
"options": {
"raw": {
"language": "json"
}
}
},
"url": {
"raw": "http://localhost:5000/login",
"protocol": "http",
"host": [
"localhost"
],
"port": "5000",
"path": [
"login"
]
}
},
"response":
{
"message": {
"age": "年龄必须为正正数"
}
}
},
{
"name": "校验登录成功",
"request": {
"method": "POST",
"header": [
{
"key": "Content-Type",
"name": "Content-Type",
"value": "application/json",
"type": "text"
}
],
"body": {
"mode": "raw",
"raw": "{nt"username":"wuya",nt"password":"admin",nt"sex":"男",nt"age":"18"n}",
"options": {
"raw": {
"language": "json"
}
}
},
"url": {
"raw": "http://localhost:5000/login",
"protocol": "http",
"host": [
"localhost"
],
"port": "5000",
"path": [
"login"
]
}
},
"response":
{
"age": 18,
"password": "admin",
"sex": "男",
"username": "wuya"
}
}
],
"protocolProfileBehavior": {}
}
继续完善测试代码,增加接口的断言,完善后的代码如下:
#!/usr/bin/env python
#!coding:utf-8
import requests
import json
import pytest
def operationJson():'''对login.json文件进行处理'''
return json.load(open('login.json','r'))['item']
@pytest.mark.parametrize('datas',operationJson())
def test_api_login(datas):'''登录API的校验测试'''
# print(type(datas['response']))
r=requests.request(
method=datas['request']['method'],
url=datas['request']['url']['raw'],
json=json.loads(datas['request']['body']['raw']))
assert r.json()==datas['response']
if __name__ == '__main__':
pytest.main(["-s","-v","test_login.py"])
执行如上的测试代码,见如下图展示的执行结果信息:

v2-41a95dcb86f2326d9569a5a9d01f5f2d_b.jpg


依据如上,很轻松的实现了PostMan里面的接口测试用例自动的转成了Python的测试脚本,而且带了断言的信息。

http://weixin.qq.com/r/z0i4oNLEPo9BrZbD9x3d (二维码自动识别)

Python接口自动化测试实战 - 网易云课堂​study.163.com 《Python自动化测试实战》(无涯)【摘要 书评 试读】- 京东图书​item.jd.com
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值