国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

測試不夠快?試試這招!讓pytest多進程/多線程執(zhí)行測試用例,輕松提升測試效率!

這篇具有很好參考價值的文章主要介紹了測試不夠快?試試這招!讓pytest多進程/多線程執(zhí)行測試用例,輕松提升測試效率!。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

目錄:導讀

前言:

多進程執(zhí)行用例之pytest-xdist

pytest-xdist分布式測試的原理:

pytest-xdist分布式測試的流程:

多線程執(zhí)行用例之pytest-parallel

常用參數(shù)配置

pytest-parallel與pytest-xdist對比說明:

結語


測試不夠快?試試這招!讓pytest多進程/多線程執(zhí)行測試用例,輕松提升測試效率!

前言:

大家好!我是不二。

相信很多測試工程師都會遇到一個問題,那就是測試用例的執(zhí)行速度不夠快。對于一個龐大的項目來說,測試用例數(shù)量可能會非常多,執(zhí)行時間也可能會非常長,導致測試效率變得極低,甚至影響整個項目的進度。

但是,今天我要分享一個秘訣——使用pytest多進程/多線程執(zhí)行測試用例,讓你的測試速度提升數(shù)倍!這個方法不僅易于實現(xiàn),而且效果顯著,在我們團隊中已經(jīng)推廣了很長時間。

接下來,我將向大家詳細介紹這個方法的具體實現(xiàn)過程和注意事項,希望能幫助大家提高測試效率,更好地完成各自的測試任務。話不多說我們直接開始今天的學習好吧!

使用pytest多進程/多線程執(zhí)行測試用例的原因

  • 實際項目中的用例數(shù)量會非常多,幾百上千;如果采用單進程串行執(zhí)行的話會非常耗費時間。假設每條用例耗時2s,1000條就需要2000s $\approx$ 33min;還要加上用例加載、測試前/后置套件等耗時;導致測試執(zhí)行效率會相對低。
  • 想象一下如果開發(fā)改動一塊代碼,我們需要回歸一下,這時候執(zhí)行一下自動化用例需要花費大半個小時或者好幾個小時的時間,這是我們無法容忍的。
  • 為了節(jié)省項目測試時間,需要多個測試用例同時并行執(zhí)行;這就是一種分布式場景來縮短測試用例的執(zhí)行時間,提高效率。

分布式執(zhí)行用例的原則:

  • 用例之間是相互獨立的,沒有依賴關系,完全可以獨立運行;
  • 用例執(zhí)行沒有順序要求,隨機順序都能正常執(zhí)行;
  • 每個用例都能重復運行,運行結果不會影響其他用例。

項目結構
測試不夠快?試試這招!讓pytest多進程/多線程執(zhí)行測試用例,輕松提升測試效率!
測試腳本

# test1/test_1.py
import time

def test1_test1():
?? ?time.sleep(1)
?? ?assert 1 == 1, "1==1"


def test1_test2():
?? ?time.sleep(1)
?? ?assert 1 == 1, "1==1"
?? ?
?? ?
class TestDemo1:
?? ?def test_inner_1(self):
?? ??? ?time.sleep(1)
?? ??? ?assert 1 == 1, "1==1"


class TestDemo2:
?? ?def test_inner_2(self):
?? ??? ?time.sleep(1)
?? ??? ?assert 1 == 1, "1==1"
# test1/inner/test_3.py
import time

def test3_test1():
?? ?time.sleep(1)
?? ?assert 1 == 1, "1==1"


def test3_test2():
?? ?time.sleep(1)
?? ?assert 1 == 1, "1==1"
?? ?
# test2/test_2.py
import time

def test2_test1():
?? ?time.sleep(1)
?? ?assert 1 == 1, "1==1"


def test2_test2():
?? ?time.sleep(1)
?? ?assert 1 == 1, "1==1"
?? ?
# test2/inner/test_3.py
import time

def test4_test1():
?? ?time.sleep(1)
?? ?assert 1 == 1, "1==1"


def test4_test2():
?? ?time.sleep(1)
?? ?assert 1 == 1, "1==1"

正常執(zhí)行:需要8.10s?測試不夠快?試試這招!讓pytest多進程/多線程執(zhí)行測試用例,輕松提升測試效率!

多進程執(zhí)行用例之pytest-xdist

安裝:

pip install pytest-xdist

多cpu并行執(zhí)行用例,直接加個-n參數(shù)即可,后面num參數(shù)就是并行數(shù)量,比如num設置為3

