一、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。現在核心的自動化測試技術時測試框架的設計和研發。
