1. 程式人生 > 其它 >測試平臺系列(46) 用例併發之我全都要

測試平臺系列(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}'
  • 改造同步方法為非同步,以獲取測試用例方法為例
  1. 需要改為async方法
  2. with語句要改為async with
  3. select(表).where(條件),需要用async_session.execute呼叫
  4. 拿資料用result.scalars.first()或者all()都可以,和以前幾乎一樣

改造之後

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

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

具體的細節可以參看我的專案: https://github.com/wuranxu/pity。點選閱讀原文可以看到整個文章哦!