3. YAML读取+登录获取Token +YAML写入
这份代码是接口自动化测试的核心基础代码 ,核心功能:读取YAML测试用例 → 发送登录请求 → 获取Token → 写入YAML文件
整体功能总结
- 读取
login.yaml里的登录接口信息(URL、请求方法、参数) - 自动发送登录请求
- 从登录响应里提取
token - 把 token 写入
extract.yaml(供后续接口鉴权使用)
3.1. 模块导入
import os
import yaml
from sendrequests import SendRequest
import os:文件/路径操作工具(本代码没直接用,但自动化常用)import yaml:核心库,专门读写 YAML 格式文件from sendrequests import SendRequest:导入封装好的请求工具类
-
- 作用:发送 HTTP 请求(get/post/put...),不用重复写 requests 代码
3.2. 工具函数:读取 YAML 文件
def get_testcase_yaml(file):
"""
获取yaml文件的数据
:param file: yaml文件的路径
:return:
"""
try:
with open(file, 'r', encoding='utf-8') as f:
yaml_data = yaml.safe_load(f)
return yaml_data
except Exception as e:
print(e)
def get_testcase_yaml(file):
定义函数,参数file是 YAML 文件路径(如login.yaml)try...except
异常捕获:文件不存在/格式错误时,不会直接报错崩溃with open(file, 'r', encoding='utf-8') as f:
-
r:只读模式encoding='utf-8':支持中文,不乱码with:自动关闭文件,安全规范
yaml.safe_load(f)
-
- 把 YAML 文本 → Python 字典/列表
safe_load:安全加载,防止恶意代码(比load安全)
return yaml_data
返回解析后的 Python 数据(给后面调用使用)
3.3. 类:读写 YAML 数据
class ReadYamlData():
"""
读取yaml数据,以及写入到yaml文件
"""
def __init__(self, yaml_file=None):
if yaml_file is not None:
self.yaml_file = yaml_file
else:
self.yaml_file = 'login.yaml'
构造方法 init
- 初始化类的时候,可以传 YAML 文件名
- 不传默认用:
login.yaml - 作用:灵活指定要读取的文件
def write_yaml_data(self, data):
"""
写入数据到yaml文件
:param data: (dict)写入到yaml文件的数据
:return:
"""
file_path = 'extract.yaml'
if not os.path.exists(file_path):
with open(file_path, 'w', encoding='utf-8') as f:
pass
with open(file_path, 'w', encoding='utf-8') as f:
if isinstance(data, dict):
# 中文不乱码 + 保持顺序
yaml.dump(data, f, allow_unicode=True, sort_keys=False)
写入方法核心知识点
file_path = 'extract.yaml'
固定写入到这个文件(专门存提取的变量:token、userId 等)'w'模式 = 覆盖写入
-
- 每次运行都会清空旧 token,写入新 token
- 保证永远用最新 token,非常关键
yaml.dump()
把 Python 字典 → 写入 YAML 文件- 参数解释
-
allow_unicode=True:支持中文sort_keys=False:不自动排序 key(保持你写的顺序)
3.4. 主函数:程序入口
if __name__ == '__main__':
- Python 固定写法:直接运行这个文件时,才执行下面代码
- 被其他文件导入时,不执行
-
读取登录用例
res = get_testcase_yaml('login.yaml')[0]
- 读取
login.yaml所有数据 [0]:YAML 最外层是列表,取第一个用例
-
拼接请求信息
url = 'http://127.0.0.1:8787' + res['baseInfo']['url']
data = res['testCase'][0]['data']
method = res['baseInfo']['method']
-
发送请求
send = SendRequest()
res = send.run_main(url, data, None, method)
print(res)
SendRequest():创建请求对象run_main():发送请求(封装了 requests)- 参数顺序:URL、请求参数、请求头、请求方法
- 返回值
res= 接口响应结果(字典格式)
-
提取 Token
token = res.get('token')
print("获取到的token:", token)
.get('token'):安全取值
-
- 有 token → 返回值
- 无 token → 返回
None,不报错
-
写入 Token 到文件
write_data = {"Token": token}
read = ReadYamlData()
read.write_yaml_data(write_data)
- 构造字典
{"Token": token} - 调用写入方法,存入
extract.yaml
最终 extract.yaml 内容:
Token: xxxxxxx