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:\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 的方法,可以忽略匹配不到的变量

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 的变量了
2021年第六期《python接口自动化+测试开发》课程,1月9号开学(火热报名中!)
本期上课时间:1月9号-4月18号,每周六、周日晚上20:30-22:30

(0)

相关推荐

  • Python Requests Pytest YAML Allure实现接口自动化

    作者:wintest 链接:https://www.cnblogs.com/wintest/p/13423231.html 本项目实现接口自动化的技术选型:Python+Requests+Pytest ...

  • 初识Flask

    大邓细数了我的文章,近60篇文章中只有一篇写 微信聊天机器人使用了装饰器.大家不必担心学 不会装饰器肿么办.类学不会怎么办这类问题.Python中 类. 装饰器都属于锦上添花之物,解决的是1和还是1+ ...

  • pytest文档71-pytest+yaml实现接口自动化框架

    前言 httprunner 用 yaml 文件实现接口自动化框架很好用,最近在看 pytest 框架,于是参考 httprunner的用例格式,写了一个差不多的 pytest 版的简易框架 项目结构设 ...

  • pytest文档73-pytest+yaml实现接口自动化框架之用例参数关联

    前言 使用 yaml 文件写测试用例的时候,如何在 yaml 文件的测试用例里面实现参数关联? 这是很多做自动化测试的小伙伴经常思考的一个问题. 接着前面的pytest+yaml 文件实现接口自动化框 ...

  • pytest文档1-环境准备与入门

    前言 首先说下为什么要学pytest,在此之前相信大家已经掌握了python里面的unittest单元测试框架,那再学一个框架肯定是需要学习时间成本的. 刚开始我的内心是拒绝的,我想我用unittes ...

  • pytest文档2-用例运行规则

    用例设计原则 文件名以test_*.py文件和*_test.py 以test_开头的函数 以Test开头的类 以test_开头的方法 所有的包pakege必须要有__init__.py文件 help帮 ...

  • pytest文档3-pycharm运行pytest

    前言 上一篇pytest文档2-用例运行规则已经介绍了如何在cmd执行pytest用例,平常我们写代码在pycharm比较多 写完用例之后,需要调试看看,是不是能正常运行,如果每次跑去cmd执行,太麻 ...

  • pytest文档5-fixture之conftest.py

    前言 前面一篇讲到用例加setup和teardown可以实现在测试用例之前或之后加入一些操作,但这种是整个脚本全局生效的,如果我想实现以下场景: 用例1需要先登录,用例2不需要登录,用例3需要先登录. ...

  • pytest文档6-fixture之yield实现teardown

    前言 上一篇讲到fixture通过scope参数控制setup级别,既然有setup作为用例之前前的操作,用例执行完之后那肯定也有teardown操作. 这里用到fixture的teardown操作并 ...

  • pytest文档7-生成html报告

    前言 pytest-HTML是一个插件,pytest用于生成测试结果的HTML报告.兼容Python 2.7,3.6 pytest-html 1.github上源码地址[https://github. ...

  • pytest文档8-html报告报错截图+失败重跑

    前言 做web自动化的小伙伴应该都希望在html报告中展示失败后的截图,提升报告的档次,pytest-html也可以生成带截图的报告. conftest.py 1.失败截图可以写到conftest.p ...