日常咱們手工測試用例很是多時,好比有1千條用例,假設每一個用例執行須要1分鐘。若是一個測試人員執行須要1000分鐘才能執行完,當項目很是緊急的時候,
咱們會用測試人力成本換取時間成本,這個時候多找個小夥伴把任務分紅2部分,因而時間縮減一半。若是是十我的一塊兒執行,1000個用例理論上只需100分鐘就能完成,時間縮短到了1/10。大大節省的測試時間,爲項目節省了時間成本。html
一樣道理,當咱們測試用例很是多的時候,一條條執行,很顯然會比較慢,那麼如何讓測試用例並行執行呢,這就是咱們接下來要講的pytest分佈式執行插件pytest-xdistpython
cmd裏面使用pip安裝,目前版本號Version: 1.23.2linux
pip install pytest-xdistgit
>pip show pytest-xdist Name: pytest-xdist Version: 1.23.2 Summary: pytest xdist plugin for distributed testing and loop-on-failing modes Home-page: https://github.com/pytest-dev/pytest-xdist Author: holger krekel and contributors Author-email: pytest-dev@python.org,holger@merlinux.eu License: MIT Location: e:\python36\lib\site-packages Requires: execnet, pytest-forked, six, pytest
pytest-xdist官網地址:【Home-page: https://github.com/pytest-dev/pytest-xdist】github
該pytest-xdist插件擴展了一些獨特的測試執行模式pytest:web
測試運行並行化:若是有多個CPU或主機,則能夠將它們用於組合測試運行。會加快運行速度session
多平臺覆蓋:您能夠指定不一樣的Python解釋器或不一樣的平臺,並在全部平臺上並行運行測試。
在遠程運行測試以前,pytest有效地將您的程序源代碼「rsyncs」到遠程位置。報告全部測試結果並顯示給您的本地終端。您能夠指定不一樣的Python版本和解釋器。
若是您想知道pytest-xdist如何在幕後工做,能夠看這裏【OVERVIEW】分佈式
多cpu並行執行用例,直接加個-n參數便可,後面num參數就是並行數量,好比num設置爲3oop
pytest -n 3測試
運行如下代碼,項目結構以下
web_conf_py是項目工程名稱 │ conftest.py │ __init__.py │ ├─baidu │ │ conftest.py │ │ test_1_baidu.py │ │ test_2.py │ │ __init__.py │ ├─blog │ │ conftest.py │ │ test_2_blog.py │ │ __init__.py
代碼參考:
# web_conf_py/conftest.py import pytest @pytest.fixture(scope="session") def start(): print("\n打開首頁") return "yoyo" # web_conf_py/baidu/conftest.py import pytest @pytest.fixture(scope="session") def open_baidu(): print("打開百度頁面_session") # web_conf_py/baidu/test_1_baidu.py import pytest import time def test_01(start, open_baidu): print("測試用例test_01") time.sleep(1) assert start == "yoyo" def test_02(start, open_baidu): print("測試用例test_02") time.sleep(1) assert start == "yoyo" if __name__ == "__main__": pytest.main(["-s", "test_1_baidu.py"]) # web_conf_py/baidu/test_2.py import pytest import time def test_06(start, open_baidu): print("測試用例test_01") time.sleep(1) assert start == "yoyo" def test_07(start, open_baidu): print("測試用例test_02") time.sleep(1) assert start == "yoyo" if __name__ == "__main__": pytest.main(["-s", "test_2.py"]) # web_conf_py/blog/conftest.py import pytest @pytest.fixture(scope="function") def open_blog(): print("打開blog頁面_function") # web_conf_py/blog/test_2_blog.py import pytest import time def test_03(start, open_blog): print("測試用例test_03") time.sleep(1) assert start == "yoyo" def test_04(start, open_blog): print("測試用例test_04") time.sleep(1) assert start == "yoyo" def test_05(start, open_blog): '''跨模塊調用baidu模塊下的conftest''' print("測試用例test_05,跨模塊調用baidu") time.sleep(1) assert start == "yoyo" if __name__ == "__main__": pytest.main(["-s", "test_2_blog.py"])
正常運行須要消耗時間:7.12 seconds
E:\YOYO\web_conf_py>pytest ============================= test session starts ============================= platform win32 -- Python 3.6.0, pytest-3.6.3, py-1.5.4, pluggy-0.6.0 rootdir: E:\YOYO\web_conf_py, inifile: plugins: xdist-1.23.2, metadata-1.7.0, html-1.19.0, forked-0.2 collected 7 items baidu\test_1_baidu.py .. [ 28%] baidu\test_2.py .. [ 57%] blog\test_2_blog.py ... [100%] ========================== 7 passed in 7.12 seconds ===========================
設置並行運行數量爲3,消耗時間:3.64 seconds,大大的縮短了用例時間
E:\YOYO\web_conf_py>pytest -n 3 ============================= test session starts ============================= platform win32 -- Python 3.6.0, pytest-3.6.3, py-1.5.4, pluggy-0.6.0 rootdir: E:\YOYO\web_conf_py, inifile: plugins: xdist-1.23.2, metadata-1.7.0, html-1.19.0, forked-0.2 gw0 [7] / gw1 [7] / gw2 [7] scheduling tests via LoadScheduling ....... [100%] ========================== 7 passed in 3.64 seconds ===========================
使用pytest-xdist插件也能生成html報告,完美支持pytest-html插件
pytest -n 3 --html=report.html --self-contained-html
---------------------------------pytest結合selenium自動化完整版-------------------------
全書購買地址 https://yuedu.baidu.com/ebook/902224ab27fff705cc1755270722192e4536582b
做者:上海-悠悠 QQ交流羣:874033608
也能夠關注下個人我的公衆號:yoyoketang