从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())
相关推荐
大尚来也10 分钟前
PHP 反序列化漏洞深度解析:从原理利用到 allowed_classes 防御实战
android·开发语言·php
雕刻刀13 分钟前
ERROR: Failed to build ‘natten‘ when getting requirements to build wheel
开发语言·python
qq_4160187214 分钟前
高性能密码学库
开发语言·c++·算法
何双新15 分钟前
Odoo 技术演进全解析:从 Widget 到 Owl,从 Old API 到声明式 ORM
python
吃杠碰小鸡16 分钟前
前端 IndexedDB 完全指南
学习
小碗羊肉22 分钟前
【从零开始学Java | 第十八篇】BigInteger
java·开发语言·新手入门
宵时待雨25 分钟前
C++笔记归纳14:AVL树
开发语言·数据结构·c++·笔记·算法
执笔画流年呀39 分钟前
PriorityQueue(堆)续集
java·开发语言
山川行42 分钟前
关于《项目C语言》专栏的总结
c语言·开发语言·数据结构·vscode·python·算法·visual studio code
呜喵王阿尔萨斯44 分钟前
C and C++ code
c语言·开发语言·c++