在自动化测试过程中,经常需要修改应用或者Demo的配置文件,为了能尽可能减少人工的操作,将需要修改的配置参数,提取出来,组织成json格式的文件,使用Python脚本,在配置参数中逐个解析参数文件,进行参数的替换。
实现思路:
1.提取需要修改的参数组织成 {replaceKey:{Key:value,key2:value2}}json格式
2.通过Python,解析提取参数,逐个在配置文件中替换;
3.将替换后的配置文件内容重新写会配置文件;
具体代码如下:
#!/usr/bin/python
# -*- coding: utf-8 -*-
import json
import os,sys
#-------------------------------
#Name:JsonConfigRplace.py
#Function:修改json 类型配置文件中指定Key 的Value
#param1:源配置文件
#从指定的配置文件中获取需要更新的Key-Value值
#如果repJsonKey存在嵌套需使用Jsonpath表达
def GetReplaceKeyVal(repJsonFile,repJsonKey):
spictKey=repJsonKey.split(".")
repKeyVal={}
try:
repJsonStr = json.loads(open(repJsonFile, "r").read())
for keyname in spictKey:
repKeyVal = repJsonStr[keyname]
repJsonStr=repKeyVal
except Exception as e:
print("目标值文件为非法json格式%s",e.message)
return repKeyVal
#更新配置文件中需要修改的json配置文件的Key 和Val
def SetReplaceKeyVal(configJson,replaceKey,replaceVal):
#解析配置文件,设置新值
if isinstance(configJson,dict):
for configKey in configJson:
#如果是配置文件
if configKey == replaceKey:
configJson[configKey] = replaceVal
elif isinstance(configJson[configKey],dict):
SetReplaceKeyVal(configJson[configKey],replaceKey,replaceVal)
#如果是list,则进行list递归
elif isinstance(configJson[configKey],list):
for item in configJson[configKey]:
if isinstance(item,dict):
SetReplaceKeyVal(item, replaceKey, replaceVal)
elif isinstance(configJson,list):
for item2 in configJson:
if isinstance(configJson[item2], dict):
SetReplaceKeyVal(configJson[item2], replaceKey, replaceVal)
#返回修改后的Json值
return configJson
#写文件
def JsonFileStore(jsonFileName,josnStr):
with open(jsonFileName, 'w') as f:
f.write(json.dumps(josnStr,indent=4))
#解析参数文件
def GetReplaceKeyPathVal(conFigJson,jsonKeyValue):
#print(jsonKeyValue)
midJsonTmp={}
#print("Hello")
try:
for key in jsonKeyValue:
if isinstance(jsonKeyValue[key],dict):
GetReplaceKeyPathVal(conFigJson,jsonKeyValue[key])
elif isinstance(jsonKeyValue[key],list):
for item in jsonKeyValue[key]:
if isinstance(item,dict):
GetReplaceKeyPathVal(conFigJson,item)
else:
midJsonTmp=SetReplaceKeyVal(conFigJson,key,jsonKeyValue[key])
conFigJson=midJsonTmp
#print(key)
#print(jsonKeyValue[key])
return conFigJson
except Exception as e:
print("解析Json参数错误GetReplaceKeyPathVal%s", e.message)
#return repKeyVal
#main 方法
#------------------------------------------
#param1-需要修改的配置文件名称;
#param2-保存目标修改值的Json文件名称;
#param3-目标Json值的Key名称,可以使用jsonPath路径格式(eg:"envinfo.monitorData")
#------------------------------------------
if __name__ == "__main__":
#参数接收
avg_len = len(sys.argv)
if avg_len == 4:
config_path = sys.argv[1]
env_config_path = sys.argv[2]
modifyKey = sys.argv[3]
#检查保存新参数文件是否存在
if os.path.isfile(env_config_path):
#通过参数传递env_info,和配置Key,和需要更新的配置文件;
getKeyval = GetReplaceKeyVal(env_config_path, modifyKey)
#print(getKeyval)
#打开配置文件,并lodas
if os.path.isfile(config_path):
if getKeyval:
try:
configJson = json.loads(open(config_path, 'r').read())
#中间结果保存变量
configMidValue={}
#逐个修改参数
configMidValue=GetReplaceKeyPathVal(configJson,getKeyval)
#重写配置文件
JsonFileStore(config_path, configMidValue)
except Exception as e:
print("目标配置文件为非法JSON格式%s",e.message)
else:
print("没有找到需要修改的的参数")
else:
print("目标配置文件不存在,请检查路径或文件名称")
else:
print("保存新参数配置文件不存在,请检查路径或文件名称")
else:
print("没有指定配置文件,参数文件,Keyname")
print("例如:python ./JsonConfigRplace.py" "/usr/config/config.json",
"/TSB/API/config/env_info.json", "envinfo.monitorData")