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呢?因为:
- 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: , spouse: { name: 'Jane Smith', age: }, children: [{ name: 'Jimmy Smith', age: }, { name: 'Jenny Smith', age: }] }
yaml
name: Tom Smith age: spouse: name: Jane Smith age: children: - name: Jimmy Smith age: - name: Jenny Smith age:
语法特点
- 大小写敏感
- 使用缩进表示层级关系
- 缩进时不允许使用Tab键,只允许使用空格。
- 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可
- 下载地址:http://pyyaml.org/wiki/PyYAML
- 安装:下载完成后点击运行安装包即可。
- 安装完成后在python引入yaml检测是否安装成功。
- PyYAML官方文档
结构通过空格缩进来展示。列表里的项用"-"来代表,字典里的键值对用":"分隔.
这几乎就是所有的语法了.
比如……
一般YAML文件扩展名为.yaml。比如:John.yaml
name: John Smith age: spouse: name: Jane Smith age: children: - name: Jimmy Smith age: - name: Jenny Smith age
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: # Yaml 也允许另一种写法,将所有键值对写成一个行内对象。 {platformName: Android,platformVersion: } #注意:冒号后面一定要有空格!对应到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: spouse: name: Jane Smith age: children: - name: Jimmy Smith age: - name: Jenny Smith age:
转化为Python的写法为:
通过load方法转换成python写法,如下:
{,},},{}]}
下边随宏哥一起看一下如何操作实现转换
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[]['name']) print(data[]['age']) print(data[]['name']) print(data[]['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- # .先设置编码,utf-8可支持中英文,如上,一般放在第一行 # .注释:包括记录创建时间,创建人,项目名称。 ''' Created on -- @author: 北京-宏哥 QQ交流群: Project:学习和使用appium自动化测试-代码和数据分离-yaml数据配置 ''' # .导入模块 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: deviceName: 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:
capability_yaml.py
# coding=utf- # .先设置编码,utf-8可支持中英文,如上,一般放在第一行 # .注释:包括记录创建时间,创建人,项目名称。 ''' Created on -- @author: 北京-宏哥 QQ交流群: Project:学习和使用appium自动化测试-代码和数据分离-yaml数据配置 ''' # .导入模块 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,可以加宏哥的微信拉你进群,请备注:进群)
Appium+python自动化(三十)- 实现代码与数据分离 - 数据配置-yaml(超详解)的更多相关文章
- Appium+python自动化(十六)- ADB命令,知否知否,应是必知必会(超详解)
简介 Android 调试桥(adb)是多种用途的工具,该工具可以帮助你你管理设备或模拟器 的状态. adb ( Android Debug Bridge)是一个通用命令行工具,其允许您与模拟器实例或 ...
- python接口自动化(十)--post请求四种传送正文方式(详解)
简介 post请求我在python接口自动化(八)--发送post请求的接口(详解)已经讲过一部分了,主要是发送一些较长的数据,还有就是数据比较安全等.我们要知道post请求四种传送正文方式首先需要先 ...
- Jmeter(三十四) - 从入门到精通进阶篇 - 参数化(详解教程)
1.简介 前边三十多篇文章主要介绍的是Jmeter的一些操作和基础知识,算是一些初级入门的知识点,从这一篇开始我们就来学习Jmeter比较高级的操作和深入的知识点了.今天这一篇主要是讲参数化,其实前边 ...
- 第三十节,目标检测算法之Fast R-CNN算法详解
Girshick, Ross. “Fast r-cnn.” Proceedings of the IEEE International Conference on Computer Vision. 2 ...
- Appium+python自动化(十)- 元素定位秘籍助你打通任督二脉 - 上卷(超详解)
简介 你有道灵光从天灵盖喷出来你知道吗,年纪轻轻就有一身横练的筋骨,简直百年一见的练武奇才啊,如果有一天让你打通任督二脉,那还不飞龙上天啊.正所谓我不入地狱谁入地狱,警恶惩奸维护世界和平这个任务就交个 ...
- Appium+python自动化(十五)- Android 这些基础知识,你知多少???(超详解)
简介 前边具体操作和实战已经讲解和分享了很多了,但是一些android的一些基础知识,你又知道多少了,你都掌握了吗?这篇就由宏哥给小伙伴们既是一个分享,又是对前边的一次总结.为什么要对这些做一个简单的 ...
- python接口自动化(三十四)-封装与调用--函数和参数化(详解)
简介 前面虽然实现了参数的关联,但是那种只是记流水账的完成功能,不便于维护,也没什么可读性,随着水平和技能的提升,再返回头去看前边写的代码,简直是惨不忍睹那样的代码是初级入门的代码水平都达不到.接下来 ...
- python接口自动化(三十)--html测试报告通过邮件发出去——中(详解)
简介 上一篇,我们虽然已经将生成的最新的测试报告发出去了,但是MIMEText 只能发送正文,无法带附件,因此我还需要继续改造我们的代码,实现可以发送带有附件的邮件.发送带附件的需要导入另外一个模块 ...
- Appium+python自动化(十二)- Android UIAutomator终极定位凶“胸”器(七)(超详解)
简介 乍眼一看,小伙伴们觉得这部分其实在异性兄弟那里就做过介绍和分享了,其实不然,上次介绍和分享的大哥是uiautomatorviewer,是一款定位工具.今天介绍的是一个java库,提供执行自动化测 ...
- Appium+python自动化(十八)- 你难道是猴哥失散多年的混血弟弟还是妹妹???- Monkey事件(超详解)
操作事件简介 Monkey所执行的随机事件流中包含11大事件,分别是触摸事件.手势事件.二指缩放事件.轨迹事件.屏幕旋转事件.基本导航事件.主要导航事件.系统按键事件.启动Activity事件.键盘事 ...
随机推荐
- Java虚拟机详解(三)------垃圾回收
如果对C++这门语言熟悉的人,再来看Java,就会发现这两者对垃圾(内存)回收的策略有很大的不同. C++:垃圾回收很重要,我们必须要自己来回收!!! Java:垃圾回收很重要,我们必须交给系统来帮我 ...
- 基于SpringCloud的Microservices架构实战案例-在线API管理
simplemall项目前几篇回顾: 1基于SpringCloud的Microservices架构实战案例-序篇 2基于SpringCloud的Microservices架构实战案例-架构拆解 3基于 ...
- Bzoj 2064 分裂 题解
2064: 分裂 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 570 Solved: 350[Submit][Status][Discuss] De ...
- Linux查看空间大小的命令
在linux中,常用查看空间大小的命令有df.du,下面依次介绍一下. df 命令是linux系统上以磁盘分区为单位来查看文件系统的命令,后面可以加上不同的参数来查看磁盘的剩余空间信息.Linux d ...
- MMM 数位dp学习记
数位dp学习记 by scmmm 开始日期 2019/7/17 前言 状压dp感觉很好理解(本质接近于爆搜但是又有广搜的感觉),综合了dp的高效性(至少比dfs,bfs优),又能解决普通dp难搞定的问 ...
- Ray聊天记录
由于工作变动,Ray的文档.示例没有及时更新,深表歉意.在Ray升级后,性能较几个月前有了非常大的提升,也更具易用性.这是QQ交流群里大家的聊天记录,跟大家分享一下(由于时间仓促群里大家的聊天记录没有 ...
- MyBatis从入门到精通:select用法进一步讲解
selectAll:笔记 /* 定义接口方法的返回值的时候,必须注意查询SQL可能返回的结果数量.当 返回值最多只有一个结果的时候,可以将结果返回值定义为SysUser,此时 返回值类型为List&l ...
- 【基础算法-模拟-例题-玩具谜题】-C++
原题链接P1563 玩具谜题 这道题依然是一道模拟题目,就简单讲讲坑点: 1.有些时候在转圈的时候要用到它们站成了一个环的性质! 2.小人面朝的方向影响了它们左右的方向! 3.注意考虑顺时针逆时针与小 ...
- BAT的人都是怎么学习的
不知道你发现没,在技术领域走在前列的人,基本都符合一个条件:保持对新技术的敏感度,还能定期更新自己的技能储备. 要做到这一点,最高效的办法就是直接跟 BAT 等一线大厂取经.说白了,平台足够大,就有更 ...
- TensorFlow笔记-变量,图,会话
变量 存储一些临时值的作用或者长久存储.在Tensorflow中当训练模型时,用变量来存储和更新参数.变量包含张量(Tensor)存放于内存的缓存区.建模时它们需要被明确地初始化,模型训练后它们必须被 ...