💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
[TOC] **API接口** 应用程序编程接口(APl: Application Programming Interface,应用程序编程接口):以HTP协议形式提供,定义了输入、输岀、功能描述的服务。 <br /> **接口测试流程:** 1、接口的功能测试(先要保证接口是正确的) 2、测试接口的数据(传递一些特殊的数据,保证接口没有问题) 3、自动化测试脚本的编辑 4、接口的性能、压力测试 <br /> **网络编程基本概念:** ``` 客户端( Client):移动应用(lOS、 Android、Web等应用) 服务器( Server):为客户端提供服务、提供数据、提供资源等机器 请求( Request):客户端向服务器索取数据的一种行为 响应( Response):服务器对客户端对请求做出的反应,一般指返回数据给客户端 ``` ![F71CFA97-7C35-4910-9AB2-36CE80D8DAB6.jpg](https://i.loli.net/2021/01/31/iKpQDW3LIFSNZr5.jpg) <br /> ### **HTTP协议** HTTP协议概念: 协议:计算机通信网络中两台计算机之前进行通信所必须共同遵守的规则或规定。 ​ HTTP协议:超文本传输协议,是一种规定了浏览器和服务器之间通信的规则 URL(统一资源定位符) 概念:互联网上资源的地址、位置。每一个资源都有一个唯一的URL。 格式:协议://主机地址/路径 <br /> ### **GET、POST请求** ![C2B94567-9CBF-4EFE-A2EB-A8D3B9EEEBB9.jpg](https://i.loli.net/2021/01/31/Cceyl6Vfat8vzSN.jpg) ``` 数据传递的格式: 键值对:?xx=11&xx=222 json数据: { "属性名1":"属性值", "属性名2":"属性值", "属性名3":"属性值", } ``` ``` http协议之常见响应状态码 状态码有三位数字组成,第一位数字定义了响应类型,有5种可能取值。 1xx: 指示信息一表示请求已接收,继续处理。 2XX: 成功一表示请求已被成功接收、理解、接受。 3XX: 重定向一要完成请求必须进行更进一步的操作。 4xx: 客户端错误一请求有语法错误或请求无法实现。 5xx: 服务器端错误—服务器未能实现合法的请求。 ``` <br /> ### **restful风格** ◆按照一定的规则写出的易读、易懂的api文档;目的是让前端、后端、测试三方在工作的时候有 据可循,提升开发和测试的效率(非强制要求,软要求) ◆增删改查四大功能的语法风格 ``` (1)查 方法:get 响应码:200+查询的数据 (2)增 方法:post 响应码:201+新增的数据 (3)改 方法:put 响应码:200或201+修改后的数据 (4)删 方法:delete 响应码:204+无 ``` ### **接口测试:接口测试(重点)** ``` A、是什么? 测试后端实现是否符合接口规范 B、为什么? 程序安全、效率 C、怎么用?(实现流程) 模拟客户向服务器发送数据,然后查看响应 要素1:定位服务器资源(通过URL实现[http://www.baidu.com](http://www.baidu.com) | [http://127.0.0.1:8000/](http://127.0.0.1:8000/)资源路径) 要素2:模拟用户提交数据 要素3:查看响应的结果是否符合预期 D、接口测试分类(记住) 类型1:web接口测试(BS架构) 服务器接口测试:测试自己公司实现的接口 第三方接口测试:测试别的公司实现的接口 类型2:模块接口测试(CS架构) ``` <br /> ### **API接口清单** <details> <summary>API接口清单</summary> ``` 一、查询 1.1 学院-查询所有 请求方法:GET 请求地址:http://127.0.0.1:8000/api/departments/ 1.2 学院-查询指定 请求方法:GET 请求地址:http://127.0.0.1:8000/api/departments/T02/ (注:T2为学院ID;) 1.3 根据指定参数进行学院-List-$dep_id_list的相关查询 请求方法:GET 请求地址:http://127.0.0.1:8000/api/departments/?$dep_id_list=T01,T02,T03 (注:$dep_id_list:为参数名称;T01,T02,T03为:学院ID;) 1.4 学院-List-$master_name_list查询 请求方法:GET 请求地址:http://127.0.0.1:8000/api/departments/?$master_name_list=Java-Master,Test-Master (注:$ master_name1ist:为参数名称;Java-Master,Test-Master为:院长名称;) 1.5 学院-模糊 请求方法:GET 请求地址:http://127.0.0.1:8000/api/departments/?blur=l&dep_name=C (注:blur:为开启模糊查询参数1为开启; dep_name:为参数名称;C:学院名称包含字符;) 1.6学院-组合 请求方法:GET 请求地址:http://127.0.0.1:8000/api/departments/?slogan=Here is Slogan&master_name=Test-Master (注: dep_name:学院名称; master_name:为院长名称;s1ogan:学院口号;三个条件可随意组合或单独使用 二、新增 2.1学院-新增 1)请求方法:POST 2)请求地址:http://127.0.0.1:8000/api/departments/ 3)请求J0SN报文: 4)调用传入的json串如下(可新增多条,之间用,隔开): { "data":[ { "dep_id":"T01", "dep_name":"Test学院", "master_name":"Test-Master", "slogan":"Here is Slogan" } ] } 5)新增成功返回报文: { "already_exist":{ "results":[], "count":0 }, "create_success":{ "result":[ { "dep_id":"T02", "dep_name":"Java学院", "master_name":"Java-Master", "slogan":"java" } ], "count":1 } } 6)新增失败id已存在-返回报文: { "already_exist":{ "results":[ { "dep_id":"T01", "dep_name":"Test学院", "master_name":"Test-Master", "slogan":"Here is Slogan" } ], "count":1 }, "create_success":{ "results":[], "count":0 } } 三、更新 3.1 学院-更新 1).请求方法:PUT 2).请求地址:http://127.0.0.1:8000/api/departments/T03 (注:1 为学院ID) 3).请求json报文: { "data":[ { "dep_id":"TO3", "dep_name":"C++/学院", "master_name":"C++-Master", "slogan":"Here is Slogan" } ] } 4).修改成功返回: { "dep_id":"T03", "dep_name":"C++/学院", "master_name":"C++-Master", "slogan":"Here is Slogan" } 四、删除 4.1学院-删除单个 请求方法: DELETE 请求地址:http://127.0.0.1:8000/api/departments/T03/ (注:10为学院ID) 4.2学院-删除多个 请求方法: DELETE 请求地址:http://127.0.0.1:8000/api/departments/?$dep_id_list=8,9,11 (注:$dep_id_list:为参数名称; 8,9,11:为学院ID) ``` </details> <br /> ### **jmeter** ``` 1、 jmeter:概述 A、是什么? jmeter是 Apache公司使用Java开发的一款测试工具 B、为什么? 高效、功能强大 模拟一些高并发或多次循环等特殊测试场景 优点: 1.开源、兔费 2.支持多协议:http https ftp ftps 3.小巧、功能强大 缺点: 1.不支持 IP 欺骗 2.不支持前端测试 2、Jmeter组件线程组 A、是什么? 进程:一个正在执行的程序就对应一个进程 线程:进程中的执行线索(一个进程有多个执行线索) 线程组按照线程性质对线程进行分组 并发执行:多个线程同时执行 特点:执行结束的顺序和线程的启动顺序不一定一致。 顺序执行:按照线程的启动顺序挨个执行 B、为什么? 方便管理 C、怎么用? C-1、三者关系:进程有多个线程组,线程组可以有多个线程 进程--测试计划 线程组--线程组 线程--线程组属性的线程数 C-2、默认情况下,线程组中的线程是并发执行的 每一个线程都要执行组内的http请求 C-3、怎么设置线程组顺序执行 勾选测试计划的第一个复选框(独立运行每个线程组) ``` <br /> ## **接口自动化测试** ### **Requests库介绍** ``` 1. Requests库介绍 1.使用 python语言编写 2.使用开源协议,基于urllib库做的二次封装 3. Requests库中封装了相应接口测试方法 2. Requests库安装及验证 安装: pip install requests 验证: pip show requests ---> 显示相应的版本信息 注意: 安装时,电脑必须连接互联网。 ``` ### **Resquests常用请求方法** ``` 方法:get、post、put、delete ``` **3.1 GET方法** 作用:获取资源(查询) <details> <summary>test01_get请求.py</summary> ``` # test01_get请求.py ''' 目标:Get请求方法演练 案例:http://www.baidu.com 请求: 1.请求方法:GET 响应 2.响应对象.url # 获取请求ur1 3.响应对象.status_code # 获取响应状态码 4.响应对象.text # 以文本形式显示响应内容 ''' # 1.导包 import requests # 2.调用get url = "http://www.baidu.com" r = requests.get(url) # r为响应数据对象 # 3.获取请求url地址 print("请求url:", r.url) # 4.获取响应状态码 print("状态码:", r.status_code) # 5.获取响应信息 文本形式 print("文本相应内容:", r.text) ``` </details> <br /> <br /> <details> <summary>test02_请求带参.py</summary> ``` # test02_请求带参.py ''' 目标:Get请求方法带参演练 案例: 1. http://www.baidu.com?id=1001 2. http://www.baidu.com?id=1001,1002 3. http://www.baidu.com?id=1001&kw=北京 请求: 1.请求方法:GET 参数: params:字典或字符串 (推荐使用字典) 响应 2.响应对象.url # 获取请求ur1 3.响应对象.status_code # 获取响应状态码 4.响应对象.text # 以文本形式显示响应内容 ''' # 1.导包 import requests # 2.调用get url = "http://www.baidu.com" # 不推荐写法 静态 # url = "http://www.baidu.com?id=1001" # 案例1 定义字典 params = {"id": 1001} # 案例1 字符串形式编写 不推荐 # r = requests.get(url, params="id=1001") # 案例2 ''' params = {"id": [1001, 1002]} # 不推荐 params = {"id": "1001, 1002"} # %2c ASCII值为逗号 ''' # 案例3 params = {"id": 1001, "kw": "北京"} # 多个键值使用方式 # 请求是带参 params r = requests.get(url, params=params) # r为响应数据对象 # r = requests.get(url) # r为响应数据对象 # 3.获取请求url地址 print("请求url", r.url) # 4.获取响应状态码 print("状态码", r.status_code) # 5.获取响应信息 文本形式 print("文本相应内容:", r.text) ``` </details> <br /> <br /> **3.2 POST方法** 作用:新增资源 <details> <summary>test03_post请求.py</summary> ``` # test03_post请求.py ''' 目标: requests库post方法使用 案例:新增学院 参数: 1.json:传入json字符串 2. headers传入请求信息头内容 响应: 1.响应对象.json() ''' # 1.导包 import requests # 2.调用post # 请求url url = "http://127.0.0.1:8000/api/departments" # 请求headers headers = {"Content-Type":"application/json"} # 请求josn data = { "data": [{ "dep_id": "T01", "dep_name": "Test学院", "master_name": "Test-Master", "slogan": "Here is slogan" }] } r = requests.post(url, json=data, headers=headers) # 3.获取响应对象 print(r.json()) # 4.获取响应状态码 print(r.status_code) ``` </details> <br /> <br /> ``` 扩展: data与json区别: data:字典对象 json:json字符串 ``` <details> <summary>test03_post请求扩展(参数data与json区别).py</summary> ``` # test03_post请求扩展(参数data与json区别).py ''' 目标: requests库post方法使用 案例:新增学院 将字典对象转换为json字符串: 1. 导入json 2. dumps(dict) 参数: 1. json:传入json字符串 2. headers传入请求信息头内容 响应: 1.响应对象.json() ''' # 1.导包 import requests import json # 2.调用post # 请求url url = "http://127.0.0.1:8000/api/departments" # 请求headers headers = {"Content-Type":"application/json"} # 请求josn data = { "data": [{ "dep_id": "T01", "dep_name": "Test学院", "master_name": "Test-Master", "slogan": "Here is slogan" }] } # 使用json方式来新增学院--->成功 r = requests.post(url, json=data, headers=headers) # 使用data方式来新增学院 -->失败 # 注意:对于 python字典和json虽然长得一样,但是数据序列化格式还是有一定的区别 r = requests.post(url, data=data, headers=headers) # 将字典对象转为json字符串 r = requests.post(url, data=json.dumps(data), headers=headers) # 3.获取响应对象 print(r.json()) # 4.获取响应状态码 print(r.status_code) ``` </details> <br /> <br /> ``` 响应数据json()与text区别 json():返回类型字典,可以通过键名来获取响应的值 text:返回的类型为字符串,无法通过键名来获取响应的值 提示:共同点长得都像字典 ``` <details> <summary>03_post扩展(响应对象.text与响应对象.json()区别).py</summary> ``` # 03_post扩展(响应对象.text与响应对象.json()区别).py ''' 目标: requests库post方法使用 响应对象.text与响应对象.json()区别 案例:新增学院 参数: 1.json:传入json字符串 2. headers传入请求信息头内容 响应: 1.响应对象.json() ''' # 1.导包 import requests import json # 2.调用post # 请求url url = "http://127.0.0.1:8000/api/departments" # 请求headers headers = {"Content-Type":"application/json"} # 请求josn data = { "data": [{ "dep_id": "T01", "dep_name": "Test学院", "master_name": "Test-Master", "slogan": "Here is slogan" }] } # 使用json方式来新增学院--->成功 r = requests.post(url, json=data, headers=headers) # 使用data方式来新增学院 -->失败 # 注意:对于 python字典和json虽然长得一样,但是数据序列化格式还是有一定的区别 r = requests.post(url, data=data, headers=headers) # 将字典对象转为jsOn字符串 r = requests.post(url, data=json.dumps(data), headers=headers) # 3-1. 获取响应对象 json形式 r_json = r.json() print("r_json:", r_json) print("r_json类型为:", type(r_json)) print("r_json通过键名获取值:", r_json['already_exist']) # 3-2. 获取响应对象 text形式 r_text = r.text print("r_text:", r_text) print("r_text类型为:", type(r_text)) # 预期结果 报错 因为字符串没有键名一说 print("r_text通过键名获取值:", r_text['alreadt_exist']) # 3.获取响应对象 print(r.json()) # 4.获取响应状态码 print(r.status_code) ``` </details> <br /> <br /> **3.3 PUT方法** 作用:更新资源 <details> <summary>test04_put请求.py</summary> ``` # test04_put请求.py ''' 目标: requests库put方法使用 案例:新增学院 修改name 将字典对象转换为json字符串: 1.导入json 2. dumps(dict) 参数: 1.json:传入json字符串 2. headers传入请求信息头内容 响应: 1.响应对象.json() ''' # 1.导包 import requests # 2.调用post # 请求url url = "http://127.0.0.1:8000/api/departments/TT702" # 请求headers headers = {"Content-Type":"application/json"} # 请求josn data = { "data": [{ "dep_id": "T01", "dep_name": "TestTT702ipdate学院", "master_name": "Test-Master", "slogan": "Here is slogan" }] } # 使用json方式来新增学院--->成功 r = requests.put(url, json=data, headers=headers) # 使用data方式来新增学院 -->失败 # 注意:对于 python字典和json虽然长得一样,但是数据序列化格式还是有一定的区别 r = requests.post(url, data=data, headers=headers) # 将字典对象转为jsOn字符串 r = requests.post(url, data=json.dumps(data), headers=headers) # 3.获取响应对象 print(r.json()) # 4.获取响应状态码 print(r.status_code) ``` </details> <br /> <br /> **3.4 DELETE方法** 作用:删除资源 ``` ''' 目标: requests库put方法使用 案例:删除新增学院 响应: 响应状态码:204 ''' # 1.导包 import requests # 2.调用delete # 请求url url = "http://127.0.0.1:8000/api/departments/TT702" r = requests.delete(url) # 4.获取响应状态码 print(r.status_code) ``` <br /> ### **响应内容** ``` response.status_code 状态码 response.url 请求url response.encoding 查看响应头部字符编码 response.headers 头信息 response.cookies cookie信息 response.text 文本形式的响应内容 response.content 字节形式的响应内容 response.json() json形式的响应内容 ``` <details> <summary>06_响应对象方法(encoding).py</summary> ``` # 06_响应对象方法(encoding).py ''' 目标:响应对象常用方法 1. encoding 1)·获取请求编码 2).设置响应编码 2. headers 1).获取响应信息头信息 案例http://www.baidu.com ''' # 1.导包 import requests # 2.调用get方法 url = "http://www.baidu.com" r = requests.get(url) # 3.查看默认请求编码 ISO-8859-1 print(r.encoding) # 3-1 设置响应编码 r.encoding = "utf-8" # 4.查看相应内容 text形式 print(r.text) # 5.查看响应信息头 # 提示:headers信息比较重要(项目工作中一般服务器返回的token\session相关信息都在headers中) print(r.headers) ``` </details> <br /> <details> <summary>07_响应对象方法(cookies).py</summary> ``` # 07_响应对象方法(cookies).py ''' 目标:响应对象常用方法 1. cookies 1).获取响应 cookies信息 2. content 1).以字节码形式获取响应信息(图片、视频.多媒体格式) 案例: cookies:http://www.baidu.com content:https://www.baiducom/img/bdlogol.png?where=super ''' # 1.导包 import requests # 2.调用get url = "http://www.baidu.com" r = requests.get(url) # 百度logo url_img = "https://www.baiducom/img/bdlogol.png?where=super" r = requests.get(url_img) ''' # 3.获取响应cookies print("cookies信息为:", r.cookies) # 通过键名获取响应的cookies值 print("cookies信息为:", r.cookies['BDORZ']) # 以text文本形式解析图片 -->乱码 print(r.text) ''' # 以字节码形式解析图片 print(r.content) # 将图片写入当前目录baidu.png with open("./baidu.png", "wb") as f: f.write(r.content) ``` </details> <br />