回顾
前一章我们把http换成了aiohttp,完成了数据构造器
功能。今天就轻松点吧~
用例运行
目前我们开放了api,/request/run
这个接口去运行单个用例
。但是我们的目标并不是做一个玩具
,所以我们需要想一下怎么去支持多条用例一起执行。
至于测试集,测试计划,定时任务这种也会陆续展开,先把眼前的困难
给解决。
所以我们需要在页面上可以多选
用例来执行,并能看到一个具体的报告,有了这一步,后续整合测试集和测试计划就易如反掌了。
MQ/celery?
其实是可以用mq的方式去执行用例,用户选定了一批用例,直接往mq里面塞就完事
了,剩下的交给消费者。
这样的好处就是耦合度大大降低,我们的后端服务和消费者是完全分开的,就算要这么玩,消费者也不会用Python
来做。这样我们在后端服务上线的时候不会影响到执行结果
。
不过这么做其实增加了我们系统的复杂度,这是我不想要的。
我们还是先观察下Python批量执行case的效率吧!
普通方式
先编写一个同步版本
的批量运行方法。
image
由于我的run
方法已经被改造为异步方法了,所以这边写法是这么写,但其实还是同步
的执行过程。
代码很简单,我们通过循环
执行每个case,然后把结果写到data字典里面,最后输出具体的耗时
(只是测试用)。
image
可以看到,在本地数据库+我的高配置机器加持下还是需要30多秒执行100来个用例。其实已经能够接受
了,但是后续数量更大的话,怎么办!咱们直接一步到位,开始改造。
不只是http有异步库
其实mysql也有个异步库: aiomysql,所以我们需要先安装依赖:
pip3 install aiomysql
这个库可以嵌入到sqlalchemy,因为sqlalchemy1.4以上已经支持了asyncio(我个人认为这是一个大的趋势,能快为啥要慢
呢?如果Python有很快的速度+极高的开发效率,不说大型业务服务,起码测试平台的市场是可以拿捏的四死的!)
可能因为我最近Java写的比较多,处理嵌套很深的JSON,需要定义各种class,要不就是各种转换类型,难受啊。
- config.py新增异步SQLALCHEMY_URI
ASYNC_SQLALCHEMY_URI = f'mysql+aiomysql://{MYSQL_USER}:{MYSQL_PWD}@{MYSQL_HOST}:{MYSQL_PORT}/{DBNAME}'
新增异步session和异步engine
- 改造同步方法为异步,以获取测试用例方法为例
其实和同步的区别也就4个地方
- 需要改为async方法
- with语句要改为async with
- select(表).where(条件),需要用async_session.execute调用
- 拿数据用result.scalars.first()或者all()都可以,和以前几乎一样
改造完了之后记得在调用它的地方也改写一下
改造之后
异步和同步的关键就是gather
虽然没快太多,但是也是有明显进步的,我已经把case运行的方法
里面的db操作全部改为了异步。
快了20秒左右
不得不感叹,fastapi还是快的呀!