最近进行了输入法语音识别相关的一些测试,其中有一个测试内容十分有意思,让小编忍不住想来分(tu)享(cao)一下。
这个内容大体上是这样的,输入法语音识别想通过分析个性化词库来提高识别准确率,因此需要将词库文件传递给后端服务,并由服务端返回命中热词的信息给客户端。
初步看,这个功能很简单,无非就是在客户端的请求内容中添加一个词库参数,测起来会比较容易。而仔细看了看手头的测试集和工具,却发现这里面有个很大的问题。因历史原因,输入法这边的测试用客户端(demo)工具与实际使用的客户端存在一些联系,代码部分不好单独分离,所以暂时由开发负责维护。而这个客户端有个很不好的地方,它是以配置文件的形式进行参数传递,而且配置文件的路径和名称都是写死在代码里的(此处必须要吐槽)。再看我们准备的测试集,有几百个不同的词库id和对应音频。出于模拟线上真实情况和分析数据的考虑,需要同时使用不同的词库id和音频文件进行测试。
这时,摆在面前的问题是:
1、测试工具存在先天不足,无法灵活传递参数,如需改变参数,则需要修改配置文件。如果是一两个不同的参数组合,我们尚可手动进行修改,而如今需要大量不同的参数组合,手动修改显然不现实;
2、测试时需要同时使用不同的参数组合进行测试(模拟多用户同时使用服务)。
首先考虑测试工具是否能进行更新,满足本次测试的需求。与开发进行了一番沟通,确定该测试工具短时间内无法进行修改更新。而测试需要进行下去,看来只能另想办法来解决问题了。
第一步需要理清思路。
简单来讲,面前有两个问题,一个是修改配置文件的问题,一个是同时使用不同的配置进行测试的问题。两个问题需要一个一个解决。
第一个问题比较好解决。该工具使用的配置文件是json格式的参数,而所需要的参数我们都有,因此只需要按照格式,根据不同的词库id和对应的音频列表批量生成即可,这里可以使用python脚本。生成后文件可以存起来备用,使用时直接copy覆盖到工具的配置文件上即可。这样,在测试时就免去了来回手动修改配置文件的烦恼。
生成的部分配置文件
#coding=utf8 import sys,codecs,os import json audio_list_path=sys.argv[1] key=sys.argv[2] configs={ "key1":key, "key2":"value2" } if os.system('cd %s && ls | sed "s:^:`pwd`/:" > `cd -`/list.txt'%(audio_list_path))!=0: print "get audio list error!" sys.exit(0) fd=open("list.txt","r") for l in fd.readlines(): configs['audio_file_names'].append(l.strip()) fw=codecs.open(audio_list_path[audio_list_path.rfind('/'):] if audio_list_path.rfind('/')>=0 else audio_list_path,"w","UTF-8") fw.write(json.dumps(configs)) fd.close() fw.close() |
生成配置文件的python脚本(不完整,仅做参考)
而第二个需要同时使用不同参数的问题相对较为复杂,曾经,在参数组合比较少且数量固定的情况下,可以通过将测试工具复制多份,分别设置配置文件参数,最后一起运行的方式来解决。而现在,需要使用更多的参数组合,且同时运行的数量不确定(取决于需要的并发数),因此不宜使用原来这种复制多份的方式。
这时,测试工具读取配置文件的方式引起了我的注意。之前与开发沟通,测试工具每次运行只读取一次配置文件存入内存之中,之后不会再次进行读取。也就是说,此时对配置文件进行修改,对之前已经运行的程序并无影响,如果再次运行程序,程序会按照新修改的配置文件来运行。
结合刚才解决的配置文件生成的问题,实际上这个问题也就能够解决了。整体的思路是,将上一个问题中的配置文件一个个copy到测试工具的配置文件上,然后运行程序。就这样copy,run,copy,run...直至需要的数量(并发数)。这个步骤同样可以使用python脚本来自动化实现,为了方便,可以提前准备一个配置文件列表,保存够需要的数量(并发数)即可。
如图:使用30个配置文件实现30并发数,每路词库和音频不同
#coding=utf8 import sys,os import time fn=sys.argv[1] fd=open(fn,"r") for l in fd.readlines(): if os.system('cp -f %s config/online_asr_tester.json'%(l.strip()))!=0: print "copy config file error!" sys.exit(0) if os.system('nohup ./demo_online_asr_tester > %s.log 2>&1 &'%(l.strip()))!=0: print "run error!" sys.exit(0) time.sleep(5) fd.close() |
实现自动化执行的python脚本
如此一来,便完全解决了本次测试中所遇到的问题。
最后,来总结一下~本次测试中遇到了一些困难,主要是来自测试工具方面的问题。特点是,不能从问题的源头来解决问题。这时,便需要我们灵活思考,积极改变思路,从其他方面入手,换个角度来应对所面临的困难。
本文内容不用于商业目的,如涉及知识产权问题,请权利人联系博为峰小编(021-64471599-8017),我们将立即处理