功能接口查询结果与原始数据差别大?可能是并发的锅

发表于:2023-3-07 09:16

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

 作者:刘晓佳Rachel    来源:51Testing软件测试网原创

  案情描述
  收到这么一个需求:存在一个数据库查询功能接口,需要完成1000个条件语句的查询,并将查询结果与原始数据库(如es)的查询结果对比,从而判定该功能接口是否正常,且正确可用。
  第一次测试设计:读取文件中的1000个查询条件,顺序执行。但由于查询数据量较大,单线程顺序完成1000次查询耗时较长,效率太低——抛弃;
  第二次测试设计:使用并发查询,多线程并发提高工作效率,节省了大大的时间。但将输出的1000个查询结果与原始数据库查询结果对比时,发现某些语句差异较大,为什么?
  抽丝剥茧
  为何功能接口查询结果与原始数据查询结果差异性大?
  经过排查,问题出在查询语句对比时匹配错位——使用简单并发查询,输出并不严格按照读入顺序。换句话说:读入1、2、3、4、5个顺序查询条件,并发查询输出顺序可能时2、1、3、4、5,也可能时4、5、2、1、3。
  那么,如何在编写测试脚本时,让并发输出严格按照读入顺序输出呢?
  亡羊补牢
  从Python3.2开始,标准库为我们提供了concurrent.futures模块,它提供了ThreadPoolExecutor和ProcessPoolExecutor两个类,可以帮助我们更好地完成并发设计。
  本文我们不过深地讲述如何使用这些Python类,只简单讲述如何解答我们的核心问题——“如何在并发时让结果严格按照输入顺序输出”。
  线程池ThreadPoolExecutor
  如下所示,为ThreadPoolExecutor的基本使用方法,打印输入的list列表中的数字。
  ThreadPoolExecutor()初始化,创建线程池,最多2个线程并发运行,通过submit调用子函数(打印输入数字),最终通过as_completed等待所有任务完成后,通过result收集返回结果。
# -*-coding:utf-8 -*-
from concurrent.futures import ThreadPoolExecutor,as_completed

# 子函数,打印输入数字
def print_num(num):
    return num

list = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20]

##############使用ThreadPoolExecutor###################
###############并发执行,非顺序返回################
# 创建线程池子
# 设置最多2个线程运行,其他等待
executor = ThreadPoolExecutor(max_workers=2)
all_task = [executor.submit(print_num, (num)) for num in list]
result2_list = []
for future in as_completed(all_task):
    data = future.result()
    result2_list.append(data)
print("并发执行,非顺序返回:"+ str(result2_list))
##############################################
本文源自第七十期《51测试天地》
谨防并发测试的坑》一文
查看更多精彩内容,请点击下载:
  版权声明:本文出自《51测试天地》第七十期。51Testing软件测试网及相关内容提供者拥有51testing.com内容的全部版权,未经明确的书面许可,任何人或单位不得对本网站内容复制、转载或进行镜像,否则将追究法律责任。
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

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

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

沪ICP备05003035号

沪公网安备 31010102002173号