PostMan接口测试用例自动转成Python的测试脚本
作者:无涯技术博客
在使用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,里面的接口测试用例具体如下:
在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": "{\n\t\"password\":\"admin\",\n\t\"sex\":\"男\",\n\t\"age\":18\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": "{\n\t\"username\":\"wuya\",\n\t\"sex\":\"男\",\n\t\"age\":18\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": "{\n\t\"username\":\"wuya\",\n\t\"password\":\"admin\",\n\t\"sex\":\"asdf\",\n\t\"age\":18\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": "{\n\t\"username\":\"wuya\",\n\t\"password\":\"admin\",\n\t\"sex\":\"男\",\n\t\"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": "{\n\t\"username\":\"wuya\",\n\t\"password\":\"admin\",\n\t\"sex\":\"男\",\n\t\"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": "{\n\t\"password\":\"admin\",\n\t\"sex\":\"男\",\n\t\"age\":18\n}", "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": "{\n\t\"username\":\"wuya\",\n\t\"sex\":\"男\",\n\t\"age\":18\n}", "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": "{\n\t\"username\":\"wuya\",\n\t\"password\":\"admin\",\n\t\"sex\":\"asdf\",\n\t\"age\":18\n}", "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": "{\n\t\"username\":\"wuya\",\n\t\"password\":\"admin\",\n\t\"sex\":\"男\",\n\t\"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": "{\n\t\"username\":\"wuya\",\n\t\"password\":\"admin\",\n\t\"sex\":\"男\",\n\t\"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"])
执行如上的测试代码,见如下图展示的执行结果信息:
依据如上,很轻松的实现了PostMan里面的接口测试用例自动的转成了Python的测试脚本,而且带了断言的信息。
到此这篇关于PostMan接口测试用例自动转成Python的测试脚本的文章就介绍到这了,更多相关PostMan自动生成Python测试脚本内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!