zoukankan      html  css  js  c++  java
  • pytest文档72- 使用 template 替换 yaml 文件的变量

    前言

    在接口自动化测试的时候,yaml 文件一般放测试的数据或当配置文件使用,yaml 文件存放静态的数据是没问题的,python的数据类型基本上都是支持的。
    有时候我们想在 yaml 文件中引用变量来读取 python 代码的设置值。

    template 使用

    template 是字符串模板,用于替换字符串中的变量,是 string 的一个类引用变量有 2 种格式

    • $variable 使用 $变量名 引用变量
    • ${variable} 使用 ${变量名} 大括号包起来

    第一种 $variable

    from string import Template
    # 作者-上海悠悠 QQ交流群:717225969
    # blog地址 https://www.cnblogs.com/yoyoketang/
    
    
    tempTemplate = Template("My name is $name , i like $fancy")
    d = {'name': 'yoyo', 'fancy': 'python'}
    print(tempTemplate.substitute(d))
    
    # 运行结果
    # >>> My name is yoyo , i like python
    

    第二种 ${variable}

    from string import Template
    # 作者-上海悠悠 QQ交流群:717225969
    # blog地址 https://www.cnblogs.com/yoyoketang/
    
    
    tempTemplate = Template("My name is ${name} , i like ${fancy}")
    d = {'name': 'yoyo', 'fancy': 'python'}
    print(tempTemplate.substitute(d))
    
    # 运行结果
    # >>>My name is yoyo , i like python
    

    safe_substitute使用

    上面的方式只能严格的匹配变量,当字符串中有$符号,不想匹配变量的时候,会报错

    from string import Template
    # 作者-上海悠悠 QQ交流群:717225969
    # blog地址 https://www.cnblogs.com/yoyoketang/
    
    
    tempTemplate = Template("$My name is ${name} , i like ${fancy}")
    d = {'name': 'yoyo', 'fancy': 'python'}
    print(tempTemplate.substitute(d))
    

    这段,$符号加在My的前面,我只想让它是一个普通的字符串,不想引用变量,就出现了报错说找不到这个key

    Traceback (most recent call last):
      File "D:/soft/api_pytest_1208/config/aa.py", line 12, in <module>
        print(tempTemplate.substitute(d))
      File "E:python36libstring.py", line 130, in substitute
        return self.pattern.sub(convert, self.template)
      File "E:python36libstring.py", line 123, in convert
        return str(mapping[named])
    KeyError: 'My'
    

    Template 里面还有一个 safe_substitute 的方法,可以忽略匹配不到的变量

    from string import Template
    
    
    tempTemplate = Template("$My name is ${name} , i like ${fancy}")
    d = {'name': 'yoyo'}
    print(tempTemplate.safe_substitute(d))
    
    # 运行结果:$My name is yoyo , i like ${fancy}
    

    虽然字符串定义了多个变量,但是引用的时候只给了name这个值,也不影响运行,没给值的当普通字符串出来,这样就很完美了

    yaml 文件引用变量

    通过前面 Template 的基础使用,已经掌握了基本的用法了,接下来在 yaml 文件中引用变量

    - test:
        name: login case1
        request:
            url: http://49.235.x.x:7000/api/v1/login/
            method: POST
            headers:
                Content-Type: application/json
                User-Agent: python-requests/2.18.4
            json:
                username: $user
                password: $psw
        validate:
            - eq: [$.msg, login success!]
            - eq: [$.code, 0]
    

    python读yaml文件代码

    from string import Template
    import yaml
    # 作者-上海悠悠 QQ交流群:717225969
    # blog地址 https://www.cnblogs.com/yoyoketang/
    
    with open("login.yml", encoding='utf-8') as fp:
        read_yml_str = fp.read()
        # print(xx)
    
        tempTemplate1 = Template(read_yml_str)
        c = tempTemplate1.safe_substitute({"user": "yoyo", "psw": "123456 "})
        print(c)
    
    # yml 文件数据,转 python 类型
    yaml_data = yaml.safe_load(c)
    print(yaml_data)
    

    运行结果

    - test:
        name: login case1
        request:
            url: http://49.235.x.x:7000/api/v1/login/
            method: POST
            headers:
                Content-Type: application/json
                User-Agent: python-requests/2.18.4
            json:
                username: user
                password: 123456 
        validate:
            - eq: [$.msg, login success!]
            - eq: [$.code, 0]
    
    [{
    	'test': {
    		'name': 'login case1',
    		'request': {
    			'url': 'http://49.235.x.x:7000/api/v1/login/',
    			'method': 'POST',
    			'headers': {
    				'Content-Type': 'application/json',
    				'User-Agent': 'python-requests/2.18.4'
    			},
    			'json': {
    				'username': 'user',
    				'password': 123456
    			}
    		},
    		'validate': [{
    			'eq': ['$.msg', 'login success!']
    		}, {
    			'eq': ['$.code', 0]
    		}]
    	}
    }]
    
    

    这样 yaml 文件就能引用到 python 的变量了

  • 相关阅读:
    https://www.cnblogs.com/marost/p/4668664.html
    UEFI 坑 Ubuntu
    Spring《六》管理Bean
    Spring《五》集合的注入方式
    Spring《四-一》解决自动装配的问题
    spring《四》自动装配
    Spring《三》ref 引用其他bean
    Spring《二》 Bean的生命周期
    Spring《一》
    Fragment间相互调用并传值
  • 原文地址:https://www.cnblogs.com/yoyoketang/p/14119435.html
Copyright © 2011-2022 走看看