pytest -v -n num
?

參數(shù):

  1. -n auto : 自動偵測系統(tǒng)里的CPU數(shù)目
  2. -n num : 指定運行測試的處理器進程數(shù)

多進程并行執(zhí)行:耗時2.66s大大的縮短了測試用例的執(zhí)行時間。


測試不夠快?試試這招!讓pytest多進程/多線程執(zhí)行測試用例,輕松提升測試效率!

pytest-xdist分布式測試的原理:

  1. xdist的分布式類似于一主多從的結構,master負責下發(fā)命令,控制slave;slave根據(jù)master的命令執(zhí)行特定測試任務。

  2. 在xdist中,主是master,從是workers;xdist會產(chǎn)生一個或多個workers,workers都通過master來控制,每個worker相當于一個mini版pytest執(zhí)行器?。

  3. master不執(zhí)行測試任務,只對worker收集到的所有用例進行分發(fā);每個worker負責執(zhí)行測試用例,然后將執(zhí)行結果反饋給master;由master統(tǒng)計最終測試結果。

pytest-xdist分布式測試的流程:

第一步:master創(chuàng)建worker

  1. master在測試會話(test session)開始前產(chǎn)生一個或多個worker。

  2. master和worker之間是通過execnet網(wǎng)關來通信的。

  3. 實際編譯執(zhí)行測試代碼的worker可能是本地機器也可能是遠程機器。

第二步:workers收集測試項用例

  1. 每個worker類似一個迷你型的pytest執(zhí)行器。

  2. worker會執(zhí)行一個完整的test collection過程。【收集所有測試用例的過程】

  3. 然后把測試用例的ids返回給master?!緄ds表示收集到的測試用例路徑】

  4. master不執(zhí)行任何測試用例。

注意:分布式測試(pytest-xdist)方式執(zhí)行測試時不會輸出測試用例中的print內(nèi)容,因為master并不執(zhí)行測試用例。

第三步:master檢測workers收集到的測試用例集

  1. master接收到所有worker收集的測試用例集之后,master會進行一些完整性檢查,以確保所有worker都收集到一樣的測試用例集(包括順序)。

  2. 如果檢查通過,會將測試用例的ids列表轉換成簡單的索引列表,每個索引對應一個測試用例的在原來測試集中的位置。

  3. 這個方案可行的原因是:所有的節(jié)點都保存著相同的測試用例集。

  4. 并且使用這種方式可以節(jié)省帶寬,因為master只需要告知workers需要執(zhí)行的測試用例對應的索引,而不用告知完整的測試用例信息。

第四步:master分發(fā)測試用例

有以下四種分發(fā)策略:命令行參數(shù)?--dist=mode選項(默認load)

  • each:master將完整的測試索引列表分發(fā)到每個worker,即每個worker都會執(zhí)行一遍所有的用例。
    測試不夠快?試試這招!讓pytest多進程/多線程執(zhí)行測試用例,輕松提升測試效率!

  • load:master將大約$\frac{1}{n}$的測試用例以輪詢的方式分發(fā)到各個worker,剩余的測試用例則會等待worker執(zhí)行完測試用例以后再分發(fā);每個用例只會被其中一個worker執(zhí)行一次。
    測試不夠快?試試這招!讓pytest多進程/多線程執(zhí)行測試用例,輕松提升測試效率!

  • loadfile:master分發(fā)用例的策略為按ids中的文件名(test_xx.py或xx_test.py)進行分發(fā),即同一個測試文件中的測試用例只會分發(fā)給其中一個worker;具有一定的隔離性。
    測試不夠快?試試這招!讓pytest多進程/多線程執(zhí)行測試用例,輕松提升測試效率!

  • loadscope:master分發(fā)用例對策略為按作用域進行分發(fā),同一個模塊下的測試函數(shù)或某個測試類中的測試函數(shù)會分發(fā)給同一個worker來執(zhí)行;即py文件中無測試類的話(只有測試function)將該模塊分發(fā)給同一個worker執(zhí)行,如果有測試類則會將該文件中的測試類只會分發(fā)給同一個worker執(zhí)行,多個類可能分發(fā)給多個worker;目前無法自定義分組,按類 class 分組優(yōu)先于按模塊 module 分組。
    測試不夠快?試試這招!讓pytest多進程/多線程執(zhí)行測試用例,輕松提升測試效率!

注意:可以使用pytest_xdist_make_scheduler這個hook來實現(xiàn)自定義測試分發(fā)邏輯。
如:想按目錄級別來分發(fā)測試用例:

