pytest-xdist 分散式執行用例
pytest-xdist是屬於程序級的併發執行
一般寫用例儘量要遵循的規則:
用例之間沒有依賴關係,用例可以獨立執行的
用例可隨機執行
每個用例都能重複執行,執行結果不影響其他用例
分散式執行用例:
直接執行:pytest -s
自動檢測到系統的CPU核數來分散式執行:pytest -s -n auto
指定本機cpu數量來執行:pytest -s -n 2
報告:
分散式執行用例 pytest-xdist,結合使用pytest-html
pytest -s -n auto --html=report.html --self-contained-html
另:-------------------------------------------------------
管理用例執行順序: pytest-xdist預設是無序執行的,可以通過 --dist 引數來控制順序 :
--dist=loadscope
將按照同一個module下的函式、同一個測試類class下的方法來分組,
然後將每個組發給可以執行的程序裡去,同一組的測試用例在同一個程序中執行
注意:目前無法自定義分組,因此按類class分組 優先於 按模組module分組 執行
--dist=loadfile
按照同一個檔名來分組,然後將每個測試組發給可以執行的程序,確保同一組的測試用例在同一個程序中執行
存在有一個問題:
如以下目錄:
conftest.py #寫了預置 login 在內test_1.py __init__.py #二級目錄 conftest.py test_2.py __init__.py
使用pytest-xdist分散式執行測試用例,每個程序裡面都是互相獨立執行被分到同一組的用例
那麼就會存在一種情況:
假設現在每條case都需要登入之後才能執行,但是因為程序是獨立執行被分到同一組的用例,
但是登入login這個預置條件又會有很多個程序都會呼叫
-->>這裡就會涉及到被fixture裝飾的login方法會被請求呼叫多次
-->>(但是fixture的用處就是避免重複請求執行,這裡就有點衝突了)
實現只調用一次方法:
當第一次請求這個fixture時,則使用with方法,利用FileLock僅產生一次fixture資料
當其他程序再次請求這個fixture時,則會從檔案中讀取資料
import pytest from filelock import FileLock @pytest.fixture(scope="session") def login(): print("登入成功後返回user 和token") with FileLock("session_lock"): user = "admin" token = "TYUW12ewesdfsdfdsf3123dese" yield name, token print("退出登入")