若是你還想從頭學起Pytest,能夠看看這個系列的文章哦!html
https://www.cnblogs.com/poloyy/category/1690628.html安全
pytest-xdist分佈式測試的原理
前言
- xdist的分佈式相似於一主多從的結構,master機負責下發命令,控制slave機;slave機根據master機的命令執行特定測試任務
- 在xdist中,主是master,從是workers
大體原理
- xdist會產生一個或多個workers,workers都經過master來控制
- 每一個worker負責執行完整的測試用例集,而後按照master的要求運行測試,而master機不執行測試任務
pytest-xdist分佈式測試的流程
第一步:建立worker
- master會在總測試會話(test session)開始前產生一個或多個worker
- master和worker之間是經過execnet和網關來通訊的
- 實際編譯執行測試代碼的worker多是本地機器也多是遠程機器
第二步:收集測試項用例
- 每一個worker相似一個迷你型的pytest執行器
- worker會執行一個完整的test collection過程【收集全部測試用例的過程】
- 而後把測試用例的ids返回給master
- master是不會執行任何測試用例集的
注意
因此爲何上面經過分佈式測試的結果截圖是沒有輸出用例的print內容,由於主機並不執行測試用例,pycharm至關於一個mastersession
第三步:master檢車workers收集到的測試用例集
- master接收到全部worker收集的測試用例集以後,master會進行一些完整性檢查,以確保全部worker都收集到同樣的測試用例集(包括順序)
- 若是檢查經過,會將測試用例的ids列表轉換成簡單的索引列表,每一個索引對應一個測試用例的在原來測試集中的位置
- 這個方案可行的緣由是:全部的節點都保存着相同的測試用例集
- 而且使用這種方式能夠節省帶寬,由於master只須要告知workers須要執行的測試用例對應的索引,而不用告知完整的測試用例信息
第四步:測試用例分發
--dist-mode選項分佈式
each:master將完整的測試索引列表分發到每一個workeroop
load:master將大約25%的測試用例以輪詢的方式分發到各個worker,剩餘的測試用例則會等待workers執行完測試用例之後再分發測試
注意
可使用 pytest_xdist_make_scheduler 這個hook來實現自定義測試分發邏輯。spa
第五步:測試用例的執行
- workers 重寫了 pytest_runtestloop :pytest的默認實現是循環執行全部在test session這個對象裏面收集到的測試用例
- 可是在xdist裏, workers其實是等待master爲其發送須要執行的測試用例
- 當worker收到測試任務, 就順序執行 pytest_runtest_protocol
- 值得注意的一個細節是:workers 必須始終保持至少一個測試用例在的任務隊列裏, 以兼容 pytest_runtest_protocol(item, nextitem) hook的參數要求,爲了將 nextitem傳給hook
- worker會在執行最後一個測試項前等待master的更多指令
- 若是它收到了更多測試項, 那麼就能夠安全的執行 pytest_runtest_protocol , 由於這時nextitem參數已經能夠肯定
- 若是它收到一個 "shutdown"信號, 那麼就將 nextitem 參數設爲 None, 而後執行 pytest_runtest_protocol
第六步:測試用例再分發(--dist-mode=load)
- 當workers開始/結束執行時,會把測試結果返回給master,這樣其餘pytest hook好比: pytest_runtest_protocol 和 pytest_runtest_protocol 就能夠正常執行
- master在worker執行完一個測試後,基於測試執行時長以及每一個work剩餘測試用例綜合決定是否向這個worker發送更多的測試用例
第七步:測試結束
- 當master沒有更多執行測試任務時,它會發送一個「shutdown」信號給全部worker
- 當worker將剩餘測試用例執行完後退出進程
- master等待全部worker所有退出
- 然此時仍須要處理諸如 pytest_runtest_logreport 等事件
本文分享 CNBlog - 阿菠蘿阿瑤。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。.net