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

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
