前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >pytest文档72- 使用 template 替换 yaml 文件的变量

pytest文档72- 使用 template 替换 yaml 文件的变量

作者头像
上海-悠悠
发布2020-12-17 14:18:52
3.7K0
发布2020-12-17 14:18:52
举报
文章被收录于专栏:从零开始学自动化测试

前言

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

template 使用

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

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

第一种 $variable

代码语言:javascript
复制
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}

代码语言:javascript
复制
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使用

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

代码语言:javascript
复制
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

代码语言:javascript
复制
Traceback (most recent call last):
  File "D:/soft/api_pytest_1208/config/aa.py", line 12, in <module>
    print(tempTemplate.substitute(d))
  File "E:\python36\lib\string.py", line 130, in substitute
    return self.pattern.sub(convert, self.template)
  File "E:\python36\lib\string.py", line 123, in convert
    return str(mapping[named])
KeyError: 'My'

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

代码语言:javascript
复制
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 文件中引用变量

代码语言:javascript
复制
- 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文件代码

代码语言:javascript
复制
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)

运行结果

代码语言:javascript
复制
- 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 的变量了

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-12-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 从零开始学自动化测试 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • template 使用
  • safe_substitute使用
  • yaml 文件引用变量
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档