一文探索自動化測試的高效執行
文:澤木
背景
普通的自動測試執行一般是單進程來執行測試用例集,例如接口測試用例集多到幾百個時候,執行時間會到 10 分鐘以上。在正常回歸測試中,這個時間是可以接受的,但在自動發佈流程中進行的自動化測試,需要很快地給出測試結果,這種情況下就不能滿足,那有什麼方法能加快執行效率呢?
思路的演進
當前我們使用的自動化框架是 Python + nosetests,而官方提供的是單進程的運行機制。
使用官方單進程的機制執行的自動化測試,594 個用例執行時間是 11 分鐘
這個時間對於一般的迴歸測試來說是可以接受的,但在快速發佈流程中,長時間的運行會使整個流程變得很慢,效率比較低,那怎麼樣來提升執行效率呢?目前我們看到是單任務模式,那多任務模式是否能夠減少時間呢,下面我們嘗試使用併發任務的方式來執行。
如下的結構圖,一個用例集我們可以分配到多個 Runner 去執行。
再回到剛纔 594 個用例,我們採用 8 個 Runner 去執行,看看執行時間可以縮短到 2 分 25 秒 。
NOTE:單進程的 Python 只能佔用一核的 CPU,併發數可以根據機器的核數 *2 設定。理論上來講多少個併發數可以提升多少倍的速度,但實際情況並不是這樣的,這個會基於每個用例集文件的執行時間,如果想要達到最好的效率提升,測試集需要儘量小,並且執行時長比較接近,以避免其中有個別執行時間非常長的測試集所導致的進程等待。
功能介紹
Master 是整個自動化用例集運行的中樞,主要有以下職責:
-
分配測試任務並啓動 Runner
-
收集 Runner 的結果
-
合併測試結果,並生成總報告
-
上傳結果文件及相關截圖到日誌服務器
-
發出結果郵件
-
發出微信報警
-
提交 Bug 到 Jira 中
-
失敗用例的重跑
Runner 作爲自動化的執行者,主要職責如下:
-
以單個用例文件爲一個執行單位
-
同步每個用例的結果到 Master
-
執行結束後同步所有用例的請求 Log 到 Master
使用情況
目前該工具用於滬江每天自動化監控任務 25850 次和 649 次的迴歸和巡檢的運行,並且已經開始逐步被接入到發佈流程中,後期將在 Devops 的自動化測試中作爲運行中樞,發揮重要作用。
Master 與 Runner 之間的通信原理
這裏採用了 pyzmq 中的問答模式
Master 啓動 Server 來接收各 Runner 發來的消息
Runner 端調用 Client 來發送消息
發送消息採用了 5 次嘗試機制及 5 秒超時,防止消息丟失,從而避免了造成 Server 端收不到消息而 block 住的風險。
Master 與 Runner 的執行命令及參數傳遞
用例執行的命令基於 nosetests,對更多的參數及功能支持,我們採用了引入 nose plugin 的方式並起了一個好聽的名字:hjRunner
hjRunner 支持的參數:
- hj-nose-parameters: 運行、上傳及發送相關的命令參數 (如下圖所示) (參數的格式以字典的格式傳遞,這樣易於擴展)
{
'uploadResult': True,
'runEnv': 1,
'reportCategory': 0,
'checkCasesDescription': False,
'mailSend': {
'sendMail': False,
'showUrlInMail': True
},
'wxAlarm': False,
'submitBug': True
}
- run-parameters:在運行前需要初始化的環境變量 (參數的格式需要是字典格式)
Master 支持的參數
-
hj-nose-parameters:運行、上傳及發送相關的命令參數傳遞給各 Runner
-
run-parameters:在運行前需要初始化的環境變量並傳遞給各 Runner
-
tests:指定執行的用例運行目錄或文件,多個以”,” 隔開
-
local-runners: 併發數量 相對於 nose 插件多了指定的測試集和併發數量
Runner 如何收集用例結果並同步給 Master
在 nose 的插件中有用例成功、失敗或錯誤的方法,通過重寫這些方法收集結果並同步給 Master。收集的信息有:
-
用例名
-
用例的文件相對路徑名
-
結果
-
詳細步驟的 Log
-
Exception 的消息
收集到的信息通過 Client 的 sendData 方法同步到 Master 上
所有用例運行完之後,會進入 report 方法,這裏會把所有請求的 Log 及結束的信息發送給 Master
Master 併發執行
1. 生成 nosetests 命令
首先在執行的 nosetests 命令中加入 hj-nose-parameters 和 run-parameters 的參數,然後設置好併發數,Master 會根據當前併發數的設置啓動多個進程的任務,並以用例文件爲單位,給每個任務分配一個用例文件
2. 用例集在多任務中的分配機制:
當收到任務執行完成以後,當前的 Runner 會收集結果數據,接着起動新的任務並執行(任務列表中還未執行到的任務)
測試執行結果歸檔、郵件報告及微信報警輸出功能詳解
-
用例的結果日誌會歸檔到 DB 中,最終可以通過 QAClub 平臺頁面來查看歷史執行的結果 測試的 HTML 結果文件通過 ftp 上傳到 Log Server,在 QAClub 平臺以及執行結果郵件中可 以通過郵件發送測試執行結果
-
如果有執行失敗的測試用例,可以通過 **微信 - 滬江人 - 運維監控報警 **的方式通知到相關人員 (相關人員列表可以通過 QAClub 平臺頁面來設置)
-
如果有執行失敗的測試用例,可以自動在 Jira 中提交 Bug 並 assign 給 QAClub 中配置的人員
總結
hjRunner 是一款基於 nose 框架的二次開發的插件,目前除了支持多併發任務,提高提供執行效率,還有這可擴展的優點,在日後的工作中會擴展出更多使大家工作更輕鬆更便捷更高效的功能,歡迎大家提出寶貴的意見及想法。
來源:本文轉自滬江技術。
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/23QBAC1bzB4JLL2ldJr-Gw