pytest-27-pytest分布式執行(pytest-xdist)
平常我們手工測試用例非常多時,比如有1千條用例,假設每個用例執行需要1分鐘。如果一個測試人員執行需要1000分鐘才能執行完,當項目非常緊急的時候,
我們會用測試人力成本換取時間成本,這個時候多找個小夥伴把任務分成2部分,於是時間縮減一半。如果是十個人一起執行,1000個用例理論上只需100分鐘就能完成,時間縮短到了1/10。大大節省的測試時間,為項目節省了時間成本。
同樣道理,當我們測試用例非常多的時候,一條條執行,很顯然會比較慢,那麽如何讓測試用例並行執行呢,這就是我們接下來要講的pytest分布式執行插件pytest-xdist
pytest-xdist
cmd裏面使用pip安裝,目前版本號Version: 1.23.2
pip install pytest-xdist
>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】
該pytest-xdist插件擴展了一些獨特的測試執行模式pytest:
-
測試運行並行化:如果有多個CPU或主機,則可以將它們用於組合測試運行。會加快運行速度
- --looponfail:在子進程中重復運行測試。每次運行之後,pytest會等待,直到項目中的文件發生更改,然後重新運行以前失敗的測試。
重復此過程直到所有測試通過,之後再次執行完整運行。 -
多平臺覆蓋:您可以指定不同的Python解釋器或不同的平臺,並在所有平臺上並行運行測試。
在遠程運行測試之前,pytest有效地將您的程序源代碼“rsyncs”到遠程位置。報告所有測試結果並顯示給您的本地終端。您可以指定不同的Python版本和解釋器。
如果您想知道pytest-xdist如何在幕後工作,可以看這裏【OVERVIEW】
並行測試
多cpu並行執行用例,直接加個-n參數即可,後面num參數就是並行數量,比如num設置為3
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-27-pytest分布式執行(pytest-xdist)