51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 407|回复: 0
打印 上一主题 下一主题

并发导致功能接口查询结果与原始数据差别大的原因

[复制链接]
  • TA的每日心情
    擦汗
    4 小时前
  • 签到天数: 1047 天

    连续签到: 5 天

    [LV.10]测试总司令

    跳转到指定楼层
    1#
    发表于 2023-3-7 11:02:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    案情描述
      收到这么一个需求:存在一个数据库查询功能接口,需要完成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))
    ##############################################



    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏
    回复

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-11-15 13:48 , Processed in 0.063237 second(s), 23 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表