UI自动化压测(一)

前言

  最近在负责一个基于airtest的游戏UI自动化压测项目,需求大概是达到单服同时在线1500人并在游戏中做主线大约30分钟。

  由于项目由我一个人负责,身边也没有多少可以交流的同事,导致在过程中遇到了N多坑,便决定在此记录下这些坑点以免后面再踩同样的坑

框架的选择

  框架并没有多少选择,UI自动化目前比较好的就只有airtest,便决定在airtest的基础上进行二次开发

  由于airtest并不支持多台手机并发执行,因此首先要对其进行调整

并发的选择

  因为部署的是docker环境,所以并发的较优选择有三种——gevent协程、asyncio协程、threading多线程。在这里讲解下个人理解三种方法的缺点

  gevent的缺点

  1、gevent的并发主协程中创建的子协程,会在主协程停止时直接停止,而不是等待子协程完成后再停止

import time
import gevent

tests = [3, 7, 11]

def second(test):
"""创建一个新的子协程"""
    while True:
        gevent.sleep(test)
        print(second.__name__, test, time.time())

def first(test):
"""主协程"""
    gevent.sleep(test)
    gevent.spawn(second, test)
    print(first.__name__, test, time.time())

gevent.joinall([gevent.spawn(first, test) for test in tests])

# 执行结果
================================ first 3 1584368355.9011917 second 3 1584368358.9016078 first 7 1584368359.9008148 second 3 1584368361.901649 first 11 1584368363.9010885 [Finished in 11.9s]

  2、由于是单线程,airtest中存在着的大量的time.sleep()会导致线程长期处理阻塞状态,影响效率,不过可以通过将time.sleep()改为gevent.sleep()来解决

  asyncio的缺点

  1、由于是单线程,airtest中存在着的大量的time.sleep()会导致线程长期处理阻塞状态,影响效率,且asyncio专属的asyncio.sleep()需要在async def定义的方法中才能使用,改动起来需要大量的代码及架构调整

  threading的缺点

  1、效率不如前两者(具体的差距可以去百度或者谷歌下,这里便不细讲了)

  工具是压测工具,高并发下我们需要尽可能的提高自身的效率,所以threading并不适合;

  而asyncio虽然效率高,但代码改动量太大,导致其也不适合;

  gevent因为可以通过代码来规避掉其问题1,且问题2的代码改动也不是很多,所以最终选择用gevent来改动airtest框架

猜你喜欢

转载自www.cnblogs.com/badluckforyou/p/12507405.html