从0开始python学习-44.通过yaml实现数据代码分离

目的:将数据和代码进行分离,便于批量执行多个用例,且修改数据上方便

问题:所有的请求和请求参数的写在了代码中,不利于批量测试多个用例,一旦有修改工作量大

原代码:

python 复制代码
class TestApi:
    # get请求
    def test_phpwind(self):
        url = 'http://aaa/phpwind/'
        res = RequestUtil().send_request(method="get",url=url)

        res_token = re.search('name="csrf_token" value="(.*?)"', res.text)
        data = {"csrf_token":res_token.group(1)}
        writer_yaml(data)
        
    # post请求
    def test_phpwind_login(self):
        url = 'http://aaa/phpwind/index.php?m=u&c=login&a=dorun'
        header = {
            "Accept": "application/json, text/javascript, /; q=0.01"
            "X-Requested-With": "XMLHttpRequest"
        }
        data = {
            "username": "aaa",
            "password": "aaa",
            "csrf_token": read_yaml('csrf_token')
            "backurl": "http://aaa/phpwind/",
            "invite": ""
        }
        
        res = RequestUtil().send_request(method="post",url=url, data=data, headers=header)
        print(res.json())
        
    # 文件上传。需要获取上面的token
    def test_file_upload(self):
        url = 'https://api.weixin.qq.com/cgi-bin/media/uploadimg'
        params = {
            'access_token':read_yaml('csrf_token')
        }
    
        file = {
            'media':'D:\\1.jpg'
            }
        res = RequestUtil().send_request(method="post", url=url, params=params, files=file)
        print(res.json())

修改后:

  1. 在原有读取yaml文件代码基础上,新增一个读取所有用例的方法,注意这里传入的yaml_path不能写死,需要根据不同用例不同的传参

  2. 根据每个用例的需求分别写一个对应的yaml文件(这样的弊端是会有很多yaml文件,后期需要优化冗余代码)

  3. yaml文件是无法调用方法的,所有当需要调用token等参数的时候,在用例中调用,此时只需要将yaml中的该字段置位''即可

1. 新增读取所有用例的方法

python 复制代码
def read_testcase(yaml_path): 
    with open(yaml_path,encoding="utf-8") as f:
        value = yaml.safe_load(f)
        return value

2. 根据用例数新增对应的yaml文件--根据需求写

2.1 对应test_phpwind用例的yaml文件--test_phpwind.yaml

python 复制代码
-
  request:
    method: get
    url: http://aaa/phpwind/

2.2 对应test_phpwind_login用例的yaml文件--test_phpwind_login.yaml

python 复制代码
-
  request:
    method: post
    url: http://aaa/phpwind/index.php?m=u&c=login&a=dorun
    header:
      Accept: "application/json, text/javascript, /; q=0.01"
      X-Requested-With: "XMLHttpRequest"
  data:
    username: aaa
    password: aaa
    csrf_token: ''
    backurl: "http://aaa/phpwind/"
    invite: ""

2.3 对应test_file_upload用例的yaml文件--test_file_upload.yaml

python 复制代码
-
  request:
    method: post
    url: https://api.weixin.qq.com/cgi-bin/media/uploadimg
    params:
      access_token: ''
    file:
      media: 'D:\\1.jpg'

3. 修改后的用例

python 复制代码
class TestApi:
    @pytest.mark.parametrize('caseinfo',read_testcase('./test_study/test_pytest/test_phpwind.yaml'))
    def test_phpwind(self,caseinfo):
        method = caseinfo['request']['method']
        url = caseinfo['request']['url']
        res = RequestUtil().send_request(method=method,url=url)
        
        res_token = re.search('name="csrf_token" value="(.*?)"', res.text)
        data = {"csrf_token":res_token.group(1)}
       writer_yaml(data)
       
    @pytest.mark.parametrize('caseinfo', read_testcase('./test_study/test_pytest/test_phpwind_login.yaml'))
    def test_phpwind_login(self,caseinfo):
        method = caseinfo['request']['method']
        url = caseinfo['request']['url']
        header = caseinfo['request']['header']
        data = caseinfo['data']
        # 这里通过读取yaml的方式重新将token赋值使用
        data['csrf_token'] = read_yaml('csrf_token')
        res = RequestUtil().send_request(method=method,url=url, data=data, headers=header)
        print(res.json())
        
    @pytest.mark.parametrize('caseinfo', read_testcase('./test_study/test_pytest/test_file_upload.yaml'))
    def test_file_upload(self,caseinfo):
        method = caseinfo['request']['method']
        url = caseinfo['request']['url']
        params = caseinfo['request']['params']
        params['access_token'] = read_yaml('access_token')
        # 通过yaml的方式传入文件
        file = caseinfo['request']['file']
        res = RequestUtil().send_request(method=method, url=url, params=params, files=file)
        print(res.json())
相关推荐
万岳科技程序员小赵3 分钟前
同城外卖 APP 与小程序开发实战:系统模块拆分及多语言适配要点
开发语言·软件需求
happymaker06266 分钟前
Spring学习日记——DAY04(复杂对象创建,AOP静态代理)
java·开发语言·spring
小江的记录本8 分钟前
【MySQL】《MySQL日志面试背诵版+思维导图》(核心考点 + MySQL 8.0最新优化)
java·数据库·后端·python·sql·mysql·面试
北山有鸟8 分钟前
常用的快捷键
linux·前端·chrome·单片机·学习
西洼工作室8 分钟前
Python邮箱工具类封装:高效邮件发送与管理
python·全栈
ComputerInBook10 分钟前
C++ 17 相比 C++ 14 新增之特征
开发语言·c++·c++ 17
子午14 分钟前
基于YOLO的水稻害虫检测系统~Python+yolov8算法+深度学习+人工智能+模型训练
人工智能·python·yolo
我命由我1234516 分钟前
Android Framework P2 - 开机启动 Zygote 进程、Zygote 的预加载机制
android·java·开发语言·python·java-ee·intellij-idea·zygote
JAVA面经实录91719 分钟前
Java Codex 企业标准Prompt库
java·开发语言·prompt
qcx2321 分钟前
【AI Daily】每日Arxiv论文研读Top5-2026-05-16
人工智能·学习·ai·agent·aris