Yaml的使用


一、Yaml介紹:

YAML 是一種較為人性化的數據序列化語言,可以配合目前大多數編程語言使用。YAML 的語法比較簡潔直觀,特點是使用空格來表達層次結構,其最大優勢在於數據結構方面的表達,所以 YAML 更多應用於編寫配置文件,其文件一般以 .yml 為后綴。一種置標語言,類似於xml。

官方介紹:

YAML 是 "YAML Ain't a Markup Language"(YAML 不是一種標記語言)的遞歸縮寫。在開發的這種語言時,YAML 的意思其實是:"Yet Another Markup Language"(仍是一種標記語言)。

YAML 的語法和其他高級語言類似,並且可以簡單表達清單、散列表,標量等數據形態。它使用空白符號縮進和大量依賴外觀的特色,特別適合用來表達或編輯數據結構、各種配置文件、傾印調試內容、文件大綱(例如:許多電子郵件標題格式和YAML非常接近)。

YAML 的配置文件后綴為 .yml,如:runoob.yml 。

為什么要使用Yaml:

  • 在自動化測試領域,數據是需要和代碼分離的,當我們的數據與代碼分離后,如果出現有數據的變動,只需要修改數據文件,而不需要修改代碼。

數據驅動:基於數據來驅動自動化測試的內容。應用最為廣泛的為兩類:Excel、Yaml。選擇數據驅動類型都是基於測試框架來定義的,也是基於企業的實際框架來應用決定的。(Yaml的使用會比Excel使用起來會更方便些)

二、環境搭建

1、第一步:PyYaml安裝

pip install pyyaml

2、 第二步:Pycharm中導入

點擊:feil - setting - Project:項目名稱

 

 輸入:pyyaml,選擇“PyYAML,點擊 install Package

 安裝成功后顯示:

3、yaml基本語法規則:

  • 大小寫敏感
  • 使用縮進表示層級關系
  • 縮進時不允許使用Tab鍵,只允許使用空格。
  • 縮進的空格數目不重要,只要相同層級的元素左側對齊即可
  • #表示注釋,從這個字符一直到行尾,都會被解析器忽略,這個和python的注釋一樣
  • 一個測試用例,使用一個yaml文件,如果多個測試用例使用同一個yaml文件,管理yaml文件時就會沒有那么好管理
  • yaml文件中參數使用傳入的值,而不是固定值,可在yaml中value定義為空,在進行賦值給它

4、yaml支持的數據結構有三種:

  • 對象:鍵值對的集合,又稱為映射(mapping)/ 哈希(hashes) / 字典(dictionary)
  • 數組:一組按次序排列的值,又稱為序列(sequence) / 列表(list)
  • 純量(scalars):單個的、不可再分的值。字符串、布爾值、整數、浮點數、Null、時間、日期

5、python中,文件后綴名為.yaml

yml與.yaml的文件表示作用相同,即yaml文件;一般來說,最常用的使用.yml作為yaml文件后綴名。例如:

6、一個在線網站,用於校驗yaml文件格式是否正確:http://www.bejson.com/validators/yaml/

7、創建Yaml文件

  • 縮進來進行管理
  • 能夠實現各類數據的展示

(1)列表list

import yaml

#讀取文件
file = open('../data/data1.yaml','r',encoding='utf-8')
print('file===',type(file))
data = yaml.load(stream=file,Loader=yaml.FullLoader)
print('data===',type(data))
print('data',data)

結果:

file=== <class '_io.TextIOWrapper'>
data=== <class 'list'>
data [1, 2, 3, 4, 5]
取值: data[0]--->1

 list嵌套list

-  #下標1
  - 1
  - 2
  - 3
- a    #下標2
- b    #下標3
- c    #下標4

結果:[[1, 2, 3], 'a', 'b', 'c']

 (2)字典dict

  • key的值需要時唯一,value可以時相同的
name: baizi
age: 18
sex: 男

結果:{'name': 'baizi', 'age': 18, 'sex': ''}

 key重復:

name: baizi
age: 18
sex: 男
name: 哈哈

結果:{'name': '哈哈', 'age': 18, 'sex': ''} #當key重復時,讀取的只是末尾的key

