灵活解决测试中遇到的问题——记一次不寻常的测试经历

发表于:2019-10-11 11:42

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:大帆船    来源:搜狗测试

  最近进行了输入法语音识别相关的一些测试,其中有一个测试内容十分有意思,让小编忍不住想来分(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),我们将立即处理
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号