1. 程式人生 > 實用技巧 >pytest-xdist 分散式執行用例

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的login)
當第一次請求這個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("退出登入")