【Python_pytest】pytest-xdist 分散式執行
阿新 • • 發佈:2022-12-05
pytest-xdist 是屬於程序級別的併發
分散式執行用例的原則:
- 用例之間是獨立的,沒有依賴關係,完全可以獨立執行
- 用例執行沒有順序要求,隨機順序都能正常執行,不影響其它用例
- 每個用例都能重複執行,執行結果不會影響其他用例
安裝
pip install pytest-xdist
不使用pytest-xdist
python -v
使用pytest-xdist
pytest -v -n num # num表示併發的程序數
引數 -n auto:可以自動檢測到系統的CPU核數。即利用了所有CPU來跑用例;
引數 -n num:指定num個程序跑同時執行用例
執行順序
--dist=loadscope # 將按照同一個模組 module 下的函式和同一個測試類 class 下的方法來分組,然後將每個測試組發給可以執行的 worker,確保同一個組的測試用例在同一個程序中執行。目前無法自定義分組,按類 class 分組優先於按模組 module 分組。 --dist=loadfile # 按照同一個檔名來分組,然後將每個測試組發給可以執行的 worker,確保同一個組的測試用例在同一個程序中執行。
# -*- coding: UTF-8 -*- import sys import os import json import time示例from loguru import logger as logs class TestXdist: """測試用例模組""" def setup_class(self): logs.info('>>> 測試環境:sit') logs.info(">>> 自動化資料開關: on.") logs.info('>>> 從execl第1行開始,共執行測試用例共1行 ') def teardown_class(self): logs.info(">>> 當前測試類所有測試用例執行完畢 ~") @pytest.mark.run(order=0) def test_demo1(self): logs.info(datetime.datetime.now()) time.sleep(5) logs.info(datetime.datetime.now()) @pytest.mark.run(order=1) def test_demo2(self): logs.info(datetime.datetime.now()) time.sleep(5) logs.info(datetime.datetime.now()) @pytest.mark.run(order=2) def test_demo3(self): logs.info(datetime.datetime.now()) time.sleep(5) logs.info(datetime.datetime.now()) if __name__ == "__main__": logs.debug("pytest") pytest.main(["test_xdist.py::TestXdist", # "執行檔名"::"類名"::"方法名" public_tools.get_html('test_debug'), # "生成html報告引數" "--self-contained-html", # 把css樣式合併到html裡 僅生成html檔案 "-v", # 日誌列印 -q僅報告 -s僅控制檯, -v 報告及控制檯 "-n 3 ", # 不使用則註釋掉,多程序併發 -s不使用分散式測試; -n後+num "--color=yes", # pytest 寫入輸出顏色 '-W', 'ignore:Module already imported:pytest.PytestWarning', # 忽略錯誤 ])
執行結果
pytest-xdist分散式測試的流程
第一步:建立worker
第二步:收集測試項用例
<Tips:分散式測試(pytest-xdist)方式執行測試時不會輸出測試用例中的print內容>
第三步:master檢測workers收集到的測試用例集
第四步:測試用例分發
--dist-mode選項
each:master將完整的測試索引列表分發到每個worker。
load:master將大約25%的測試用例以輪詢的方式分發到各個worker,剩餘的測試用例則會等待workers執行完測試用例以後再分發
<Tips:自定義分發邏輯可以使用:pytest_xdist_make_scheduler>
第五步:測試用例的執行
第六步:測試用例再分發(--dist-mode=load)
第七步:測試結束