目前在做银行的消息平台的接口测试,原来的协议是TCP的发送的是xml报文,最新的采用了http协议发送的是json,这样就需要将近1千个消息模板转换成json,如果让测试人员纯人工操作不但需要耗费大量的时间,而且无法保证正确性,基于这样的背景下我决定开发一个小工具,批量转换。
import os
import json
import xmltodict
from xml.dom.minidom import parseString
2.编写xmlToJson单文件操作方法
# 单文件操作
def xmlToJson(xml_path, json_path, log):
# 读取文件
with open(xml_path, 'r', encoding='UTF-8')as json_file:
xml_data = json_file.read()
json_file.close()
log.info("%s 要转换的xml: \n" % xml_path + str(xml_data))
# xml转换成json
xmlparse = xmltodict.parse(xml_data, encoding='UTF-8')
jsonstr = json.dumps(xmlparse, indent=1, ensure_ascii=False)
log.info('转换成json后:\n' + str(jsonstr))
# 重新写入文件
with open(json_path, 'w', encoding='UTF-8')as xml_file:
xml_file.write(jsonstr)
xml_file.close()
log.info('写入 %s 文件成功' % json_path)
3.编写xmlToJson文件夹下批量操作方法
# 文件夹操作
def xml_to_json(xml_dir, json_dir, log):
# 创建文件夹
if not os.path.exists(xml_dir):
os.makedirs(xml_dir)
if not os.path.exists(json_dir):
os.makedirs(json_dir)
# 把文件夹下的文件生成数组
file_list = os.listdir(xml_dir)
log.info('%s 文件夹下要转换的文件列表:' % xml_dir + str(file_list))
# 遍历文件找到xml文件进行单文件操作
for file in file_list:
file_list = file.split(".")
if file_list[-1] == 'xml':
x_path = os.path.join(xml_dir, file)
j_path_file_name = file_list[0] + '.json'
j_path = os.path.join(json_dir, j_path_file_name)
xmlToJson(x_path, j_path, log)
# 单文件操作
def jsonToXml(json_path, xml_path, log):
# 读取文件
with open(json_path, 'r', encoding='UTF-8')as json_file:
load_dict = json.loads(json_file.read())
json_file.close()
log.info("%s 要转换的json: " % json_path + str(load_dict))
# 不指定根节点,把json转换成xml
xml = xmltodict.unparse(load_dict, encoding='utf-8')
# xml = dicttoxml(load_dict, root=False, attr_type=False)
dom = parseString(xml)
xml_context = dom.toprettyxml()
log.info("转换成xml: \n" + str(xml_context))
# 重新写入文件
with open(xml_path, 'w', encoding='UTF-8')as xml_file:
xml_file.write(str(xml_context))
xml_file.close()
log.info('写入 %s 文件成功' % xml_path)
# 文件夹操作
def json_to_xml(json_dir, xml_dir, log):
# 创建文件夹
if not os.path.exists(xml_dir):
log.info('不存在 %s 文件夹,自动创建' % xml_dir)
os.makedirs(xml_dir)
if not os.path.exists(json_dir):
log.info('不存在 %s 文件夹,自动创建' % json_dir)
os.makedirs(json_dir)
# 把文件夹下的json文件生成数组
file_list = os.listdir(json_dir)
log.info('%s 文件夹下要转换的文件列表:' % json_dir + str(file_list))
for file in file_list:
file_list = file.split(".")
if file_list[-1] == 'json':
j_path = os.path.join(json_dir, file)
x_path_file_name = 'template_' + file_list[0] + '.xml'
x_path = os.path.join(xml_dir, x_path_file_name)
jsonToXml(j_path, x_path, log)
import logging
from logging import handlers
"""
获取日志处理对象
:param filename: 日志文件名称
:param level: 日志等级:debug, info, warn/warning, error, critical
:param when: 日志文件分割的时间单位,单位有以下几种:
- S 秒
- M 分
- H 小时
- D 天
- W 每星期
- midnight 每天凌晨
:param backupCount: 备份文件的个数,如果超过这个数量,就会自动删除
:param fmt: 日志信息格式
"""
# 日志级别字典
__level_dict = {
'critical': logging.CRITICAL,
'fatal': logging.CRITICAL,
'error': logging.ERROR,
'warning': logging.WARNING,
'warn': logging.WARNING,
'info': logging.INFO,
'debug': logging.DEBUG
}
def get_log( filename, level,when='MIDNIGHT', backupCount=3, maxBytes=10000000, fmt='%(asctime)s - %(pathname)s[line:%(lineno)d] - %(levelname)s: %(message)s'):
level = __level_dict.get(level.lower(), None)
logger = logging.getLogger(filename) # 设置日志名称
format_str = logging.Formatter(fmt) # 设置日志格式
logger.setLevel(level) # 设置日志级别
console_handler = logging.StreamHandler() # 控制台输出
console_handler.setFormatter(format_str) # 控制台输出的格式
logger.addHandler(console_handler) # 控制台输出
file_handler = handlers.RotatingFileHandler(filename=filename, maxBytes=maxBytes, backupCount=backupCount, encoding='utf-8') # 文件输出
file_handler.setFormatter(format_str) # 文件输出格式
logger.addHandler(file_handler) # 日志输出
return logger
if __name__ == '__main__':
filename = 'change.log'
level = 'info'
log = get_log(filename, level)
# 单个文件 xml 转json
x_path = r"C:\Users\Desktop\template_020103.xml"
j_path = r"C:\Users\Desktop\111.json"
xmlToJson(x_path,j_path,log)
# 文件夹批量 xml转json
x_dir = r"C:\Users\Desktop\xml"
j_dir = r"C:\Users\Desktop\json"
xml_to_json(x_dir, j_dir, log)
到此已经实现了xml json互转的基本功能,但是这样不方便测试人员使用,因为不是每个测试人员都有运行环境的,所以可以通过加打包的方式生成exe可执行程序,这样即可直接在windows环境下双击运行。
详细操作详见:
如何把Python 多文件项目打包成可执行的exe程序
打包好的可执行exe,可以直接下载
链接:https://pan.baidu.com/s/1SMGrdL5gIzORsBYvhFtnwg
提取码:cptt