46.用例并发之我全都要

大家好,我是米洛,求三连!求关注测试开发坑货!

如果阅读完毕后想和作者有更多交流,可以点击阅读原文找到底部评论区,给作者留言啦!

回顾

前一章我们把http换成了aiohttp,完成了数据构造器功能。今天就轻松点吧~

用例运行

目前我们开放了api,/request/run这个接口去运行单个用例。但是我们的目标并不是做一个玩具,所以我们需要想一下怎么去支持多条用例一起执行。

至于测试集,测试计划,定时任务这种也会陆续展开,先把眼前的困难给解决。

所以我们需要在页面上可以多选用例来执行,并能看到一个具体的报告,有了这一步,后续整合测试集和测试计划就易如反掌了。

MQ/celery?

其实是可以用mq的方式去执行用例,用户选定了一批用例,直接往mq里面塞就完事了,剩下的交给消费者。

这样的好处就是耦合度大大降低,我们的后端服务和消费者是完全分开的,就算要这么玩,消费者也不会用Python来做。这样我们在后端服务上线的时候不会影响到执行结果

不过这么做其实增加了我们系统的复杂度,这是我不想要的。

我们还是先观察下Python批量执行case的效率吧!

普通方式

先编写一个同步版本的批量运行方法。

由于我的run方法已经被改造为异步方法了,所以这边写法是这么写,但其实还是同步的执行过程。

代码很简单,我们通过循环执行每个case,然后把结果写到data字典里面,最后输出具体的耗时(只是测试用)。

可以看到,在本地数据库+我的高配置机器加持下还是需要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
新增异步session和异步engine
  • 改造同步方法为异步,以获取测试用例方法为例
其实和同步的区别也就4个地方
其实和同步的区别也就4个地方
  1. 需要改为async方法
  2. with语句要改为async with
  3. select(表).where(条件),需要用async_session.execute调用
  4. 拿数据用result.scalars.first()或者all()都可以,和以前几乎一样
改造完了之后记得在调用它的地方也改写一下
改造完了之后记得在调用它的地方也改写一下

改造之后

异步和同步的关键就是gather
异步和同步的关键就是gather

虽然没快太多,但是也是有明显进步的,我已经把case运行的方法里面的db操作全部改为了异步。

快了20秒左右
快了20秒左右

不得不感叹,fastapi还是快的呀!

具体的细节可以参看我的项目: https://github.com/wuranxu/pity。点击阅读原文可以看到整个文章哦!