中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

自動化測試框架pytest的Fixture固件怎么調用

發布時間:2023-03-30 11:58:17 來源:億速云 閱讀:109 作者:iii 欄目:開發技術

本篇內容介紹了“自動化測試框架pytest的Fixture固件怎么調用”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

什么是固件

Fixture 翻譯成中文即是固件的意思。它其實就是一些函數,會在執行測試方法/測試函數之前(或之后)加載運行它們,常見的如接口用例在請求接口前數據庫的初始連接,和請求之后關閉數據庫的操作。

我們之前在APP UI自動化系列中已經介紹過 unittest 的相關測試固件,如setupteardown等。而 pytest 中提供了功能更加豐富的Fixture,用于實現setupteardown功能。

定義方式

使用@pytest.fixture()進行定義,簡單示例如下:

import pytest
 
@pytest.fixture()
def before():
    print("連接數據庫")

調用方式

調用單個fixture函數

  • 方式一,使用fixture函數名作為參數

import pytest
 
@pytest.fixture()
def before():
    print("連接數據庫")
 
 
# 調用before
def test_01(before):
    print("執行test_01")
  • 方式二,使用 @pytest.mark.usefixtures('fixture函數名')裝飾器

import pytest
 
@pytest.fixture()
def before():
    print("連接數據庫")
 
# 調用before
@pytest.mark.usefixtures('before')
def test_01():
    print("執行test_01")
  • 方式三,使用autouse參數自動執行fixture函數

import pytest
 
# fixture函數定義的時候使用autouse參數,作用域范圍內的測試用例會自動調用該fixture函數
@pytest.fixture(autouse=True)
def before():
    print("連接數據庫")
 
    
# 自動調用before
def test_01():
    print("執行test_01")

三種方式調用后的結果都如下:

自動化測試框架pytest的Fixture固件怎么調用

我們可以看到,先執行了fixture函數,再執行測試函數。

調用多個fixture函數

import pytest
 
@pytest.fixture()
def before():
    print("連接數據庫")
 
@pytest.fixture()
def before_s():
    print("初始化數據")
 
 
def test_01(before, before_s):
    print("執行test_01")

調用多個 fixture 函數時,由前至后依次執行,所以test_01()調用時先執行before,再執行before_s

對fixture函數重命名

定義fixture函數時,可以利用name參數進行重命名,方便用于調用,示例如下:

import pytest
 
@pytest.fixture(name='db')
def connect_order_db():
    print("連接數據庫")
 
 
def test_01(db):
    print("執行test_01")

使用fixture傳遞測試數據

在執行完fixture函數后,有時需要將該fixture中得到到某些數據傳遞給測試函數/測試方法,用于后續的執行。

fixture中提供普通傳遞和參數化傳遞兩種數據傳遞方式。

普通傳遞

示例如下:

import pytest
 
@pytest.fixture()
def before():
    print("連接數據庫")
    return "連接成功!"
 
 
def test_01(before):
    print("執行test_01")
    assert before == "連接成功!"

注意,如果自定義的fixture函數有返回值,需要使用上面說的方式一調用才能獲取fixture函數的返回值并傳入測試函數中,方式二就無法獲取返回值。

參數化傳遞

fixture函數進行參數化時,需要使用參數params,并且需要傳入參數request,簡單示例如下:

import pytest
 
test_params = [1, 2, 0]
@pytest.fixture(params=test_params)
def before(request):
    result = request.param
    return result
 
def test_02(before):
    print("執行test_02")
    assert before
 
 
if __name__ == '__main__':
    pytest.main()

執行結果:

自動化測試框架pytest的Fixture固件怎么調用

可以看到,因為所調用的fixture函數進行了參數化,雖然只有一個測試函數但執行了3次。

conftest.py

上面我們舉的例子都是把fixture函數放在測試用例模塊里面,但如果很多測試模塊需要引用同一個fixture函數怎么辦,這是時候就需要把它放在命名為conftest的模塊里,這樣同級或以下目錄中的測試用例便能調用這些自定義的fixture函數。

例如,有如下目錄:

├─testcase
│  │
│  ├─test_module_01
│  │      test_case_1.py
│  │      test_case_2.py
│  │
│  ├─test_module_02
│  │      test_case_3.py

test_module_01 中的test_case_1.pytest_case_2.py都需要調用同一個 fixture 函數,那么我們只需要在 test_module_01 中新建conftest.py并編寫這個fixture函數即可,示例如下:

