若是你還想從頭學起Pytest,能夠看看這個系列的文章哦!html
https://www.cnblogs.com/poloyy/category/1690628.htmlpython
pip3 install pytest-xdist -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com
這是運行代碼的包結構web
14xdist是項目文件夾名稱 │ conftest.py │ test_1.py │ __init__.py │ ├─test_51job │ │ conftest.py │ │ test_case1.py │ │ __init__.py │ ├─test_toutiao │ │ test_case2.py │ ├─test_weibo │ │ conftest.py │ │ test_case3.py │ │ __init__.py │
# 外層conftest.py @pytest.fixture(scope="session") def login(): print("====登陸功能,返回帳號,token===") name = "testyy" token = "npoi213bn4" yield name, token print("====退出登陸!!!====")
import pytest @pytest.mark.parametrize("n", list(range(5))) def test_get_info(login, n): sleep(1) name, token = login print("***基礎用例:獲取用戶我的信息***", n) print(f"用戶名:{name}, token:{token}")
import pytest @pytest.fixture(scope="module") def open_51(login): name, token = login print(f"###用戶 {name} 打開51job網站###")
from time import sleep import pytest @pytest.mark.parametrize("n", list(range(5))) def test_case2_01(open_51, n): sleep(1) print("51job,列出全部職位用例", n) @pytest.mark.parametrize("n", list(range(5))) def test_case2_02(open_51, n): sleep(1) print("51job,找出全部python崗位", n)
from time import sleep import pytest @pytest.mark.parametrize("n", list(range(5))) def test_no_fixture(login, n): sleep(1) print("==沒有__init__測試用例,我進入頭條了==", login)
import pytest @pytest.fixture(scope="function") def open_weibo(login): name, token = login print(f"&&& 用戶 {name} 返回微博首頁 &&&")
from time import sleep import pytest @pytest.mark.parametrize("n", list(range(5))) class TestWeibo: def test_case1_01(self, open_weibo, n): sleep(1) print("查看微博熱搜", n) def test_case1_02(self, open_weibo, n): sleep(1) print("查看微博范冰冰", n)
pytest -s
能夠看到,執行一條用例大概1s(由於每一個用例都加了 sleep(1) ),一共30條用例,總共運行30s;那麼若是有1000條用例,執行時間就真的是1000ssession
pytest -s -n auto
pytest -s -n 2
pytest -s -n auto --html=report.html --self-contained-html
pytest-xdist默認是無序執行的,能夠經過 --dist 參數來控制順序併發
--dist=loadscope 分佈式
--dist=loadfile ide
按照同一個文件名來分組,而後將每一個測試組發給能夠執行的worker,確保同一個組的測試用例在同一個進程中執行函數
pytest-xdist是讓每一個worker進程執行屬於本身的測試用例集下的全部測試用例oop
這意味着在不一樣進程中,不一樣的測試用例可能會調用同一個scope範圍級別較高(例如session)的fixture,該fixture則會被執行屢次,這不符合scope=session的預期測試
雖然pytest-xdist沒有內置的支持來確保會話範圍的夾具僅執行一次,可是能夠經過使用鎖定文件進行進程間通訊來實現。
import pytest from filelock import FileLock @pytest.fixture(scope="session") def login(): print("====登陸功能,返回帳號,token===") with FileLock("session.lock"): name = "testyy" token = "npoi213bn4" # web ui自動化 # 聲明一個driver,再返回 # 接口自動化 # 發起一個登陸請求,將token返回均可以這樣寫 yield name, token print("====退出登陸!!!====")