前言
最近在负责一个基于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框架