Appium+python自动化(三十)- 实现代码与数据分离 - 数据配置

系统 406 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

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请请扫描上面二维码支持博主1元、2元、5元等您想捐的金额吧,狠狠点击下面给点支持吧

发表我的评论
最新评论 总共0条评论