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实现批量图片格式转换
Jun 16 Python
Centos 升级到python3后pip 无法使用的解决方法
Jun 12 Python
python学生信息管理系统(完整版)
Apr 05 Python
Python使用Selenium爬取淘宝异步加载的数据方法
Dec 17 Python
python实现简单聊天室功能 可以私聊
Jul 12 Python
python opencv鼠标事件实现画框圈定目标获取坐标信息
Apr 18 Python
Python 生成一个从0到n个数字的列表4种方法小结
Nov 28 Python
解决torch.autograd.backward中的参数问题
Jan 07 Python
MNIST数据集转化为二维图片的实现示例
Jan 10 Python
下载与当前Chrome对应的chromedriver.exe(用于python+selenium)
Jan 14 Python
Python利用Faiss库实现ANN近邻搜索的方法详解
Aug 03 Python
Pandas替换及部分替换(replace)实现流程详解
Oct 12 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
老机欣赏|中国60年代精品收音机
2021/03/02 无线电
第四章 php数学运算
2011/12/30 PHP
destoon后台网站设置变成空白的解决方法
2014/06/21 PHP
php中__destruct与register_shutdown_function执行的先后顺序问题
2014/10/17 PHP
thinkphp5框架前后端分离项目实现分页功能的方法分析
2019/10/08 PHP
Yii 框架使用Forms操作详解
2020/05/18 PHP
基于JQuery实现异步刷新的代码(转载)
2011/03/29 Javascript
jQuery创建平滑的页面滚动(顶部或底部)
2013/02/26 Javascript
JavaScript数据类型判定的总结笔记
2015/07/31 Javascript
浅谈JavaScript中的string拥有方法的原因
2015/08/28 Javascript
认识Knockout及如何使用Knockout绑定上下文
2015/12/25 Javascript
js获取form表单所有数据的简单方法
2016/08/18 Javascript
jQuery实现简单的抽奖游戏
2017/05/05 jQuery
vue 2.0路由之路由嵌套示例详解
2017/05/08 Javascript
详解Node.js 中使用 ECDSA 签名遇到的坑
2018/11/26 Javascript
jQuery HTML设置内容和属性操作实例分析
2020/05/20 jQuery
Python文件去除注释的方法
2015/05/25 Python
Windows下Python的Django框架环境部署及应用编写入门
2016/03/10 Python
Python实现批量压缩图片
2018/01/25 Python
PyQt4实现下拉菜单可供选择并打印出来
2018/04/20 Python
python2 与 python3 实现共存的方法
2018/07/12 Python
windows系统中Python多版本与jupyter notebook使用虚拟环境的过程
2019/05/15 Python
pycharm无法安装第三方库的问题及解决方法以scrapy为例(图解)
2020/05/09 Python
Python将QQ聊天记录生成词云的示例代码
2021/02/10 Python
css3制作动态进度条以及附加jQuery百分比数字显示
2012/12/13 HTML / CSS
高校自主招生自荐信
2013/12/09 职场文书
大型活动策划方案
2014/01/12 职场文书
活动总结格式
2014/08/30 职场文书
个人授权委托书范本
2014/09/14 职场文书
小学教师师德师风个人整改措施
2014/09/18 职场文书
2014医学院领导班子对照检查材料思想汇报
2014/09/19 职场文书
中秋节晚会开场白
2015/05/29 职场文书
导游词之南京夫子庙
2019/12/09 职场文书
Python的三个重要函数详解
2022/01/18 Python
Mysql 8.x 创建用户以及授予权限的操作记录
2022/04/18 MySQL
React如何使用axios请求数据并把数据渲染到组件
2022/08/05 Javascript