接口自动化测试(六)
一、pytest参数化
pytest: @pytest.mark.parametrize(argnames,argvalues)
参数化DDT:把对应的数据去进行提取出来进行统一维护 ---- 多组数据@pytest.mark.parametrize(argnames,argvalues)
@pytest.mark.parametrize("参数名",参数数据)
参数数据格式:中间的数据项有多少个,他就会自己执行多少次[数据1,数据2,数据3](数据1,数据2,数据3)[[],[],[]][(),(),()][{},{},{}] -----推荐用它
import pytest
data=["hami","xiaoming"]
@pytest.mark.parametrize("name",data)
def test_01(name):print("当前运行的用户名是:",name)if __name__ == '__main__':pytest.main(['-vs'])
运行结果:
二、Yaml是什么
Yaml 可以看成一个普通的文件,比如excel、csv、txt等,有格式要求Yaml格式:
基本语法:(1)大小写敏感(2)使用缩进表示层级关系(3)缩进不允许使用tab,只允许空格(4)缩进的空格数不重要,只要相同层级的元素左对齐即可(5)# 表示注释Python所有的数据类型,他都可以进行维护:数字、字符、字典、列表都可以进行维护Yaml的配置文件的后缀名 .yaml或者 .yml字典: key:[空格]value列表:-[空格]valuehttps://tool.p2hp.com/tool-format-yaml/
运行多个文件 (为代码中的最后一段代码)
Yaml测试用例命名的规范:1、获取以context开头的.yaml结尾的内容,并放入到一个公共参数中去----全局变量文件2、用例编号_xxxx.yaml则认为是对应的测试用例需求:写一个方法,加载当前文件夹下的所有符合条件的测试用例
# 专门用例Yaml参数化
# 导入yaml的包# 读取yaml的数据
import yaml
import os
from day08.apirun_1.core.globalContext import g_context
# 加载单个yaml文件 -----舍弃掉
def read_yaml(file_path):"""返回yaml的数据:param file_path: yaml的路径:return:"""# 调用一下全局变量方法写入方法load_context_from_yaml(r"D:\办公\python\ljh_api\day07\apirun_1\example")case_infos=[]with open(file_path,'r',encoding='utf-8') as f:# 加载所有的数据case_info=yaml.full_load(f)case_infos.append(case_info) #[{yaml里面的数据}]return case_infos# res=read_yaml(r"D:\办公\python\ljh_api\day07\apirun_1\example\1_登录成功测试用例.yaml")
# print(res)import os
# 加载content.yaml文件的数据
def load_context_from_yaml(folder_path):""":param folder_path: 文件路径:return:"""try:yaml_file_path=os.path.join(folder_path,"context.yaml") # 把2个文本进行拼接with open(yaml_file_path,"r",encoding="utf-8") as f:# 加载所有数据data=yaml.load(f,Loader=yaml.FullLoader)print(f"装载的yaml数据内容:",data)# 如果数据不为空,则设置到全局变量中if data:g_context().set_by_dict(data)except AttributeError as e:print(f"装载yaml文件错误:{str(e)}")return False# 加载我们满足条件的文件及数据
def load_yaml_files(config_path):"""返回满足条件的yaml文件列表及数据:param config_path: Yaml存放的路径:return:"""yaml_caseInfos=[] # 存储所有的数据suite_folder = os.path.join(config_path)# 存放在该路径的全局变量进行写入load_context_from_yaml(suite_folder)# 满足条件的列表 .yaml and 数字开头_file_names=[(int(f.split("_")[0]),f) for f in os.listdir(suite_folder) if f.endswith(".yaml") and f.split("_")[0].isdigit()]# 排序:只保留文件名即可file_names.sort()file_names=[f[-1] for f in file_names]print()# 加载每个文件的数据给到yaml_caseInfosfor file_name in file_names:file_path=os.path.join(suite_folder,file_name)with open(file_path,'r',encoding='utf-8') as f:# 加载所有的数据case_info=yaml.full_load(f)yaml_caseInfos.append(case_info) #[{yaml里面的数据}]return yaml_caseInfosdata=load_yaml_files(r"D:\办公\python\ljh_api\day08\apirun_1\example")
print(data)
考虑核心执行器,不仅可以执行Yaml 我们还需要执行Excel
所以我们需要一个规范进行统一的处理要求:
return{"case_infos":case_infos, #所有的测试用例"case_names":case_names #所有测试用例对应的标题
}