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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM