YAML檔案

2023-04-15 12:00:29

yaml是一種資料格格式,字尾是 .yml或 .yaml

用於組態檔以及編寫測試用例

語法規則

使用規則

區分大小寫

通過縮排表示層級,縮排使用空格非Tab

#註釋

字串一般不用雙引號,預設就是字串

資料型別

1.標量:最基本的資料型別

    • 整數
    • 浮點數
    • 字串
    • 預設字串不用引號
    • 單引號可表示字串,用於跳脫特殊字元\
    • 雙引號也可表示字串,不跳脫
    • 布林值

Null 對應 Python中的None

    • 日期時間型別

2.物件:鍵(空格)值對,類似dict

3.陣列:用過一組同級別的-開頭,類似陣列

name :
  - name1 : 霸王
  - name2 : '霸\n王'
  - name3 : "霸\n王"
age : 25
height : 156.3
date : 2023-3-20 20:20:20
shenfen : null

讀取檔案中的所有資料型別

{'name': [{'name1': '霸王'}, {'name2': '霸\\n王'}, {'name3': '霸\n王'}], 'age': 25, 'height': 156.3, 'date': datetime.datetime(2023, 3, 20, 20, 20, 20), 'shenfen': None}

資料型別轉換

使用!!+要轉的資料型別

age: !!str 18 6

height: !!float "17.5"

參照的應用-用於重複出現多次的資料

&表示錨點,*參照錨點,<<合併到當前資料

name : &name
  - name1 : 霸王
  - name2 : '霸\n王'
  - name3 : "霸\n王"
age : 25
height : 156.3
date : 2023-3-20 20:20:20
shenfen : null
newname : *name
newnages:
  name100: name100
  <<: *name

{'name': [{'name1': '霸王'}, {'name2': '霸\\n王'}, {'name3': '霸\n王'}],

'age': 25,

'height': 156.3,

'date': datetime.datetime(2023, 3, 20, 20, 20, 20),

'shenfen': None,

'newname': [{'name1': '霸王'}, {'name2': '霸\\n王'}, {'name3': '霸\n王'}],

'newnages': {'name3': '霸\n王', 'name2': '霸\\n王', 'name1': '霸王', 'name100': 'name100'}}

YAML的讀寫和清空

python安裝包

pip install pyyaml

讀取
def read_yaml():
    with open("./test_case/login.yaml",encoding="utf-8") as f:
        value = yaml.safe_load(f)
        print(value)
寫入
def write_yaml():
    with open("./test_case/login.yaml",encoding="utf-8",mode="a+") as f:
        date = {"sdad":"sdsadsa"}
        yaml.safe_dump(date,f)
清空
def clean_yaml():
    with open("./test_case/login.yaml", encoding="utf-8", mode="w") as f:
        f.truncate()

pytest的parametrize資料驅動

資料驅動:

@pytest.mark.parametrize(args_name,args_value)

args_name:引數名

args_value:引數值(只能是列表list或元祖tuple)

import pytest
import allure
@allure.epic("專案名稱2")
@allure.feature("模組名稱2")
class TestBpi:
    @allure.story("列印引數")
    @pytest.mark.parametrize("name", ["sidyoad", "sdysfysd", "fjdisifdfuo"])
    def test_name(self,name):
        print(name)

如果allure報告樣式不顯示過長引數,

修改:\venv\Lib\site-packages\allure_pytest\listener.py 中為 test_result.parameters.extend([])

-
  feature: 模組名稱1
  story: 介面名稱1
  title: 用例標題1
  request:
    method: get
    url: /cgi-bin/token
    params:
      "grant_type": "client_credential"
      "appid": "xx"
      "secret": "xx"
    headers: null
  validate: null
-
  feature: 模組名稱2
  story: 介面名稱2
  title: 用例標題2
  request:
    method: get
    url: /cgi-bin/token
    params:
      "grant_type": "client_credential"
      "appid": "xx"
      "secret": "xxx"
    headers: null
  validate: null
import pytest
import allure
from commons.yaml_utils import read_yaml

@allure.epic("專案名稱2")
@allure.feature("模組名稱2")
class TestApi:
    @allure.story("列印引數")
    @pytest.mark.parametrize("caseinfo", read_yaml("./test_case/a/login.yaml"))
    def test_name(self,caseinfo,base_url):
        allure.dynamic.title(caseinfo["title"])
        print("模組名稱:%s"%caseinfo["feature"])
        print("介面名稱:%s"%caseinfo["story"])
        print("用例標題:%s"%caseinfo["title"])
        print("請求方式:%s"%caseinfo["request"]["method"])
        print("請求路徑:%s"%base_url+caseinfo["request"]["url"])
        print("請求引數:%s"%caseinfo["request"]["params"])
        print("請求頭:%s"%caseinfo["request"]["headers"])
        print("斷言:%s"%caseinfo["validate"])
# 操作工具包
import yaml
def read_yaml(yaml_path):
    with open(yaml_path,encoding="utf-8") as f:
        value = yaml.safe_load(f)
        return value

def write_yaml():
    with open("./test_case/login.yaml",encoding="utf-8",mode="a+") as f:
        date = {"sdad":"sdsadsa"}
        yaml.safe_dump(date,f)

def clean_yaml():
    with open("./test_case/login.yaml", encoding="utf-8", mode="w") as f:
        f.truncate()