从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())
相关推荐
circuitsosk1 分钟前
Prompt Engineering进阶:面向复杂业务场景的模板化管理与动态注入策略
python·langchain·prompt·跨境电商·rag·上下文管理·动态注入
lifallen11 分钟前
edit-article:AI 味来自跳级
人工智能·学习·ai·ai编程·ai写作
XR12345678812 分钟前
工业园区整体组网,方案对比怎么选?
开发语言·php
东东最爱敲键盘18 分钟前
day9.C++多态之虚函数
开发语言·c++
码云数智-园园25 分钟前
类似小鹅通的知识付费小程序平台有哪些
开发语言
snow@li33 分钟前
Java:跨平台原理与JDK、JRE、JVM全景深度解析
java·开发语言·jvm
Livia要学习35 分钟前
Python闭包
开发语言·jvm·python
覆东流37 分钟前
2.Java程序基础
java·开发语言·后端
ttwuai44 分钟前
Go 后台定时任务启停不生效怎么办?先查调度同步链路
开发语言·后端·golang
xian_wwq1 小时前
【学习笔记】工具设计,Agent 的手比大脑更容易出问题-8/16
笔记·学习·agent