來自接口測試初學(xué)者的筆記,寫的不對的地方大家多多指教哦
一、Yaml的基本操作
以下關(guān)于yaml文件的內(nèi)容都存儲(chǔ)在t.yaml文件中,路徑為:./t.yaml
1.使用字典:{'name': 'test_yaml', 'result': 'success'}
- 字典的鍵值對使用“:”分隔
- 字典直接寫key和value,每個(gè)鍵值對占一行
- ”:“后面要加空格
name: "test_yaml"
result: "success"
2.使用列表:['a', 'b', 'c']
- 一組按序排列的值(簡稱”序列或列表“)
- 數(shù)組前加有”-“符號,符號與值之間需用空格分隔
- "a"
- "b"
- "c"
3.字典嵌套字典:
{'person1': {'name': 'xiaoming', 'age': '18'},
'person2': {'name': 'xiaohua', 'age': '20'}}
person1:
name: "xiaoming"
age: "18"
person2:
name: "xiaohua"
age: "20"
4.字典嵌套列表:{person:["a","b","c"]}
person:
- "a"
- "b"
- "c"
5.列表嵌套列表:[['a', 'b', 'c'], ['a', 'b', 'c']]
-
- "a"
- "b"
- "c"
-
- "a"
- "b"
- "c"
6.列表嵌套字典:[{'username1': 'test1'}, {'password1': 111}, {'username2': 'test2'}]
- username1: test1
- password1: 111
- username2: test2
二、讀取Yaml文件
1.讀取單個(gè)文件
使用yaml.safe_load()讀取單個(gè)文件
import yaml
# 打開Yaml文件
with open("./t.yaml", 'r', encoding='utf-8') as f:
# 讀取Yaml文件
r = yaml.safe_load(f)
print(r)
注意:
encoding='utf-8':如果Yaml文件中存在中文字符,則需要添加該屬性
2.讀取多個(gè)文件
Yaml文件中使用”- - -“來標(biāo)識文件,即表示測試用例
Yaml文件中多個(gè)文件的配置
# 讀取多個(gè)文檔
---
"用戶名稱1": "test123"
"密碼": "123123"
---
"用戶名稱2": "test456"
"密碼": "123123"
使用yaml.safe_load_all()讀取多個(gè)文件
import yaml
# 讀取多個(gè)文件
# 打開Yaml文件
with open("./t.yaml", 'r', encoding='utf-8') as f:
# 讀取Yaml文件
r = yaml.safe_load_all(f)
# 循環(huán)打印
for i in r:
print(i)
三、Yaml封裝
思路
- 創(chuàng)建類
- 初始化文件,判斷文件是否存在
- 讀取單個(gè)/多個(gè)文件
完整Yaml封裝代碼如下
# 封裝Yaml文件
import os
import yaml
class YamlReader:
# 初始化,判斷文件是否存在
def __init__(self, yaml_file):
if os.path.exists(yaml_file):
self.yaml_file = yaml_file
else:
# 文件不存在,raise拋出異常
raise FileNotFoundError("文件不存在")
# 是否讀取過單個(gè)文檔
self._data = None
# 是否讀取過多個(gè)文檔
self._data_all = None
# yaml單個(gè)文檔讀取
def data(self):
# 第一次調(diào)用data,讀取yaml單個(gè)文檔,如果不是,直接返回之前保存的數(shù)據(jù)
if not self._data:
with open(self.yaml_file, "rb") as f:
self._data = yaml.safe_load(f)
return self._data
# yaml多個(gè)文檔讀取
def data_all(self):
# 第一次調(diào)用data,讀取yaml多個(gè)文檔,如果不是,直接返回之前保存的數(shù)據(jù)
if not self._data_all:
with open(self.yaml_file, "rb") as f:
self._data_all = list(yaml.safe_load_all(f))
return self._data_all
測試
from utils.yaml_util import YamlReader
# 封裝yaml文件測試
# 單個(gè)文件
res = YamlReader("./t.yml").data()
print(res)
# 多個(gè)文件
res_all = YamlReader("./t.yml").data_all()
print(res_all)
知識點(diǎn):
使用raise拋出異常,基本語法為:raise [exceptionName [(reason)]],raise具有三種常用語法,如下:
- raise:單獨(dú)一個(gè) raise。該語句引發(fā)當(dāng)前上下文中捕獲的異常(比如在 except 塊中),或默認(rèn)引發(fā) RuntimeError 異常。
- raise 異常類名稱:raise 后帶一個(gè)異常類名稱,表示引發(fā)執(zhí)行類型的異常。
- raise 異常類名稱(描述信息):在引發(fā)指定類型的異常的同時(shí),附帶異常的描述信息。
其它詳細(xì)知識點(diǎn)參考:http://c.biancheng.net/view/2360.html
四、讀取Yaml配置文件
在第三部分,初始化判斷文件是否存在時(shí)需要傳入Yaml文件地址,這邊我們可以通過代碼來獲取配置文件的地址,以此來讀取配置文件的內(nèi)容。
具體的代碼如下
# 獲取配置文件地址,讀取配置文件內(nèi)容
import os
from utils.yaml_util import YamlReader
# 1.獲取項(xiàng)目的基本目錄
# 獲取當(dāng)前文件的絕對路徑:E:\\study\\Fork\\InterAutoTest_W\\AutoTest\\config\\read_conf.py
current = os.path.abspath(__file__)
# 獲取當(dāng)前項(xiàng)目的絕對路徑:在當(dāng)前文件路徑的上兩級目錄,E:\\study\\Fork\\InterAutoTest_W\\AutoTest
BASE_DIR = os.path.dirname(os.path.dirname(current))
# 定義config目錄的路徑,os.sep表示路徑拼接(config為配置文件所屬的包名)
_config_path = BASE_DIR + os.sep + "config"
# 定義conf_url.yml文件的路徑(conf_url.yml為具體的配置文件名)
_config_url_file = _config_path + os.sep + "conf_url.yml"
# 由于定義的變量是私有的,所以這邊定義方法去訪問
def get_config_path():
return _config_path
def get_config_file():
return _config_url_file
# 2.讀取配置文件
# 創(chuàng)建類
class ConfigYaml:
# 初始化Yaml讀取配置文件
def __init__(self):
self.config = YamlReader(get_config_file()).data()
# 獲取url
def get_conf_url(self):
return self.config["BASE"]["test"]["url"]
# 獲取測試數(shù)據(jù)
def get_conf_data(self):
return self.config["DATA"]["test_login"]
Yaml文件內(nèi)容
BASE:
test:
url: "<http://1.1.1.1>:1111"
DATA:
test_login:
username: "python"
password: "12345678"
測試
import requests
from utils.request_util import request_get, request_post
from utils.request_util import Request
from config.read_conf import ConfigYaml
request = Request()
conf_y = ConfigYaml()
def login_yaml_data():
url_path = conf_y.get_conf_url()
url = url_path + "/authorizations/"
data = conf_y.get_conf_data()
# 使用重構(gòu)后的post
r = request.post(url, json=data)
print(r)