Pytest系列(17)- pytest-xdist分佈式測試的原理和流程

若是你還想從頭學起Pytest,能夠看看這個系列的文章哦!html

https://www.cnblogs.com/poloyy/category/1690628.html安全

 

pytest-xdist分佈式測試的原理

前言

  • xdist的分佈式相似於一主多從的結構,master機負責下發命令,控制slave機;slave機根據master機的命令執行特定測試任務
  • 在xdist中,主是master,從是workers

 

大體原理

  1. xdist會產生一個或多個workers,workers都經過master來控制
  2. 每一個worker負責執行完整的測試用例集,而後按照master的要求運行測試,而master機不執行測試任務

 

pytest-xdist分佈式測試的流程

第一步:建立worker

  1. master會在總測試會話(test session)開始前產生一個或多個worker
  2. master和worker之間是經過execnet和網關來通訊的
  3. 實際編譯執行測試代碼的worker多是本地機器也多是遠程機器

 

第二步:收集測試項用例

  1. 每一個worker相似一個迷你型的pytest執行器
  2. worker會執行一個完整的test collection過程【收集全部測試用例的過程】
  3. 而後把測試用例的ids返回給master
  4. master是不會執行任何測試用例集的

注意

因此爲何上面經過分佈式測試的結果截圖是沒有輸出用例的print內容,由於主機並不執行測試用例,pycharm至關於一個mastersession

 

第三步:master檢車workers收集到的測試用例集

  1. master接收到全部worker收集的測試用例集以後,master會進行一些完整性檢查,以確保全部worker都收集到同樣的測試用例集(包括順序)
  2. 若是檢查經過,會將測試用例的ids列表轉換成簡單的索引列表,每一個索引對應一個測試用例的在原來測試集中的位置
  3. 這個方案可行的緣由是:全部的節點都保存着相同的測試用例集
  4. 而且使用這種方式能夠節省帶寬,由於master只須要告知workers須要執行的測試用例對應的索引,而不用告知完整的測試用例信息

 

第四步:測試用例分發

--dist-mode選項分佈式

each:master將完整的測試索引列表分發到每一個workeroop

load:master將大約25%的測試用例以輪詢的方式分發到各個worker,剩餘的測試用例則會等待workers執行完測試用例之後再分發測試

 

注意

可使用  pytest_xdist_make_scheduler  這個hook來實現自定義測試分發邏輯。spa

 

第五步:測試用例的執行

  1. workers 重寫了   pytest_runtestloop  :pytest的默認實現是循環執行全部在test session這個對象裏面收集到的測試用例
  2. 可是在xdist裏, workers其實是等待master爲其發送須要執行的測試用例
  3. 當worker收到測試任務, 就順序執行  pytest_runtest_protocol 
  4. 值得注意的一個細節是:workers 必須始終保持至少一個測試用例在的任務隊列裏, 以兼容  pytest_runtest_protocol(item, nextitem)   hook的參數要求,爲了將 nextitem傳給hook
  5. worker會在執行最後一個測試項前等待master的更多指令
  6. 若是它收到了更多測試項, 那麼就能夠安全的執行   pytest_runtest_protocol  , 由於這時nextitem參數已經能夠肯定
  7. 若是它收到一個 "shutdown"信號, 那麼就將 nextitem 參數設爲 None, 而後執行 pytest_runtest_protocol

 

第六步:測試用例再分發(--dist-mode=load)

  1. 當workers開始/結束執行時,會把測試結果返回給master,這樣其餘pytest hook好比:  pytest_runtest_protocol  和  pytest_runtest_protocol  就能夠正常執行
  2. master在worker執行完一個測試後,基於測試執行時長以及每一個work剩餘測試用例綜合決定是否向這個worker發送更多的測試用例

 

第七步:測試結束

  1. 當master沒有更多執行測試任務時,它會發送一個「shutdown」信號給全部worker
  2. 當worker將剩餘測試用例執行完後退出進程
  3. master等待全部worker所有退出
  4. 然此時仍須要處理諸如  pytest_runtest_logreport  等事件

本文分享 CNBlog - 阿菠蘿阿瑤。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。.net

相關文章
相關標籤/搜索