zoukankan      html  css  js  c++  java
  • 【接口平台】异步返回

    有小伙伴在执行测试报告的时候反馈,在某些接口中,返回报告数据用例竟然重复执行了两次,一开始定位问题怀疑是用例执行异常触发重复执行导致,但是并非如此,因为即使重复执行也是用例中某个接口请求被重复执行,而不是整个用例重复执行了两次

    后面在优化获取测试报告性能的时候发现,原来前端有一个机制,在请求任意接口时,如果超过2min没有返回则重复再次请求一次该接口,这样会导致什么问题呢?
    该测试计划在执行超过2min时,前端又再次请求一次,这样的话该版本测试计划就再次执行了一次,导致了测试报告莫名其妙的出现相同的执行用例的问题

    测试报告执行返回响应,具体执行的逻辑采用异步的方式执行即可

    Flask提供了比较优雅的异步执行的方式,具体的案例如下

    from flask import Flask
    import time
    from concurrent.futures import ThreadPoolExecutor
     
    executor = ThreadPoolExecutor(1)
     
    app = Flask(__name__)
     
     
    @app.route('/synchronize')
    def update_redis():
        executor.submit(do_update)
        return 'ok'
     
     
    def do_update():
        time.sleep(10)
        print('start update')
     
     
    if __name__ == '__main__':
        app.run()
    

    在本地调试运行,可满足需求,so easy搞定,部署上线

    上线后发现一个严重的问题,执行测试计划一直没有写入测试报告信息,哪里出现了问题?
    通过打日志一步步坚信的调试发现,原来在执行一定时间后,测试计划的异步执行被强制毫无异常的终止了,why?
    本地调试的是mac环境,服务部署的是linux环境,讲道理是没有任何区别的,那为啥出现不一致的情况呢?
    多线程?或许是因为启动参数的原因?

    线上环境启动

    app.run(host='0.0.0.0', port=5001, debug=False, processes=10)
    

    本地mac环境启动

    app.run(host='0.0.0.0', port=5001, debug=False, threaded=True)
    

    将本地mac环境修改成线上一样的启动方式后,本地mac环境一样出现了上面的问题?
    那是什么原因导致了异步执行直接被终止呢?因为 threaded=True 的原因?但是linux环境无法配置该选项

    在各种尝试毫无办法的时候,看看具体的调用

    executor.submit(PlanController(req.get('planId')).load_and_scheduling,builder=req.get('builder'))
    

    更换一下传参的方式

    executor.submit(PlanController(req.get('planId')).load_and_scheduling(builder=req.get('builder')))
    

    再次运行,发现竟然可以了!!!两种方式均可以,但是为什么第一种异步执行1s后被强制悄悄的终止了,原因现在仍未知

  • 相关阅读:
    第八篇 EBS实现企业日常业务运管模型的解决方案设计思路
    第7篇 ORACLE EBS DEMO虚拟机环境的安装
    第六篇 ORACLE EBS用户界面通用元素或功能背后的道理解析
    第五篇 Getting Started with ORACLE EBS(开始学习ORACLE EBS)
    嵌入式根文件系统的移植和制作详解
    性能测试工具
    UEFI GPT
    系统启动过程和系统安装过程
    Gentoo安装
    Gentoo源码安装图解
  • 原文地址:https://www.cnblogs.com/guanhuohuo/p/12533572.html
Copyright © 2011-2022 走看看