天天看點

深入解析 YAML 配置檔案:從文法到最佳實踐

作者:程式員月下
深入解析 YAML 配置檔案:從文法到最佳實踐

一、認識YAML

  • YAML(YAML Ain't Markup Language)是一種人類可讀的資料序列化語言。它的設計目标是使資料在不同程式設計語言之間交換和共享變得簡單。YAML采用了一種簡潔、直覺的文法,以易于閱讀和編寫的方式表示資料結構。
  • YAML廣泛應用于配置檔案、資料序列化、API設計和許多其他領域。它被許多程式設計語言和架構所支援,包括Python、Java、Ruby等。在Python中,可以使用PyYAML庫來讀取和寫入YAML檔案。
  • YAML的優點包括易讀性高、易于了解、與多種程式設計語言相容以及支援豐富的資料結構。它的簡潔文法使得配置檔案變得更加直覺和可維護。無論是作為配置檔案格式還是資料交換格式,YAML都是一個強大而受歡迎的選擇。

二、YAML文法規範

YAML的文法特點包括:

  1. 使用縮進表示層級關系,不使用大括号或者其他符号。
  2. 使用冒号來表示鍵值對。
  3. 支援清單和嵌套結構。
  4. 使用注釋以 "#" 開頭。
  5. 支援引用和錨點,可以在文檔中引用其他部分的資料。

YAML(YAML Ain't Markup Language)支援多種資料類型,包括字元串、數字、布爾值、清單、字典和空值。下面是每種資料類型的示例代碼和相應的文法規範:

1. 字元串

  • 文法規範:使用單引号或雙引号将字元串括起來。字元串的引号也可以省略
name: "John"
addr: "長沙"
           

2. 數字

  • 文法規範:直接寫入數字即可。
age: 30
           

3.布爾值

  • 文法規範:使用true表示真,使用false表示假。
isStudent: true
isTeacher: false
           

4.清單

  • 文法規範:使用短橫線(-)表示清單項,清單項之間使用換行進行分隔。
fruits:
    - apple
    - banana
    - orange
           

5.字典

  • 文法規範:使用冒号(:)表示鍵值對,鍵值對之間使用空格進行分隔。
person:
    name: "John"
    age: 30
           

6. 空值

  • 文法規範:使用null表示空值。
status: null
           
  • 這些是YAML支援的常見資料類型和相應的示例代碼。您可以根據需要使用這些資料類型來建構複雜的資料結構。
  • 注意 : YAML對于縮進非常敏感,使用空格進行縮進來表示層級關系。 縮進的空格數目可以是2個或4個,但在整個文檔中必須保持一緻。

三、python操作YAML

  • Python提供了pyyaml庫來操作YAML檔案,操作yaml檔案之前,先安裝好pyyaml庫。
  • 在終端(Pycharm-Terminal)或指令提示符(cmd)中運作以下指令來安裝pyyaml庫:pip install pyyaml

1.python讀取yaml檔案

  • 第一步:提前準備好的yaml檔案,yaml檔案字尾為.yaml或者.yml
name: "John"
addr: "長沙"
age: 18
status: null
isStudent: true
fruits:
    - apple
    - banana
    - orange
teacher:
    name: "Alex"
    age: 30
           
  • 第二步:使用python讀取yaml中的資料
import yaml

with open(file="d.yaml", mode="r",encoding='utf-8') as f:
    res = yaml.safe_load(f)
print(res)
           
  • yaml.safe_load()方法:讀取YAML檔案中的資料。yaml.safe_load()方法參數是檔案對象
  • 運作結果:會自動将yaml中的資料轉為python所支援的資料類型
深入解析 YAML 配置檔案:從文法到最佳實踐

2.python将資料寫入yaml檔案

  • 第一步:将python指定的變量值寫入yaml檔案中
import yaml

data = {
    "Person": {
        "name": "John",
        "age": 30,
        "address": {
            "street": "123 Main St",
            "city": "Anytown",
            "state": "CA"
        }
    }
}
# 将data變量存儲的資料寫入YAML檔案
with open(file="example.yaml", mode="w") as f:
    yaml.dump(data, f)
           
  • yaml.dump()方法:将資料寫入到yaml檔案中。yaml.dump()方法的第一個參數是寫入資料,第二個參數是檔案對象。
  • 第二步:檢視example.yaml中的顯示
深入解析 YAML 配置檔案:從文法到最佳實踐

四、YAML結合UI自動化實作KDT

  • KDT(Keyword-Driven Testing):關鍵字驅動測試的英文簡稱。
  1. yaml資料準備
# 通路頁面
- action: goto
  params:
    url: 'https://www.baidu.com'
# 輸入python
- action: sendkeys
  params:
    locator: ['id','kw']
    value: 'python'
# 點選搜尋按鈕
- action: click
  params:
    locator: ['id','su']
# 斷言
- action: assert_text_contains
  params:
    locator: ['id','content_left']
    excepted: 'python'
           
  1. basepage方法封裝
from selenium.webdriver import Chrome,ActionChains

class BasePage:
    def __init__(self,driver:Chrome):
        self.driver = driver

    def goto(self,url):
        '''打開網址'''
        self.driver.get(url)

    def click(self,locator):
        '''點選操作'''
        el = self.driver.find_element(*locator)
        try:
            el.click()
        except:
            ActionChains(self.driver).click(el).perform()

    def sendkeys(self,value,locator=None):
        '''發送文本操作'''
        if locator:
            # 相當于ActionChains中的send_keys_to_element(ele,value),先做點選,再做文本輸入
            el = self.driver.find_element(*locator)
            el.send_keys(value)
        else:
            ActionChains(self.driver).send_keys(value).perform()

    def assert_text_contains(self,locator,excepted):
        '''斷言文本是否包含指定的内容'''
        el = self.driver.find_element(*locator)
        assert excepted in el.text
           
  1. 測試用例編寫---實作關鍵字驅動測試
import time
import yaml
from selenium import webdriver
from basepage import BasePage

# 1、讀取yaml檔案中的資料
with open(file='test_keyword.yaml',mode='r',encoding='utf-8') as f:
    data = yaml.safe_load(f)

# 2、測試用例編寫
def test_01():
    # 初始化浏覽器操作
    driver = webdriver.Chrome()
    driver.implicitly_wait(10)
    driver.maximize_window()
    # 執行個體化BasePage的對象
    basepage = BasePage(driver)
    # 周遊讀取到的data資料
    for step in data:
        # 擷取動作名稱
        method_name = step['action']
        # 擷取參數
        params = step['params']
        # 擷取類中方法名
        method = getattr(basepage, method_name)
        # 調用方法,輸入參數
        method(**params)  # 字典解包
    time.sleep(2)
    driver.quit()           

繼續閱讀