測試平臺系列(46) 用例並發之我全都要

米洛丶 2021-08-15 21:29:53 阅读数:132

本文一共[544]字,预计阅读时长:1分钟~
系列 全都 都要

這是我參與8月更文挑戰的第6天,活動詳情查看:8月更文挑戰

大家好,我是米洛,求三連!求關注測試開發坑貨!

回顧

前一章我們把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

  • 改造同步方法為异步,以獲取測試用例方法為例

其實和同步的區別也就4個地方

  1. 需要改為async方法
  2. with語句要改為async with
  3. select(錶).where(條件),需要用async_session.execute調用
  4. 拿數據用result.scalars.first()或者all()都可以,和以前幾乎一樣

改造完了之後記得在調用它的地方也改寫一下

改造之後

异步和同步的關鍵就是gather

雖然沒快太多,但是也是有明顯進步的,我已經把case運行的方法裏面的db操作全部改為了异步。

快了20秒左右

不得不感歎,fastapi還是快的呀!

具體的細節可以參考:

項目地址

版权声明:本文为[米洛丶]所创,转载请带上原文链接,感谢。 https://gsmany.com/2021/08/20210815212946423k.html