簡介
本篇文章主要介紹了python中yaml配置文件模塊的使用讓其完成數據和代碼的分離,宏哥覺得挺不錯的,于是就義無反顧地分享給大家,也給大家做個參考。一起跟隨宏哥過來看看吧。
思考問題
前面我們配置Capability時,各個參數都是在代碼里面寫死的,比如:desired_caps['platformVersion']='5.1.1' 一旦設備和測試的app發生改變則需要去代碼里面一個個修改,要么同時根據不同設備不同App來維護多套代碼,這樣顯示是不符合規范而且是低效的!違背了自動化的初衷,那么如何改進這樣的現狀呢?
解決思路
針對這種可能頻繁變動的部分,可以將數據和代碼分離。將數據單獨抽離出來放在配置文件里面,?代碼直接從配置文件去讀取數據,這樣能夠減少代碼冗余,提高效率。
PS:類似的Web前端的html標簽和css分離。
配置數據該如何管理?這里宏哥覺得yaml不錯,所以就推薦小伙伴們和童鞋們使用 yaml 來管理配置數據。
yaml概述
yaml簡介
和GNU一樣,YAML是一個遞歸著說“不”的名字。不同的是,GNU對UNIX說不,YAML說不的對象是XML。
YAML不是XML。
為什么不是XML呢?因為:
- YAML的可讀性好。
- YAML和腳本語言的交互性好。
- YAML使用實現語言的數據類型。
- YAML有一個一致的信息模型。
- YAML易于實現。
上面5條也就是XML不足的地方。同時,YAML也有XML的下列優點:
YAML可以基于流來處理;
YAML表達能力強,擴展性好。
總之,YAML試圖用一種比XML更敏捷的方式,來完成XML所完成的任務。
更多的內容及規范參見http://www.yaml.org。
正如YAML所表示的YAML Ain’t Markup Language,YAML 是一種簡潔的非標記語言。YAML以數據為中心,使用空白,縮進,分行組織數據,從而使得表示更加簡潔易讀。
由于實現簡單,解析成本很低,YAML特別適合在腳本語言中使用。列一下現有的語言實現:Ruby,Java,Perl,Python,PHP,JavaScript等。
YAML 是專門用來寫配置文件的語言,非常簡潔和強大,遠比 JSON 格式方便。比如同一段數據Josn和Yaml的表示分別如下:
Json
{
name:
'
Tom Smith
'
,
age:
37
,
spouse: {
name:
'
Jane Smith
'
,
age:
25
},
children: [{
name:
'
Jimmy Smith
'
,
age:
15
}, {
name:
'
Jenny Smith
'
,
age:
12
}]
}
yaml
name: Tom Smith
age:
37
spouse:
name: Jane Smith
age:
25
children:
-
name: Jimmy Smith
age:
15
-
name: Jenny Smith
age:
12
語法特點
- 大小寫敏感
- 使用縮進表示層級關系
- 縮進時不允許使用Tab鍵,只允許使用空格。
- 縮進的空格數目不重要,只要相同層級的元素左側對齊即可
- 下載地址: http://pyyaml.org/wiki/PyYAML
- 安裝:下載完成后點擊運行安裝包即可。
- 安裝完成后在python引入yaml檢測是否安裝成功。
- PyYAML官方文檔
結構通過空格縮進來展示。列表里的項用"-"來代表,字典里的鍵值對用":"分隔.
這幾乎就是所有的語法了.
比如……
一般YAML文件擴展名為.yaml。比如:John.yaml
name: John Smith
age:
37
spouse:
name: Jane Smith
age:
25
children:
-
name: Jimmy Smith
age:
15
-
name: Jenny Smith
age
12
John今年37歲,有一個幸福的四口之家。兩個孩子Jimmy 和Jenny活潑可愛。妻子Jane年輕美貌。
如果深入研究的話還可能發現一些社會問題。
可見YAML的可讀性是不錯。
yaml環境搭建
下載安裝
1.下載地址: http://pyyaml.org/wiki/PyYAML
?
2.安裝:下載完成后點擊運行安裝包即可。
或者解壓縮歸檔并通過執行來安裝包
$ python setup.py install
如果要使用 LibYAML 綁定,則需要下載并安裝 LibYAML 。 然后,您可以通過執行來安裝綁定
$ python setup.py --with-libyaml install
源代碼分發包括一個全面的測試套件。 要運行測試,請鍵入
$ python setup.py test
3. 安裝完成后在 python引入yaml檢測是否安裝成功。
命令安裝
1.安裝:輸入pip install pyyaml或者pip3 install pyyaml,由于宏哥已經安裝,所以會出現如圖的提示信息
2.檢查是否安裝成功:輸入python
3.再輸入:import yaml
報不是內部文件證明沒有安裝成功,需要重新安裝
沒有報錯,表明安裝成功
更多的詳細信息請查看:PyYAML官方文檔
yaml數據類型詳解
支持數據類型
- 純量 (scalars):單個的、不可再分的值
- 數組 :一組按次序排列的值,又稱為序列(sequence) / 列表(list)
- 對象 :鍵值對的集合,又稱為映射(mapping)/ 哈希(hashes) / 字典(dictionary)
純量
數據最小的單位,不可以再分割。類似于Python中單個變量
flag
list數組
與Python的list數組結構類似,數組元素使用“-”開頭,也可以根據縮進進行數組嵌套。
-
Jack
-
Harry
-
Sunny
# 也可以寫成一行
[Jack,Harry,Sunny]
#對應到python的list寫法如下:
[
'
Jack
'
,
'
Harry
'
,
'
Sunny
'
]
擴展學習: Python數據類型
對象
對象的一組鍵值對,使用冒號結構表示。類似Python中的字典數據結構。
platformName: Android
platformVersion:
6.0
.
1
# Yaml 也允許另一種寫法,將所有鍵值對寫成一個行內對象。
{platformName: Android,platformVersion:
6.0
.
1
}
#注意:冒號后面一定要有空格!對應到python字典的寫法如下:
{
'
platformName
'
:
'
Android
'
,
'
platformVersion
'
:
'
6.0.1
'
}
數據嵌套
yaml數據嵌套表示可以將上面的各類數據根據實際場景進行組合嵌套。
數據場景
Tom Smith 37歲,他有一個妻子叫 Jane Smith,25歲。 另外他有2個孩子,一個叫Jimmy Smith,15歲;另外一個叫Jenny Smith ,12歲。
yaml語法實現
yaml語法參考
familyInfo.yaml
name: Tom Smith
age:
37
spouse:
name: Jane Smith
age:
25
children:
-
name: Jimmy Smith
age:
15
-
name: Jenny Smith
age:
12
轉化為Python的寫法為:
通過load方法轉換成python寫法,如下:
{
'
name
'
:
'
Tom Smith
'
,
'
age
'
:
37
,
'
spouse
'
:{
'
name
'
:
'
Jane Smith
'
,
'
age
'
:
25
},
'
childern
'
:[{
'
name
'
:
'
Jimmy Smith
'
,
'
age
'
:
15
},{
'
name
'
:
'
Jenny Smith
'
,
'
age
'
:
12
}]}
下邊隨宏哥一起看一下如何操作實現轉換
yaml數據操作
數據讀取
測試場景
- 讀取配置中的所有信息
- 讀取yaml數據表中Tom Smith的姓名、年齡、信息
- 單獨讀取配偶的姓名和年齡信息
- 分別讀取兩個孩子的姓名、年齡信息
load方法
load(stream, Loader=Loader) 解析文件流中的第一個YAML文檔并生成相應的Python對象。
代碼實現
參考代碼
yaml_load.py
import yaml
file
=open(
'
familyInfo.yaml
'
,
'
r
'
)
data
=
yaml.load(file)
print(data)
print(data[
'
name
'
])
print(data[
'
age
'
])
print(data[
'
spouse
'
])
print(data[
'
spouse
'
][
'
name
'
])
print(data[
'
spouse
'
][
'
age
'
])
print(data[
'
children
'
])
print(data[
'
children
'
][
0
][
'
name
'
])
print(data[
'
children
'
][
0
][
'
age
'
])
print(data[
'
children
'
][
1
][
'
name
'
])
print(data[
'
children
'
][
1
][
'
age
'
])
數據修改
如果想改變某個數據,可以使用如下方法:
data[
'
name
'
]=
'beijinghongge
'
print(data[
'
name
'
])
注意:此處只是變量類型的數據變更,不會真正修改到yaml配置表中的數據。
數據轉化
方法:dump()可以將Python對象序列化成YAML流。如果stream為None,則返回生成的字符串。
測試場景
將下面python數據類型轉化為yaml數據類型
slogan=[
'
welcome
'
,
'
to
'
,
'
baidu
'
]
website
={
'
url
'
:
'
www.baidu.com
'
}
代碼實踐
參考代碼
# coding=utf-
8
#
1
.先設置編碼,utf-
8可支持中英文,如上,一般放在第一行
#
2
.注釋:包括記錄創建時間,創建人,項目名稱。
'''
Created on
2019
-
8
-
13
@author: 北京
-宏哥 QQ交流群:
707699217
Project:學習和使用appium自動化測試
-代碼和數據分離-
yaml數據配置
'''
#
3
.導入模塊
import yaml
slogan
= [
'
welcome
'
,
'
to
'
,
'
baidu
'
]
website
= {
'
url
'
:
'
www.baidu.com
'
}
# python data
print(slogan)
print(website)
# yaml data
print(yaml.dump(slogan))
print(yaml.dump(website))
運行結果
Capability配置數據分離實踐
測試場景
將capability的各項參數值與代碼進行分離。
場景分析
結合前面所學習的知識,我們可以把之前capability中各項寫死的配置信息來抽離出來,存放在一個yaml配置文件中,使用 對象數據類型來存儲數據;然后調用load()方法讀取數據,從而實現數據和代碼的分離。
代碼實現
1.參數配置表:desired_caps.yaml
platformName: Android
platformVersion:
5.1
.
1
deviceName:
127.0
.
0.1
:
62001
app: C:\Users\DELL\Downloads\kaoyanbang.apk
appPackage: com.tal.kaoyan
appActivity: com.tal.kaoyan.ui.activity.SplashActivity
noReset: False
unicodeKeyboard: True
resetKeyboard: True
ip:
127.0
.
0.1
port:
4723
capability_yaml.py
# coding=utf-
8
#
1
.先設置編碼,utf-
8可支持中英文,如上,一般放在第一行
#
2
.注釋:包括記錄創建時間,創建人,項目名稱。
'''
Created on
2019
-
8
-
14
@author: 北京
-宏哥 QQ交流群:
707699217
Project:學習和使用appium自動化測試
-代碼和數據分離-
yaml數據配置
'''
#
3
.導入模塊
from
appium import webdriver
import yaml
file
=open(
'
desired_caps.yaml
'
,
'
r
'
)
data
=
yaml.load(file)
desired_caps
=
{}
desired_caps[
'
platformName
'
]=data[
'
platformName
'
]
desired_caps[
'
platformVersion
'
]=data[
'
platformVersion
'
]
desired_caps[
'
deviceName
'
]=data[
'
deviceName
'
]
desired_caps[
'
app
'
]=data[
'
app
'
]
desired_caps[
'
appPackage
'
]=data[
'
appPackage
'
]
desired_caps[
'
appActivity
'
]=data[
'
appActivity
'
]
desired_caps[
'
noReset
'
]=data[
'
noReset
'
]
driver
=webdriver.Remote(
'
http://
'
+str(data[
'
ip
'
])+
'
:
'
+str(data[
'
port
'
])+
'
/wd/hub
'
,desired_caps)
運行結果
報錯分析
yaml.scanner.ScannerError: mapping values are not allowed here
該報錯說明map對象數據類型寫法錯誤,一般為“:”后面沒有留空格。如:platformName:Android
?小結
1.打了一輩子的鷹,最后被鷹啄了眼。在小陰溝里翻船了,在動手實踐的時候宏哥為了圖方便,直接將yaml_dump.py命名為yaml.py,運行代碼后一直報錯,yaml沒有dump的方法,宏哥就覺得奇了怪了,明明有的怎么會沒有,看官方文檔也是有的,開始以為是模塊導入錯了,檢查沒有問題,最后大半夜還是沒找到問題所在,就睡覺了,第二天看了一眼,突然豁然開朗,原來這才是問題所在,改變文件名,代碼順利運行。
?
2.有關yaml的數據和代碼分離就介紹到這里吧,謝謝各位IE小伙伴和童鞋們對宏哥一如既往的支持和關注。
?
您的肯定就是我進步的動力。
如果你感覺還不錯,就請鼓勵一下吧!記得點波?
推薦
?哦!!?。c擊右邊的小球即可!(
^__^
) 嘻嘻……)
? ? ? ?個人公眾號? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 微信群 ?(微信群已滿100,可以加宏哥的微信拉你進群,請備注:進群)? ? ? ? ??
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元

