Python - 用協程並發執行測試用例


歡迎測試同行加入QQ交流群,群號:70160503

背景

最近在工作中,遇到需要執行大量測試用例的情況。大概2500個測試用例,每個用例有數條HTTP請求以及一些特殊處理,線性執行下來的結果是我花了2個半小時才執行完成!

為了解決這個問題,提高工作效率,實現測試用例並發執行是我所需要的。

幾個想法

  1. 多線程執行測試用例

  2. 協程

可能遇到的問題:

多線程

值得說明的是,多線程執行測試用例是有前輩實現過的。具體實現過程沒有看過,依稀記得他的實現過程會生成多份測試報告,然后用BeautifulSoup去解析、合並測試報告。

協程

  1. 使用協程,可能需要修改PyUnit源碼
  2. 使用協程,可能需要修改當前測試用例為協程方法,改動可能很大

實現過程

由於正在學習Python協程,我還是決定先用協程試試能否實現。當然,最終結果證明改動不大,僅修改了源碼的一小小部分,測試用例部分則只修改了單元測試模塊名

首先是獲取python3的源碼。

git clone -b 3.5 https://github.com/python/cpython.git

unittest源碼在Lib/unittest中。

給已有的測試用例打斷點,調試幾波,理清unittest模塊對測試用例的調用執行順序。

猜測主要過程為:

原實現流程

找到TestCase真正執行入口:

unittest/case.py 中的 TestCase 類中的 run 方法的 testMethod()。(Line 605)

測試用例執行入口

上層調用在TestSuite類中,修改上層入口,把對TestCase的順序執行改為調用協程並發執行:

提取循環部分代碼,改寫為協程

最終結果

修改后,執行流程如下:

現在實現流程

經過上述修改,原來2600多個測試用例需要的執行時間,從兩個半小時壓縮到8分半鍾(如圖),提高效率不贅述。

測試報告

存在的問題

測試報告的Log獲取不准確,應該是IO處理速度不足導致,后續需要想辦法解決。(又有事做了:P)

已解決上述問題,原因在於使用HTMLTestRunner時,輸出流代碼未生效,導致原先重定向至stderr的結果被寫入測試報告。在添加一秒鍾睡眠時間后解決。(代碼一行,debug一天,哭)

修復報告問題

Github

https://github.com/ityoung/python3-fastunit

參考

https://stackoverflow.com/questions/30172821/python-asyncio-task-got-bad-yield


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM