【Python接口测试

您所在的位置:网站首页 python接口api 【Python接口测试

【Python接口测试

2023-04-08 13:48| 来源: 网络整理| 查看: 265

因为所有接口都是依赖登录接口的用户信息,所以不管是使用JMeter、APIPost还是Python,都是要从登录接口开始调试,调通登录接口拿到用户信息,才能开展后续的测试。

笔者也是最近开始学习python和unittest,所以从测试的项目入手来学习和实践, 实践过程中也是不断摸索和尝试的。Python的入门教程可以学习这个菜鸟教程,比较基础,适合新手。

关于JMeter和ApiPost的,可以参考笔者其他的文章,调试的是同一个登录接口,相关的文章链接如下,有兴趣的可以移步去浏览。

第一步:抓包登录接口的参数和返回数据

可以通过Fiddler抓包,查看登录接口的请求参数和返回数据。返回的json数据里,data中的uuid和token作为用户认证信息,在其他所有接口测试中需要引用在header信息中,所以我们需要通过代码将这两个数据提取并拼接到header中。

第二步:存储一些常量数据

环境信息、常用用户信息可以通过常量存储起来,在编码过程中直接引用。这边我建了一个settings的文件夹:

这个结构在学习时照着创建的# 不同项目的环境 class Environment(object): DEFAULT = "默认" QY= "XX" AQ = "XXX" DY = 'XXXX' # 默认环境(这样写的意义是,如果有不同环境或者不同项目要切换测试,可以方便切换) ENVIRONMENT = Environment.QY # 默认可以随意替换,其他的可以修改 ENVIRONMENT的当前赋值指向相应的测试环境或者项目环境 if ENVIRONMENT == Environment.DEFAULT: base_url = '---' login_in_users = { "loginId": "sxqy", "password": "Sxqy@2022", "login": "" } elif ENVIRONMENT == Environment.QY: base_url = '--' login_in_users = { "loginId": "sxqy", "password": "Sxqy@2022", "login":"nPwWBACyfxGu/BKCB610YoLM2nvvoyow7vCjHw8+QnrJU5B3NPtcmcd/k4iR7mZc" } LOGIN_URL = "%s/GateWayPC/LoginAndSetting/login" %base_url # XX平台登录地址 第三步:编码调试1. unittest-testcase:testman.py

既然要学习unittest嘛,就创建了unittest的测试类,用来调用接口和公共方法

import unittest from common import get_header class TestDev(unittest.TestCase): def setUp(self): pass def tearDown(self): pass def testLogin(self): get_header.get_headers() if __name__ == "__main__": unittest.main()2. 调试登录接口和抓取登录接口的uuid和token,并拼接到header中

都写在一个方法里了,后面再优化封装。在common下见了get_header.py, 在这个模块里定义了一个get_headers()的方法。步骤1里通过import模块并直接调用了这个方法。

先放下代码块,再逐步说明以及调试过程中遇到的问题:

import requests import settings import ast def get_headers(): login_url = settings.LOGIN_URL header = { "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36", "Content-Type":"application/x-www-form-urlencoded;charset=UTF-8", "Referer":"%s/yth/" %settings.base_url # 必须有,不然报错401,yth是登录默认的路径 } # 平台有的是加密的login,有的用户名和密码登录。 # 通过判断settings里login_in_users中的login是否有值,有值就通过login登录,无则通过用户名loginId和password登录 if len(settings.login_in_users['login']) == 0: login_info = { "loginId": settings.login_in_users["loginId"], "password": settings.login_in_users["password"] } else: login_info = { "login": settings.login_in_users["login"] } res = requests.post(url = login_url,data = login_info,headers=header) # response 返回data内容是str,需要转换一下把uuid和token取出来 res_data = res.json().get('data') # 网上搜的比较安全的把str转成字典 data_dic = ast.literal_eval(res_data) # 把uuid和token拼接到header中,其他接口则可以直接引用这个header header['uuid'] = data_dic['uuid'] header['token'] = data_dic['token'] print(header)

详细说明:

1) login_url:

这里的login_url是引用了在settings里定义好的测试环境信息。实际学习实践过程中,直接赋值就好了。

2) header:

requests的post方法里headers参数是字典类型,我们按照字典的数据类型将抓包抓到的一些固定的头部信息放进去就可以了。这里有个Referer信息包含了服务器信息,如果没有放,调试的时候请求直接就401了,在以往JMeter和Apipost调试过程中,这个都是必填的。

3) login_info:

requests的post方法里data信息也是个字典类型,我们按照字典的数据类型将用户信息放进去即可。这里做了一个if判断纯是笔者目前测试的不同项目登录传的参数略有不同,为了做的通用一点才做了这样的处理。

4) res_data:

res_data是传了参数调用post方法后返回的数据。下图是debug时的截图,可以看到返回的data是个字符串类型,所以不能够直接通过json().get('token')来获取用户的token信息。要想办法把拿到的字符串data转为字典类型,这样就方便访问了。

网上搜索了一下,比较安全的是使用ast.literal_eval(res_data)来转换,有兴趣的可以移步Python 字符串转换为字典(String to Dict)。

{ "code": 200, "total": 0, "message": "登陆成功", "data": "{\"uuid\":\"9d14dfcf-6d82-4d49-916d-05fe19a6ccc1\",\"token\":\"eyJ0eXBlIjoiand0IiwiYWxnIjoiSFMyNTYifQ.eyJ1c2VyaWQiOiJ1c2VyMjAyMjA2MjQxMDA3MjIiLCJsb2dpbmlkIjoic3hxeSJ9.NffpznolBzwj68X9ODmjglLreenAlp6QG_49DG7Kh2M\",\"operatorid\":\"\",\"username\":\"陕西秦元\",\"days\":\"329\",\"userid\":\"user20220624100722\"}", "time": null }

5) header拼接上uuid和token信息:

步骤4)中获取到登录接口返回的data并将内容转换为字典类型后,就和方便的将uuid和token追加到代码开始的header中了。

# response 返回data内容是str,需要转换一下把uuid和token取出来 res_data = res.json().get('data') # 网上搜的比较安全的把str转成字典 data_dic = ast.literal_eval(res_data) # 把uuid和token拼接到header中,其他接口可以调用 header['uuid'] = data_dic['uuid'] header['token'] = data_dic['token']

如何引用这个header调用业务接口,有兴趣可移步去浏览。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3