from xdist.scheduler import LoadScopeScheduling


class CustomizeScheduler(LoadScopeScheduling):
	def _split_scope(self, nodeid):
		return nodeid.split("/", 1)[0]


def pytest_xdist_make_scheduler(config, log):
	return CustomizeScheduler(config, log)
  1. 只需在最外層conftest中繼承xdist.scheduler.LoadScopeScheduling并重寫_split_scope方法
  2. 重寫鉤子函數(shù)pytest_xdist_make_scheduler
pytest -v -n 4 --dist=loadfile
?

測試不夠快?試試這招!讓pytest多進程/多線程執(zhí)行測試用例,輕松提升測試效率!

第五步:worker執(zhí)行測試用例

  1. workers 重寫了pytest_runtestloop:pytest的默認實現(xiàn)是循環(huán)執(zhí)行所有在test_session這個對象里面收集到的測試用例。
  2. 但是在xdist里, workers實際上是等待master為其發(fā)送需要執(zhí)行的測試用例。
  3. 當worker收到測試任務, 就順序執(zhí)行pytest_runtest_protocol。
  4. 值得注意的一個細節(jié)是:workers 必須始終保持至少一個測試用例在的任務隊列里, 以兼容pytest_runtest_protocol(item, nextitem)hook的參數(shù)要求,為了將nextitem傳給hook。
  5. master在worker執(zhí)行完分配的一組測試后,基于測試執(zhí)行時長以及每個worker剩余測試用例綜合決定是否向這個worker發(fā)送更多的測試用例。
  6. worker會在執(zhí)行最后一個測試項前等待master的更多指令。
  7. 如果它收到了更多測試項, 那么就可以安全的執(zhí)行?pytest_runtest_protocol,因為這時nextitem參數(shù)已經(jīng)可以確定。
  8. 如果它收到一個?shutdown信號, 那么就將nextitem參數(shù)設為None, 然后執(zhí)行?pytest_runtest_protocol

第六步:測試結束

  1. 當master沒有更多執(zhí)行測試任務時,它會發(fā)送一個shutdown信號給所有worker。
  2. 當worker將剩余測試用例執(zhí)行完后退出進程。
  3. 當workers在測試執(zhí)行結束時,會將結果被發(fā)送回master,然后master將結果轉發(fā)到其他pytest hooks比如:pytest_runtest_logstart、pytest_runtest_logreport?確保整個測試活動進行正常運作。
  4. master等待所有worker全部退出并關閉測試會話。

注意:pytest-xdist 是讓每個 worker 進程執(zhí)行屬于自己的測試用例集下的所有測試用例。這意味著在不同進程中,不同的測試用例可能會調(diào)用同一個 scope 范圍級別較高(例如session)的 fixture,該 fixture 則會被執(zhí)行多次,這不符合 scope=session 的預期。

pytest-xdist 沒有內(nèi)置的支持來確保會話范圍的 fixture 僅執(zhí)行一次,但是可以通過使用文件鎖進行進程間通信來實現(xiàn);讓scope=session 的 fixture 在 test session 中僅執(zhí)行一次。

示例:需要安裝filelock?包,安裝命令pip install filelock

  1. 比如只需要執(zhí)行一次login(或定義配置選項、初始化數(shù)據(jù)庫連接等)。
  2. 當?shù)谝淮握埱筮@個fixture時,則會利用FileLock僅產(chǎn)生一次fixture數(shù)據(jù)。
  3. 當其他進程再次請求這個fixture時,則不會重復執(zhí)行fixture。
import pytest
import uuid
from filelock import FileLock

 
@pytest.fixture(scope="session")
def login(tmp_path_factory, worker_id):
    # 代表是單機運行
    if worker_id == "master":
        token = uuid.uuid4()
        print("fixture:請求登錄接口,獲取token", token)
        os.environ['token'] = token
        
        return token
        
    # 分布式運行
    # 獲取所有子節(jié)點共享的臨時目錄,無需修改【不可刪除、修改】
    root_tmp_dir = tmp_path_factory.getbasetemp().parent
    fn = root_tmp_dir / "data.json"
    with FileLock(str(fn) + ".lock"):
        if fn.is_file():  # 代表已經(jīng)有進程執(zhí)行過該fixture
            token = json.loads(fn.read_text())
        else:  # 代表該fixture第一次被執(zhí)行
            token = uuid.uuid4()
            fn.write_text(json.dumps(token))
        # 最好將后續(xù)需要保留的數(shù)據(jù)存在某個地方,比如這里是os的環(huán)境變量
        os.environ['token'] = token
	return token

