51Testing软件测试论坛

标题: 并发导致功能接口查询结果与原始数据差别大的原因 [打印本页]

作者: lsekfe    时间: 2023-3-7 11:02
标题: 并发导致功能接口查询结果与原始数据差别大的原因
案情描述
  收到这么一个需求:存在一个数据库查询功能接口,需要完成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))
##############################################








欢迎光临 51Testing软件测试论坛 (http://bbs.51testing.com/) Powered by Discuz! X3.2