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  连接字符串(join %)
Sep 06 Python
python获取网页状态码示例
Mar 30 Python
在Python中进行自动化单元测试的教程
Apr 15 Python
使用Python的urllib2模块处理url和图片的技巧两则
Feb 18 Python
Python ldap实现登录实例代码
Sep 30 Python
python使用tkinter实现简单计算器
Jan 30 Python
python3+PyQt5实现自定义窗口部件Counters
Apr 20 Python
django反向解析和正向解析的方式
Jun 05 Python
使用Python实现企业微信的自动打卡功能
Apr 30 Python
python判断一个变量是否已经设置的方法
Aug 13 Python
python pip如何手动安装二进制包
Sep 30 Python
Python 利用argparse模块实现脚本命令行参数解析
Dec 28 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
php expects parameter 1 to be resource, array given 错误
2011/03/23 PHP
PHP按行读取、处理较大CSV文件的代码实例
2014/04/09 PHP
PHP通过内置函数memory_get_usage()获取内存使用情况
2014/11/20 PHP
学习php设计模式 php实现适配器模式
2015/12/07 PHP
学习ExtJS(二) Button常用方法
2009/10/07 Javascript
JS文本框追加多个下拉框的值的简单实例
2013/07/12 Javascript
实现动画效果核心方式的js代码
2013/09/27 Javascript
javascript实现依次输入input自动定焦
2014/12/23 Javascript
JavaScript使用cookie记录临时访客信息的方法
2015/04/07 Javascript
详解Vue的computed(计算属性)使用实例之TodoList
2017/08/07 Javascript
Node.js利用断言模块assert进行单元测试的方法
2017/09/28 Javascript
深入探讨JavaScript的最基本部分之执行上下文
2019/02/12 Javascript
vue使用keep-alive保持滚动条位置的实现方法
2019/04/09 Javascript
Node对CommonJS的模块规范
2019/11/06 Javascript
vue element-ui读取pdf文件的方法
2019/11/26 Javascript
JS相册图片抖动放大展示效果的示例代码
2021/01/29 Javascript
[01:22]DOTA2神秘商店携大量周边降临完美大师赛
2017/11/07 DOTA
python处理csv数据的方法
2015/03/11 Python
python提取字典key列表的方法
2015/07/11 Python
python九九乘法表的实例
2017/09/26 Python
Numpy 改变数组维度的几种方法小结
2018/08/02 Python
APIStar:一个专为Python3设计的API框架
2018/09/26 Python
Python中print和return的作用及区别解析
2019/05/05 Python
PyCharm 配置远程python解释器和在本地修改服务器代码
2019/07/23 Python
html5 Canvas画图教程(4)—未闭合的路径及渐变色的填充方法
2013/01/09 HTML / CSS
阿拉伯世界最大的电子卖场:Souq埃及
2016/08/01 全球购物
吉力贝官方网站:Jelly Belly
2019/03/11 全球购物
法学专业个人求职信
2013/09/26 职场文书
高中体育教学反思
2014/01/24 职场文书
篝火晚会主持词
2014/03/25 职场文书
运输服务质量承诺书
2014/03/27 职场文书
社区四风存在问题及整改措施
2014/10/26 职场文书
指导教师推荐意见
2015/06/05 职场文书
美德少年事迹材料(2016推荐版)
2016/02/25 职场文书
vue整合百度地图显示指定地点信息
2022/04/06 Vue.js
vue @click.native 绑定原生点击事件
2022/04/22 Vue.js