从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())
相关推荐
lkbhua莱克瓦243 分钟前
进阶-存储对象2-存储过程上
java·开发语言·数据库·sql·mysql
deng-c-f8 分钟前
Linux C/C++ 学习日记(60):redis(一):基本介绍
学习
Mr -老鬼10 分钟前
Rust 知识图谱 -进阶部分
开发语言·后端·rust
LawrenceLan12 分钟前
Flutter 零基础入门(十三):late 关键字与延迟初始化
开发语言·前端·flutter·dart
深耕AI12 分钟前
【wordpress系列教程】03 网站页面的编辑
开发语言·前端
仙女修炼史15 分钟前
How transferable are features in deep neural networks
人工智能·深度学习·学习
qq_3363139323 分钟前
java基础-IO流(随机点名器)
java·开发语言·python
liu****24 分钟前
深度学习简介
人工智能·python·深度学习·python基础