├─testcase
│  │
│  ├─test_module_01
│  │      conftest.py
│  │      test_case_1.py
│  │      test_case_2.py
│  │
│  ├─test_module_02
│  │      test_case_3.py

conftest.py:

import pytest
 
@pytest.fixture(autouse=True)
def before():
    print("連接數據庫")

test_case_1.py

def test_01():
    print("執行test_01")

test_case_2.py

def test_02():
    print("執行test_02")

這樣,執行這兩個模塊的測試用例時會自動先去調用conftest.py中的before()函數。

假設 test_module_02 中的 test_case_3.py 也需要調用這個before()函數,那么這個時候我們就需要在上一層即 testcase 中新建conftest.py并編寫這個before()函數,才能在 test_case_3.py 中調用,如下:

├─testcase
│  │  conftest.py
│  │
│  ├─test_module_01
│  │      conftest.py
│  │      test_case_1.py
│  │      test_case_2.py
│  │
│  ├─test_module_02
│  │      test_case_3.py

conftest.py只作用于同級以下目錄中的測試模塊,且需要注意,當以下層級中存在了另一個conftest.py,那么以下層級將由另一個conftest.py文件接管。

作用域

pytest 的 fixture 作用域分sessionmoduleclassfunction四個級別。在定義 fixture 函數的時候通過scope參數指定作用范圍,默認為function

  • session,每次會話執行一次

  • module,每個測試模塊執行一次

  • class,每個測試類執行一次

  • function,每個測試方法執行一次

注意,對于單獨定義的測試函數,class、function 都會起作用,可以從下列示例中看出來。

測試目錄結構如下:

├─apiAutoTest
│  │  run.py
│  │
│  ├─testcase
│  │  │  conftest.py
│  │  │
│  │  ├─test_module_02
│  │  │  │  conftest.py
│  │  │  │  test_case_3.py
│  │  │  │  test_case_4.py

其中conftest.py代碼如下:

import pytest
 
@pytest.fixture(scope="session", autouse=True)
def session_fixture():
    print("這是一個作用于session的fixture")
 
@pytest.fixture(scope="module", autouse=True)
def module_fixture():
    print("這是一個作用于module的fixture")
 
@pytest.fixture(scope="class", autouse=True)
def class_fixture():
    print("這是一個作用于class的fixture")
 
@pytest.fixture(scope="function", autouse=True)
def function_fixture():
    print("這是一個作用于function的fixture")

test_case_3.py代碼如下:

import pytest
 
class TestOrder:
 
    def test_a(self):
        print("test_a")
        
    def test_b(self):
        print("test_b")
 
def test_c():
    print("test_c")

test_case_4.py代碼如下:

def test_e():
    print("test_e")

run.py代碼如下:

import pytest
 
if __name__ == '__main__':
    pytest.main(["-s"])

運行run.py,結果如下:

collected 4 items
 
testcase\test_module_02\test_case_3.py 
這是一個作用于session的fixture
這是一個作用于module的fixture
這是一個作用于class的fixture
這是一個作用于function的fixture
test_a
.這是一個作用于function的fixture
test_b
.這是一個作用于class的fixture
這是一個作用于function的fixture
test_c
.
testcase\test_module_02\test_case_4.py 
這是一個作用于module的fixture
這是一個作用于class的fixture
這是一個作用于function的fixture
test_e
.
 
============================== 4 passed in 0.04s ==============================

從結果可以看出來:

  • 作用于session的fixture函數只在所有測試用例執行之前調用了一次

  • 作用于module的fixture函數在每個測試模塊執行之前調用了一次

  • 作用于class的fixture函數在每個測試類執行之前調用了一次

  • 作用于function的fixture函數在每個測試方法/測試函數執行之前調用了一次

注意,在定義的測試函數(如test_c()test_e())執行之前也會調用scope=class的fixture函數。

“自動化測試框架pytest的Fixture固件怎么調用”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

自治县| 惠州市| 连江县| 宁津县| 体育| 同心县| 中阳县| 商城县| 兴安县| 剑阁县| 广元市| 巴东县| 邹平县| 大悟县| 肥乡县| 永靖县| 铅山县| 松江区| 纳雍县| 萝北县| 彩票| 安溪县| 万荣县| 南澳县| 上思县| 合川市| 冷水江市| 连平县| 政和县| 通化市| 金秀| 新野县| 肥东县| 天祝| 怀来县| 甘南县| 屯门区| 泰宁县| 望都县| 定西市| 偏关县|