歡迎測試同行加入QQ交流群,群號:70160503
背景
最近在工作中,遇到需要執行大量測試用例的情況。大概2500個測試用例,每個用例有數條HTTP請求以及一些特殊處理,線性執行下來的結果是我花了2個半小時才執行完成!
為了解決這個問題,提高工作效率,實現測試用例並發執行是我所需要的。
幾個想法
-
多線程執行測試用例
-
協程
可能遇到的問題:
多線程
值得說明的是,多線程執行測試用例是有前輩實現過的。具體實現過程沒有看過,依稀記得他的實現過程會生成多份測試報告,然后用BeautifulSoup去解析、合並測試報告。
協程
- 使用協程,可能需要修改PyUnit源碼
- 使用協程,可能需要修改當前測試用例為協程方法,改動可能很大
實現過程
由於正在學習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