python如何解析配置文件并应用到项目中


Posted in Python onJune 27, 2019

配置文件的类型

通常自动化测试中的配置文件是以.ini 和 .conf 为后缀的文件

配置文件的组成

1.section

2.option

3.value

配置文件的格式

[section_name]
# =号可以使用:号代替
option_name=value

配置文件的注释

通常使用#号或者;分号注释,有一点一定要注意,注释最好不要写到option_name=value行的后面,否则你会遇到意想不到的错误

配置文件的作用

那么我们的配置文件主要来干些什么呢?

1.可以存储测试中测试用例使用的测试数据

2.可以存储测试中用到的资源数据,比如数据库的地址,用户,密码等等

3.可以作为ui对象库使用,存储我们ui自动化测试项目中的页面元素信息

4.可以存储项目使用的全局变量,比如项目的根目录,日志,报告的路径等等

以上这些数据均可以存放在配置文件中,方便的我们读取,当项目的一些配置信息改变时,我们只要修改配置文件即可,而不用修改具体代码,大大减小项目的维护成本!

ok,既然我都标题党了,那么现在就告诉你怎么1分钟应用到项目中。有配置文件我们必定要先解析文件才行,我们现在有这样一个配置文件,存放如下内容

[126mail_login]
loginPage.frame=xpath>//div[@id='loginDiv']/iframe
loginPage.username=xpath>//input[@name='email']
loginPage.password=xpath>//input[@name='password']
loginPage.loginBtn=xpath>//a[@id='dologin']
[126mail_homePage]
homePage.addressbook=id>_mail_tabitem_1_4text
[126mail_addContactPage]
addContactPage.newContact=xpath>//span[text()='新建联系人']
addContactPage.newName=id>input_N
addContactPage.newMail=xpath>//div[@id='iaddress_MAIL_wrap']//input[@class='nui-ipt-input']
addContactPage.newMark=xpath>//span[@class='nui-chk-text']/preceding-sibling::span/b
addContactPage.newPhone=xpath>//div[@id='iaddress_TEL_wrap']//input[@class='nui-ipt-input']
addContactPage.newComment=id>input_DETAIL
addContactPage.newCommit=xpath>//span[text()='确 定']

封装代码

下面这个封装是我之前写的,不算是很通用的功能,但是如果你的配置文件和我上面的一样用来存储ui对象库的话就完全适用了。

"""
------------------------------------
@Time : 2019/5/16 10:56
@Auth : linux超
@File : ParseConfigOld.py
@IDE : PyCharm
@Motto: Real warriors,dare to face the bleak warning,dare to face the incisive error!
------------------------------------
"""
from configparser import (
ConfigParser,
NoSectionError,
NoOptionError
)
filename = 'configfile.ini'
class ParseConfigFile(object):
"""
解析ini配置文件
"""
def __init__(self):
try:
self.cf = ConfigParser() # 获取配置文件对象
self.cf.read(filename, encoding='utf-8') # 加载配置文件到内存中
except Exception as e:
raise e
def getItemsSection(self, section):
"""
获取section下面所有section的键值
:param sectionName:
:return:
"""
try:
value = dict(self.cf.items(section))
except (NoSectionError, KeyError):
print('{} not exit'.format(section))
except Exception as e:
raise e
else:
return value
def getElementValue(self, section, option):
"""根据自己的需要修改这部分代码"""
try:
# 我配置文件是用这个符号来分割的,所有解析的时候要使用这个符号分割,得到元素
locator = self.cf.get(section, option).split('>')
except (NoSectionError, NoOptionError, KeyError):
print('section:{} or option:{} not exit'.format(section, option))
except Exception as e:
raise e
else:
return locator # 获取option键对应的value
def getAllSections(self):
try:
all_sections = self.cf.sections()
except Exception as e:
raise e
else:
return all_sections # 所有的sections返回值是个列表
if __name__=='__main__':
cf = ParseConfigFile()
locator = cf.getElementValue('126mail_login','loginPage.username')
print(locator)
print(cf.getItemsSection('126mail_login'))
print(cf.getAllSections())

封装改进

下面的封装几乎可以完成任何自动化测试项目中配置文件存储任何数据类型的数据解析

"""
------------------------------------
@Time : 2019/5/16 9:11
@Auth : linux超
@File : ParseConfigFile.py
@IDE : PyCharm
@Motto: Real warriors,dare to face the bleak warning,dare to face the incisive error!
------------------------------------
"""
from configparser import (
ConfigParser,
NoOptionError,
NoSectionError
)
class ParseConfigFile(ConfigParser):
def __init__(self, filename):
super().__init__()
try:
self.filename = filename
self.read(filename, encoding='utf-8')
except Exception as e:
raise e
def get_all_option(self, section='DEFAULT'):
"""获取指定section下所有的option"""
try:
options = self.options(section)
return options
except NoSectionError:
print('NoSectionError : {} not exist'.format(section))
except Exception as e:
raise e
def get_value(self, section='DEFAULT'):
"""获取指定section中所有的option和value,返回一个字典"""
try:
value = dict(self.items(section))
return value
except (NoSectionError, KeyError):
print('{} not exist'.format(section))
except Exception as e:
raise e
def get_option_value(self, section, option, flag=False):
"""
获取指定section和option对应的数据
如果option对应数据为数字,则自动转换为int或者float
如果option对应的数据是个可以使用eval转换的类型,则传递flag为True时,自动转换,否则输出str
"""
try:
value = self.get(section, option)
if value.isdigit():
return int(value)
try:
return float(value)
except Exception:
pass
if isinstance(flag, bool) and flag:
return eval(value)
return value
except (NoSectionError, NoOptionError, KeyError):
print('no option "{}" or section "{}"'.format(option, section))
except Exception as e:
raise e
def __call__(self, section='DEFAULT', option=None, flag_eval=False, flag_bool=False):
"""
对象当成函数使用的时候会默认调用这个方法
这个方法可以实现上面多数功能
:param section:
:param option:
:param flag_eval: 如果为True 我们使用eval转换类型
:param flag_bool: 如果为True 我们使用把数据转换为bool
:return:
"""
if option is None:
return dict(self[section])
if isinstance(flag_bool, bool):
if flag_bool:
return self.getboolean(section, option)
else:
raise ValueError('{} must be type bool'.format(flag_bool))
data = self.get(section, option)
if data.isdigit():
return int(data)
try:
return float(data)
except Exception:
pass
if isinstance(flag_eval, bool):
if flag_eval:
return eval(data)
else:
raise ValueError('{} must be type bool'.format(flag_eval))
return data
if __name__ == '__main__':
conf = ParseConfigFile('configfile.ini')
print('所有的option', conf.get_all_option('FilePath'))
print('获取section:{},option:{}对应的数据:{}'.
format('FilePath', 'TestCase', conf.get_option_value('FilePath', 'TestCase')))
print('获取section:{}下所有的键值{}'.format('FilePath', conf.get_value('ExcelNum')))
print(conf())
print(conf(section='FilePath', option='TestCase'))
print(conf(option='a', flag_bool=True))
print(conf(section='ExcelNum', option='Actual_Column_Num', flag_eval=True))

1分钟应用到项目中

啥? 你还不知道怎么一分钟应用到项目中?

好吧,看来是逃不过去了。 我要说了..... 首先复制代码,当然你已经知道上述代码的含义, 在你的项目中新建py文件,拷贝代码到你的文件中,ok接下来你可能已经知道怎么用了。这能有1分钟吗?

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python中Iterator迭代器的使用杂谈
Jun 20 Python
python通过pip更新所有已安装的包实现方法
May 19 Python
[原创]python爬虫(入门教程、视频教程)
Jan 08 Python
教你用Python写安卓游戏外挂
Jan 11 Python
python使用pycharm环境调用opencv库
Feb 11 Python
关于python写入文件自动换行的问题
Jun 23 Python
python读取excel指定列数据并写入到新的excel方法
Jul 10 Python
Python过滤txt文件内重复内容的方法
Oct 21 Python
基于Python数据结构之递归与回溯搜索
Feb 26 Python
python 使用cx-freeze打包程序的实现
Mar 14 Python
Python类的继承super相关原理解析
Oct 22 Python
python自动化测试通过日志3分钟定位bug
Nov 20 Python
python 随机生成10位数密码的实现代码
Jun 27 #Python
python自动化测试之如何解析excel文件
Jun 27 #Python
python算法与数据结构之单链表的实现代码
Jun 27 #Python
python多线程并发实例及其优化
Jun 27 #Python
int在python中的含义以及用法
Jun 27 #Python
Pycharm运行加载文本出现错误的解决方法
Jun 27 #Python
基于python-opencv3的图像显示和保存操作
Jun 27 #Python
You might like
一个阿拉伯数字转中文数字的函数
2006/10/09 PHP
用Apache反向代理设置对外的WWW和文件服务器
2006/10/09 PHP
PHP批量生成缩略图的代码
2008/07/19 PHP
PHP多例模式介绍
2013/06/24 PHP
ThinkPHP实现递归无级分类――代码少
2015/07/29 PHP
PHP表单数据写入MySQL数据库的代码
2016/05/31 PHP
yii2实现分页,带搜索的分页功能示例
2017/01/07 PHP
laravel框架select2多选插件初始化默认选中项操作示例
2020/02/18 PHP
JQuery从头学起第三讲
2010/07/06 Javascript
Js 弹出框口并返回值的两种常用方法
2010/12/30 Javascript
JavaScript获取某年某月的最后一天附截图
2014/06/23 Javascript
jQuery插件animateSlide制作多点滑动幻灯片
2015/06/11 Javascript
JavaScript中自带的 reduce()方法使用示例详解
2016/08/10 Javascript
微信小程序 后台https域名绑定和免费的https证书申请详解
2016/11/10 Javascript
input输入密码变黑点密文的实现方法
2017/01/09 Javascript
JavaScript面向对象精要(上部)
2017/09/12 Javascript
React-intl 实现多语言的示例代码
2017/11/03 Javascript
浅谈针对Vue相同路由不同参数的刷新问题
2018/09/29 Javascript
详解关于JSON.parse()和JSON.stringify()的性能小测试
2019/03/14 Javascript
nodejs中实现修改用户路由功能
2019/05/24 NodeJs
解决vue-cli@3.xx安装不成功的问题及搭建ts-vue项目
2020/02/09 Javascript
vue+axios全局添加请求头和参数操作
2020/07/24 Javascript
跟老齐学Python之编写类之一创建实例
2014/10/11 Python
python编程线性回归代码示例
2017/12/07 Python
Python tkinter实现的图片移动碰撞动画效果【附源码下载】
2018/01/04 Python
简单了解python模块概念
2018/01/11 Python
在PyCharm的 Terminal(终端)切换Python版本的方法
2019/08/02 Python
python如何控制进程或者线程的个数
2020/10/16 Python
英国知名的护肤彩妆与时尚配饰大型综合零售电商:Unineed
2016/11/21 全球购物
如何利用cmp命令比较文件
2016/04/11 面试题
投资合作协议书
2014/04/17 职场文书
艾滋病宣传活动总结
2014/05/08 职场文书
主持人演讲稿
2014/05/13 职场文书
初任公务员培训心得体会
2016/01/08 职场文书
高质量“欢迎词”
2019/04/03 职场文书
为什么MySQL 删除表数据 磁盘空间还一直被占用
2021/10/16 MySQL