字典嵌套字典:

student:
  name: baizi
  age: 18
  sex: 男
student2:
  name: 小劉
  age: 21
  sex: 男

結果:{'student': {'name': 'baizi', 'age': 18, 'sex': ''}, 'student2': {'name': '小劉', 'age': 21, 'sex': ''}}
取值:print(data['student'][name])--->baizi

 列表中嵌套字典:

-
  student:
    name: baizi
    age: 18
    sex: 男
-
  student:
    name: 大寒
    age: 18
    sex: 男

結果:[{'student': {'name': 'baizi', 'age': 18, 'sex': ''}}, {'student': {'name': '大寒', 'age': 18, 'sex': ''}}]

取值【baizi】:data[0]['student']['name']

(3)強制轉換

  • yaml是可以進行強制轉換的,用 !! 實現,如下:
str: !!str 3.14
int: !!int "123"

#結果
{'int': 123, 'str': '3.14'}

 

(4)分段

在同一個yaml文件中,可以用 — 來分段,這樣可以將多個文檔寫在一個文件中

---
name: James
age: 20
---
name: Lily
age: 19

 

三、Yaml使用 

傳統的測試數據內容一般而言是各種數據類型的內容,如果要批量填入一整套內容,一般一整套的內容我們會通過list或是字典的形式將其保存,會更加的方便。

  • 可以完美結合DDT進行使用

目錄:

  • data1.yaml
-
  name: baizi
  age: 18
  sex: 男
-
  name: 大寒
  age: 18 #18是int類型,需要是str,需要是:'18'
  sex: 男
  •  cases.py
import unittest
from ddt import ddt, file_data  # file_data解析Yaml內容

@ddt
class CaseDemo(unittest.TestCase):
    @file_data('../data/data1.yaml')
    def test_01(self, **kwargs):  # **kwargs:接收dict
        print(kwargs.get('name'))

if __name__ == '__main__':
    unittest.main()

結果:

  •  Yaml中使用url、參數

data1.yaml

-
 url: http://www.baidu.com
 txt: 喬峰

-
 url: http://www.baidu.com
 txt: 楊過

cases.py

——讀取Yaml文件內容,打開百度,輸入url,在搜索輸入框輸入Yaml中txt

import unittest
from ddt import ddt, file_data  # file_data解析Yaml內容
from selenium import webdriver
from time import sleep
import warnings


@ddt
class CaseDemo(unittest.TestCase):
    @file_data('../data/data1.yaml')
    def test_01(self, **kwargs):  # **kwargs:接收dict
        warnings.simplefilter('ignore', ResourceWarning) #解決報錯
        driver = webdriver.Chrome()
        driver.get(kwargs['url'])
        driver.find_element_by_id('kw').send_keys(kwargs['txt'])
        sleep(2)

if __name__ == '__main__':
    unittest.main()
  •  模擬接口調用

data2.yaml

-
  method: post
  url: http://url/api01
  params:
    id: 1
    str: 2
    name: 3
  headers:
    ContentType: txt/json

cases.py

import unittest
from ddt import ddt, file_data  # file_data解析Yaml內容

@ddt
class CaseDemo(unittest.TestCase):
    @file_data('../data/data2.yaml')
    def test_01(self, **kwargs):  # **kwargs:接收dict
        print(kwargs['url'])
        print(kwargs['params'])

if __name__ == '__main__':
    unittest.main()

結果:

  • 模擬調用登錄參數

login.yaml

-
  username: 1
  pwd: 1
-
  username: 1
  pwd: 2
-
  username: 2
  pwd: 2

cases.py

import unittest
from ddt import ddt, file_data  # file_data解析Yaml內容

@ddt
class CaseDemo(unittest.TestCase):
    @file_data('../data/login.yaml')
    def test_01(self, **kwargs):  # **kwargs:接收dict
        print(kwargs['username']) #調用username
        print(kwargs['pwd'])  #調用pwd

if __name__ == '__main__':
    unittest.main()

結果:

 

 現在的自動化技術,不是selenium,不是appium,也不是requests。現在核心的自動化測試技術時測試框架的設計和研發。


 


免責聲明!

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



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