测试效率优化案例----多国语言自动化校验工具(python)
今天分享的是质量保障过程中写的一个测试小工具—多国语言校验
背景:
1.我们的app支持多国语言,语言文件通过服务器动态拉取,而服务器的语言添加是运营人员手工添加的,完整性不能保证,而完整性的确实会导致你明明使用德语,结果却冒出中文的尴尬事件
2.由于是多国语言,需要依赖翻译公司把本土化的中文翻译成xx国,我们的语言文件使用了格式化字符:%s这样的格式化字符串,但是是给翻译公司,回来的结果经常会出现 % s这样的结果,导致的后果就是客户端使用这些字符串的时候直接crash
问题分析:
为了解决1和2校验问题,以前都是运营同学手动校验,准确性非常低,而且经常有客服找到我说有用户反馈语言不准确或者某个语言使用会突然crash,然后还被拖着手工一个个对,成百上千的翻译手工校验一想到头就大。
手工不成自然想到自动化校验,经过分析1、2问题我认为通过自动化校验是可行的,并且能显著提高项目的效率。
方案设计:
首先想到的是用html+js解决的,这样整个项目组都可以使用,并且很方便。也可以写成一个android项目,手机端直接校验。前面两个可以解决问题,但是只做到了自动校验,却没有做到自动化校验,于是决定用python脚本解决,持续集成可以通过jenkins直接调用py脚本,非常方便。
问题解决:
说干就干,首先我们分析一下要实现的流程:
其他模块都是很基本的处理,用到了requests、zipfile、xml.dom.minidom这些模块
我重点介绍一下解析和校验这个过程。
xml的格式和android的资源格式统一,属于标准的xml语言
<resources>
<string name="selector_title">Choose%1$d-%2$d photo(s)</string>
...
...
</resources>
因为考虑到校验是需要全部加载,所以选用dom解析,python提供给我们xml.dom.minidom这个模块,我们需要取得上述的name和value值,然后用一个字典作为存储结构:
def changeXMLToDict(_path):
dict = {}
domtree = xml.dom.minidom.parse(_path);
collection = domtree.documentElement
strings = collection.getElementsByTagName("string")
for s in strings:
dict[s.attributes.get('name').value] = s.firstChild.data
return dict
转换完所有的xml文件,接下来就是校验模块的实现,我们需要实现下面两个逻辑:
- 找出key值最多的xml文件,作为父文件,其他文件依次和这个文件对比
- 遍历所有文件的value,校验 %s 格式化字符窜的正确性
1的逻辑很简单,python提供max函数,可以计算到xml key的数量,然后拿出对比的key和父文件的key判断存在性就ok了。
def checkLack(max_path, cur_path):
l_result = []
d0 = changeXMLToDict(max_path)
d1 = changeXMLToDict(cur_path)
for k,v in d0.items():
if k not in d1:
l_result.append(k)
return l_result
2逻辑也不难,直接遍用正则判断每一个value就ok了
def checkValidate(cur_Path):
l_result = []
flag = True
d0 = changeXMLToDict(cur_Path)
for k,v in d0.items():
if not re.findall('\D+(%\s+)',v).__len__() == 0:
l_result.append(k)
flag = False
return flag,l_result;
然后最后一步,生成html,我使用的方式是直接代码替换的方式:
baseHTML = '''
<html>
<head>
<title>create by cz chen</title>
<meta charset='gb2312'>
</head>
<body>
<center>
<h1>one android在线翻译校验报告</h1><hr>
<ul>
<li>时间:%s</li>
<li>对比文件(取最大key数量):%s</li>
</ul>
<table border="1px soild" cellpadding='3px' cellspacing='1px'>
<th>文件路径</th><th>缺失字段</th><th>输出字符串</th>
%s
</table>
</center>
</body>
</html>
'''
当然也可以用什么jinia2这些框架。
生成的html报告
成果:
咳咳,html报告table的第二列是缺失的字段,分析了这些key值发现是某个版本上线的功能,因为来不及翻译匆匆上线导致的完整性缺失,结果出来后我和产品都愣了一下。
第三列是翻译公司%s的校验异常,基本上一个字段就代表一个模块,我验证了下这些,模块的特定语言下华丽得crash了,这点没敢说出来,估计会被打,赶紧偷偷改bug去… …
持续集成:
运行不必多说,执行的时候只需要用jenkins执行代码的入口函数就可以了
触发条件则是可以根据接口的版本号定义,当需要客户端更新,接口会下发version版本,jenkins就可以设置定时轮询检查的时间,当版本号>上次构建保存的version,那么执行测试。
下一篇: week2实验