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 的变量了

  • 相关阅读:
    iOS resign code with App Store profile and post to AppStore
    HTTPS科普扫盲帖 对称加密 非对称加密
    appid 评价
    使用Carthage安装第三方Swift库
    AngularJS:何时应该使用Directive、Controller、Service?
    xcode7 The operation couldn't be completed.
    cocoapods pod install 安装报错 is not used in any concrete target
    xcode7 NSAppTransportSecurity
    learning uboot how to set ddr parameter in qca4531 cpu
    learning uboot enable protect console
  • 原文地址:https://www.cnblogs.com/yoyoketang/p/14119435.html
Copyright © 2011-2022 走看看