pytest文檔27-pytest分佈式執行(pytest-xdist)

前言

日常咱們手工測試用例很是多時,好比有1千條用例,假設每一個用例執行須要1分鐘。若是一個測試人員執行須要1000分鐘才能執行完,當項目很是緊急的時候,
咱們會用測試人力成本換取時間成本,這個時候多找個小夥伴把任務分紅2部分,因而時間縮減一半。若是是十我的一塊兒執行,1000個用例理論上只需100分鐘就能完成,時間縮短到了1/10。大大節省的測試時間,爲項目節省了時間成本。html

  • pytest 3.6.3
  • pytest-allure-adaptor 1.7.10
  • pytest-forked 0.2
  • pytest-html 1.19.0
  • pytest-metadata 1.7.0
  • pytest-repeat 0.7.0
  • pytest-xdist 1.23.2

一樣道理,當咱們測試用例很是多的時候,一條條執行,很顯然會比較慢,那麼如何讓測試用例並行執行呢,這就是咱們接下來要講的pytest分佈式執行插件pytest-xdistpython

pytest-xdist

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

  • --looponfail:在子進程中重複運行測試。每次運行以後,pytest會等待,直到項目中的文件發生更改,而後從新運行之前失敗的測試。
    重複此過程直到全部測試經過,以後再次執行完整運行。
  • 多平臺覆蓋:您能夠指定不一樣的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

相關文章
相關標籤/搜索