多線程執(zhí)行用例之pytest-parallel

用于并行并發(fā)測試的 pytest 插件

pip install pytest-parallel

常用參數(shù)配置

  1. --workers=n?:多進程運行需要加此參數(shù), n是進程數(shù)。默認為1

  2. --tests-per-worker=n?:多線程需要添加此參數(shù),n是線程數(shù)

如果兩個參數(shù)都配置了,就是進程并行;每個進程最多n個線程,總線程數(shù):進程數(shù)*線程數(shù)

【注意】

  1. 在windows上進程數(shù)永遠為1。

  2. 需要使用?if name == “main” :在命令行窗口運行測試用例會報錯

示例:

  • pytest test.py --workers 3 :3個進程運行
  • pytest test.py --tests-per-worker 4 :4個線程運行
  • pytest test.py --workers 2 --tests-per-worker 4 :2個進程并行,且每個進程最多4個線程運行,即總共最多8個線程運行。

    import pytest

    import pytest
    
    
    def test_01():
        print('測試用例1操作')
    
    def test_02():
        print('測試用例2操作')
    
    def test_03():
        print('測試用例3操作')
    
    def test_04():
        print('測試用例4操作')
        
    def test_05():
        print('測試用例5操作')
    
    def test_06():
        print('測試用例6操作')
        
    def test_07():
        print('測試用例7操作')
    
    def test_08():
        print('測試用例8操作')
    
    
    if __name__ == "__main__":
        pytest.main(["-s", "test_b.py", '--workers=2', '--tests-per-worker=4'])

pytest-parallel與pytest-xdist對比說明:

  • pytest-parallel 比 pytst-xdist 相對好用,功能支持多;
  • pytst-xdist 不支持多線程;
  • pytest-parallel 支持python3.6及以上版本,所以如果想做多進程并發(fā)在linux或者mac上做,在Windows上不起作用(Workers=1),如果做多線程linux/mac/windows平臺都支持,進程數(shù)為workers的值。
  • pytest-xdist適用場景為:
    • 不是線程安全的
    • 多線程時性能不佳的測試
    • 需要狀態(tài)隔離
  • pytest-parallel對于某些用例(如 Selenium)更好:
    • 可以是線程安全的
    • 可以對 http 請求使用非阻塞 IO 來提高性能

簡而言之,pytest-xdist并行性pytest-parallel是并行性和并發(fā)性。

結語

這篇貼子到這里就結束了,最后,希望看這篇帖子的朋友能夠有所收獲。

?pytest教程獲取方式:留言【pytest】即可

如果你覺得文章還不錯,請大家 點贊、分享、留言 下,因為這將是我持續(xù)輸出更多優(yōu)質(zhì)文章的最強動力!文章來源地址http://www.zghlxwxcb.cn/news/detail-456535.html

