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多进程编程下线程之间变量的共享问题
May 05 Python
如何处理Python3.4 使用pymssql 乱码问题
Jan 08 Python
Python实现JSON反序列化类对象的示例
Jan 31 Python
解决python报错MemoryError的问题
Jun 26 Python
详解python中的装饰器
Jul 10 Python
Django使用redis缓存服务器的实现代码示例
Apr 28 Python
python的mysql数据库建立表与插入数据操作示例
Sep 30 Python
Python序列对象与String类型内置方法详解
Oct 22 Python
Python控制台输出时刷新当前行内容而不是输出新行的实现
Feb 21 Python
Python 基于jwt实现认证机制流程解析
Jun 22 Python
python 基于卡方值分箱算法的实现示例
Jul 17 Python
简单谈谈Python面向对象的相关知识
Jun 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数据集构建JSON格式及新数组的方法
2012/11/07 PHP
PHP改进计算字符串相似度的函数similar_text()、levenshtein()
2014/10/27 PHP
PHP中require和include路径问题详解
2014/12/25 PHP
Opcache导致php-fpm崩溃nginx返回502
2015/03/02 PHP
TP5框架实现一次选择多张图片并预览的方法示例
2020/04/04 PHP
用jquery来定位
2007/02/20 Javascript
JQuery 获取json数据$.getJSON方法的实例代码
2013/08/02 Javascript
JavaScript等比例缩放图片控制超出范围的图片
2013/08/06 Javascript
Vue.js事件处理器与表单控件绑定详解
2017/03/20 Javascript
Vue-router结合transition实现app前进后退动画切换效果的实例
2017/10/11 Javascript
详解webpack中的hash、chunkhash、contenthash区别
2018/01/05 Javascript
Vue快速实现通用表单验证功能
2019/12/05 Javascript
京东优选小程序的实现代码示例
2020/02/25 Javascript
JS如何调用WebAssembly编译出来的.wasm文件
2020/11/05 Javascript
[27:53]2014 DOTA2华西杯精英邀请赛 5 24 NewBee VS iG
2014/05/26 DOTA
Python中函数的多种格式和使用实例及小技巧
2015/04/13 Python
Python简单实现enum功能的方法
2016/04/25 Python
python 多维切片之冒号和三个点的用法介绍
2018/04/19 Python
Python+selenium 获取浏览器窗口坐标、句柄的方法
2018/10/14 Python
对Python subprocess.Popen子进程管道阻塞详解
2018/10/29 Python
如何在Django中设置定时任务的方法示例
2019/01/18 Python
详解python做UI界面的方法
2019/02/27 Python
在django中实现页面倒数几秒后自动跳转的例子
2019/08/16 Python
python对常见数据类型的遍历解析
2019/08/27 Python
可以随进度显示不同颜色的css3进度条分享
2014/04/11 HTML / CSS
详解通过focusout事件解决IOS键盘收起时界面不归位的问题
2019/07/18 HTML / CSS
英国50岁以上人群的交友网站:Ourtime
2018/03/28 全球购物
面试后的英文感谢信
2014/02/01 职场文书
庆元旦文艺演出主持词
2014/03/27 职场文书
《穷人》教学反思
2014/04/08 职场文书
产假请假条
2014/04/10 职场文书
2015年七一建党节活动方案
2015/05/05 职场文书
如何写通讯稿
2015/07/22 职场文书
浅谈MySQL next-key lock 加锁范围
2021/06/07 MySQL
未发现nvidia显卡怎么办?Win11系统中未检测到nvidia显卡解决教程
2022/04/08 数码科技
html中两种获取标签内的值的方法
2022/06/16 jQuery