日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

Appium+python自動化(三十)- 實現代碼與數據分離 - 數據配置

系統 2168 0

簡介

本篇文章主要介紹了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

Appium+python自動化(三十)- 實現代碼與數據分離 - 數據配置-yaml(超詳解)_第1張圖片

?

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

報不是內部文件證明沒有安裝成功,需要重新安裝

沒有報錯,表明安裝成功

Appium+python自動化(三十)- 實現代碼與數據分離 - 數據配置-yaml(超詳解)_第2張圖片

更多的詳細信息請查看: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語法實現

Appium+python自動化(三十)- 實現代碼與數據分離 - 數據配置-yaml(超詳解)_第3張圖片

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寫法,如下:

Appium+python自動化(三十)- 實現代碼與數據分離 - 數據配置-yaml(超詳解)_第4張圖片

            {
            
              '
            
            
              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對象。

代碼實現

Appium+python自動化(三十)- 實現代碼與數據分離 - 數據配置-yaml(超詳解)_第5張圖片

參考代碼

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
            
            
              '
            
            }
          

代碼實踐

Appium+python自動化(三十)- 實現代碼與數據分離 - 數據配置-yaml(超詳解)_第6張圖片

參考代碼

            # 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))
            
          

運行結果

Appium+python自動化(三十)- 實現代碼與數據分離 - 數據配置-yaml(超詳解)_第7張圖片

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的方法,宏哥就覺得奇了怪了,明明有的怎么會沒有,看官方文檔也是有的,開始以為是模塊導入錯了,檢查沒有問題,最后大半夜還是沒找到問題所在,就睡覺了,第二天看了一眼,突然豁然開朗,原來這才是問題所在,改變文件名,代碼順利運行。

Appium+python自動化(三十)- 實現代碼與數據分離 - 數據配置-yaml(超詳解)_第8張圖片

?

2.有關yaml的數據和代碼分離就介紹到這里吧,謝謝各位IE小伙伴和童鞋們對宏哥一如既往的支持和關注。

?

您的肯定就是我進步的動力。 如果你感覺還不錯,就請鼓勵一下吧!記得點波? 推薦 ?哦!!!(點擊右邊的小球即可!( ^__^ ) 嘻嘻……)
Appium+python自動化(三十)- 實現代碼與數據分離 - 數據配置-yaml(超詳解)_第9張圖片

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

Appium+python自動化(三十)- 實現代碼與數據分離 - 數據配置-yaml(超詳解)_第10張圖片 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Appium+python自動化(三十)- 實現代碼與數據分離 - 數據配置-yaml(超詳解)_第11張圖片


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 潮安县| 呼图壁县| 桦川县| 仁怀市| 霞浦县| 杭锦旗| 阿拉善右旗| 黄梅县| 辉县市| 黎川县| 彰武县| 马公市| 南雄市| 夏邑县| 天镇县| 永胜县| 临安市| 安龙县| 神农架林区| 深州市| 麻江县| 洛南县| 荆门市| 金平| 芦溪县| 福贡县| 乌苏市| 平阳县| 枣庄市| 紫金县| 杭州市| 利辛县| 孝感市| 正镶白旗| 洪江市| 新野县| 喀什市| 尉犁县| 咸丰县| 台北县| 墨竹工卡县|