到了這里,關于測試不夠快?試試這招!讓pytest多進程/多線程執(zhí)行測試用例,輕松提升測試效率!的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內(nèi)容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • Pytest 框架執(zhí)行用例流程淺談

    根據(jù)以下簡單的代碼示例,我們將 從源碼的角度分析其中的關鍵加載執(zhí)行步驟,對pytest整體流程架構有個初步學習。 代碼示例: 通過? pytest test_example.py 運行此代碼示例后, 會觸發(fā)pytest的入口函數(shù)main(),這個函數(shù)定義在src/pytest/__main__.py中,它的作用是創(chuàng)建一個PytestConfig對象

    2024年02月11日
    瀏覽(18)
  • python pytest失敗用例重新執(zhí)行

    python pytest自動化測試時,失敗用例重跑,可以采用pytest的庫rerunsfailurs 安裝步驟: 1. pip install pytest-rerunsfailures 2.如果需要html的測試報告,需要安裝 pip instal pytest-html 三種方式: 1、在python自動化項目根目錄下新建pytest.ini,在配置文件中寫入以下內(nèi)容: reruns為失敗用例重跑的

    2024年02月11日
    瀏覽(18)
  • pytest(一):基礎功能(執(zhí)行用例、allure報告、數(shù)據(jù)驅動)

    pytest(一):基礎功能(執(zhí)行用例、allure報告、數(shù)據(jù)驅動)

    pytest是python語言中一款強大的單元測試框架,用來管理和組織測試用例,可應用在單元測試、自動化測試工作中。 ?官網(wǎng):(https://docs.pytest.org/en/7.2.x/) 文章主要以unittest為參考分析pytest pytest主要作用是編寫測試用例、收集用例、執(zhí)行用例、生成測試結果文件(html、xml) unittest: 模

    2024年02月12日
    瀏覽(46)
  • 靜圖如何在線做動圖?試試這招三秒生成

    靜圖如何在線做動圖?試試這招三秒生成

    如何將靜態(tài)圖片做成gif動圖?不知道大家手上有沒有一些好玩有趣的圖片,想要將這些有趣的圖片變成更有趣的動態(tài)gif圖片應該如何操作呢?很簡單,通過使用gif動畫圖片(https://www.gif.cn/)制作工具上傳jpg、png格式圖片,輕松一鍵就能快速完成圖片合成gif圖的操作,具體步驟

    2024年02月06日
    瀏覽(15)
  • 測試框架pytest教程(2)-用例依賴庫-pytest-dependency

    測試框架pytest教程(2)-用例依賴庫-pytest-dependency

    對于 pytest 的用例依賴管理,可以使用? pytest-dependency ?插件。該插件提供了更多的依賴管理功能,使你能夠更靈活地定義和控制測試用例之間的依賴關系。 Using pytest-dependency — pytest-dependency 0.5.1 documentation 安裝 pytest-dependency 插件: 依賴方法和被依賴方法都需要使用裝飾器

    2024年02月11日
    瀏覽(40)
  • Pytest框架測試用例規(guī)則和運行方式

    Pytest框架測試用例規(guī)則和運行方式

    目錄 一、默認的測試用例規(guī)則 二、測試用例執(zhí)行順序 三、測試用例運行方式 3.1.主函數(shù)模式 3.1.1.主函數(shù)模式:4種運行方式? 3.1.2.文件框架如下圖? 3.2.命令行模式 3.2.1.命令行模式:4種運行方式? 3.2.2.第2種運行方式框架 3.3.通過讀取配置文件pytest.ini運行 3.3.1.pytest.ini 文件注

    2024年02月11日
    瀏覽(23)
  • 軟件測試|詳解 Pytest 參數(shù)化:簡化測試用例的編寫

    軟件測試|詳解 Pytest 參數(shù)化:簡化測試用例的編寫

    簡介 Pytest 是一個廣泛使用的 Python 測試框架,它提供了豐富的功能來編寫和執(zhí)行測試用例。其中一個強大的特性是參數(shù)化,它允許我們通過一種簡潔的方式運行多個輸入?yún)?shù)的相似測試用例,從而減少冗余的代碼。本文將詳細介紹 Pytest 的參數(shù)化功能以及如何使用它來簡化測

    2024年01月20日
    瀏覽(29)
  • 實戰(zhàn)干貨,pytest自動化測試-Git中的測試用例運行(詳細)

    我們每天寫完自動化用例后都會提交到 git 倉庫,隨著用例的增多,為了保證倉庫代碼的干凈,當有用例新增的時候,我們希望只運行新增的未提交 git 倉庫的用例。 pytest-picked 插件可以實現(xiàn)只運行未提交到git倉庫的代碼。 pytest-picked 使用命令行安裝 可使用參數(shù) 使用示例:

    2024年02月09日
    瀏覽(23)
  • 自動化用例編寫思路 (使用pytest編寫一個測試腳本)

    自動化用例編寫思路 (使用pytest編寫一個測試腳本)

    目錄 一,明確測試對象 二,編寫測試用例 構造請求數(shù)據(jù) 封裝測試代碼 斷言設置 三,執(zhí)行腳本獲取測試結果 四,總結 經(jīng)過之前的學習鋪墊,我們嘗試著利用pytest框架編寫一條接口自動化測試用例,來厘清接口自動化用例編寫的思路。 我們在百度搜索天氣查詢,會出現(xiàn)如下

    2024年02月16日
    瀏覽(23)
  • Pytest實現(xiàn)用例失敗截圖并且在測試報告中可以查看

    Pytest+Selenium是UI自動化常用得框架,結合Allure可以給出優(yōu)美得測試報告,失敗的case可以查看錯誤日志,但是對于UI自動化來說,最直觀的還是可以通過截圖來查看失敗原因,更方便測試人員定位問題。 鉤子函數(shù)pytest_runtest_makereport pytest提供了pytest_runtest_makereport這個方法,可以

    2024年02月09日
    瀏覽(16)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包