1. 程式人生 > >pytest-27-pytest分布式執行(pytest-xdist)

pytest-27-pytest分布式執行(pytest-xdist)

second params epo open href 數量 速度 直接 bsp

平常我們手工測試用例非常多時,比如有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)