1. 程式人生 > >Appium+python自動化(三十)- 實現程式碼與資料分離 - 資料配置-yaml(超詳解)

Appium+python自動化(三十)- 實現程式碼與資料分離 - 資料配置-yaml(超詳解)

簡介

本篇文章主要介紹了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呢?因為:

  1. YAML的可讀性好。
  2. YAML和指令碼語言的互動性好。
  3. YAML使用實現語言的資料型別。
  4. YAML有一個一致的資訊模型。
  5. 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資料型別詳解

支援資料型別

  1. 純量(scalars):單個的、不可再分的值
  2. 陣列:一組按次序排列的值,又稱為序列(sequence) / 列表(list)
  3. 物件:鍵值對的集合,又稱為對映(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小夥伴和童鞋們對巨集哥一如既往的支援和關注。

 

您的肯定就是我進步的動力。如果你感覺還不錯,就請鼓勵一下吧!記得點波 推薦 哦!!!(點選右邊的小球即可!(^__^) 嘻嘻……)

       個人公眾號                                                             微信群 (微信群已滿100,可以加巨集哥的微信拉你進群,請備註:進群)          

                                                                &n