TA的每日心情 | 擦汗 4 小时前 |
---|
签到天数: 1047 天 连续签到: 5 天 [LV.10]测试总司令
|
案情描述
收到这么一个需求:存在一个数据库查询功能接口,需要完成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))
##############################################
|
|