python pyyaml操作yaml配置檔案

pple發表於2021-06-16

在測試工作中,可以使用yaml編寫測試用例,執行測試用例時直接獲取yaml中的用例資料進行測試(如:介面自動化測試)

1.什麼是yaml

  是一種可讀的資料序列化語言,通常用於配置檔案

  非常簡潔和強大,遠比json格式更方便

  可用作自動化測試框架的配置檔案和測試用例檔案

 

  原則
  a.大小寫敏感
  b.使用縮排表示層級關係
  c.縮排長度沒有限制,只要元素對齊就表示這些元素屬於一個層級。
  d.使用#表示註釋
  e.字串可以不用引號標註

2.yaml配置檔案的格式

  使用:號隔開表示鍵值對

  使用-號表示陣列

  例如:

ip: 127.0.0.1
port: 2002
port_in: 8764
charset: utf-8
post_type:
    - 1
    - 2
    - 3
    - 4

讀取後的結果:
{'ip': '127.0.0.1', 'port': 2002, 'port_in': 8764, 'charset': 'utf-8', 'post_type': [1, 2, 3, 4]}

&和*用於引用

ip: &ip 127.0.0.1
url: *ip

#執行結果
{'ip': '127.0.0.1', 'url': '127.0.0.1'}

3.使用python操作yaml配置檔案

  (注:PyYAML5.1之後,通過禁止預設載入程式(FullLoader)執行任意功能,該load函式也變得更加安全)

  pyyaml:python的第三方庫,用於操作yaml配置檔案

  安裝pyyaml:pip install PyYaml

  字串轉換成字典:yaml.load()  

import yaml

def get_configres(filepath):
   '''
   獲取yaml配置檔案中的內容
   :param filepath:
   :return: 返回的是一個字典
   '''
   f1=open(filepath,"r")
   res=yaml.load(f1,Loader=yaml.FullLoader)
   return res

res=get_configres("../config/cfg.yaml")
print(res,type(res))

#執行結果:
{'ip': '127.0.0.1', 'port': 2002, 'port_in': 8764, 'charset': 'utf-8', 'post_type': [1, 2, 3, 4]} <class 'dict'>

 字典轉換成字串:yaml.dump()

params={'ip': '127.0.0.1', 'port': 2002, 'port_in': 8764, 'charset': 'utf-8', 'post_type': [1, 2, 3, 4]}
res_str=yaml.dump(params)
print(res_str,type(res_str))

#執行結果:
charset: utf-8
ip: 127.0.0.1
port: 2002
port_in: 8764
post_type:
- 1
- 2
- 3
- 4
 <class 'str'>

  使用yaml寫測試用例

--- #登入模組
- #test1
  url: /api/login
  method: post
  detail: 正常登入
  data:
    username: admin
    password: ipharmacare
  check:
    retcode: 0

- #test2
  url: /api/login
  method: post
  detail: 不傳賬號,傳密碼
  data:
    username: test2
    password: ipharmacare2
  check:
    retcode: 0


#執行結果:
[{'url': '/api/login', 'method': 'post', 'detail': '正常登入', 'data': {'username': 'admin', 'password': 'ipharmacare'}, 'check': {'retcode': 0}}, {'url': '/api/login', 'method': 'post', 'detail': '不傳賬號,傳密碼', 'data': {'username': 'test2', 'password': 'ipharmacare2'}, 'check': {'retcode': 0}}] 

  在一個檔案中儲存多個Yaml文件內容:用---隔開,使用yaml.load_all()方法

test.yml

--- #登入模組
- #test1
  url: /api/login
  method: post
  detail: 正常登入
  data:
    username: admin
    password: ipharmacare
  check:
    retcode: 0

--- #登入模組2
- #test1
  url: /api/login
  method: post
  detail: 不傳賬號,傳密碼
  data:
    username: test2
    password: ipharmacare2
  check:
    retcode: 0

  讀取使用yaml.load_all()方法

import yaml

def get_configres(filepath):
   '''
   獲取yaml配置檔案中的內容
   :param filepath:
   :return: 返回的是一個字典
   '''
   f1=open(filepath,"r",encoding='utf-8')
   res=yaml.load_all(f1,Loader=yaml.FullLoader)
   return res

res=get_configres("../config/test.yml")
print(res,type(res))
for i in res:
    print(i)

#讀取後的結果:
<generator object load_all at 0x0322C570> <class 'generator'>
[{'url': '/api/login', 'method': 'post', 'detail': '正常登入', 'data': {'username': 'admin', 'password': 'ipharmacare'}, 'check': {'retcode': 0}}]
[{'url': '/api/login', 'method': 'post', 'detail': '不傳賬號,傳密碼', 'data': {'username': 'test2', 'password': 'ipharmacare2'}, 'check': {'retcode': 0}}]

  

 

相關文章