首頁 > 軟體

Pytest框架之fixture詳解(三)

2022-06-30 14:02:28

相關文章

Pytest框架之fixture詳解(一)

Pytest框架之fixture詳解(二)

Pytest框架之fixture詳解(三)

本文關於fixture的內容如下:

  • 1、引數化fixture
  • 2、fixture工廠
  • 3、request這個fixture

1、引數化fixture

fixture有個params引數,允許我們傳遞資料。

語法格式:

# conftest.py檔案
​
# fixture的params引數
# 取value1時,會把依賴此fixture的用例執行一遍。
# 取value2時,會把依賴此fixture的用例執行一遍。
# 取value3時,會把依賴此fixture的用例執行一遍。
# params有幾個引數,就會將依賴此fixture的用例執行幾遍。
@pytest.fixture(params=[value1, value2, value3..])
def fix_name():
    # do something

當我們需要多次呼叫fixture時,則可以用到fixture的引數化功能。

但它並不是並行的,是序列執行的。

比如,測試物件有多種設定方式,那麼引數化可以幫我們在多種設定方式下執行用例。

接下來,以網頁自動化為案例。

需求:要在google、firefox瀏覽器下執行測試用例,用例為開啟百度搜尋pytest。

1)先在conftest.py當中,定義fixture,並設定params=["google", "firefox"]

# conftest.py
​
# params設定為google和firefox
@pytest.fixture(params=["google", "firefox"])
def browser_fix(request):
    if request.param == "google":
        driver = webdriver.Chrome()
    elif request.param == "firefox":
        driver = webdriver.Firefox()
    else:
        driver = None
    yield driver
    if driver:
        driver.quit()

2)在測試用例檔案test_baidu_action.py中,編寫測試用例,並呼叫browser_fix

# test_baidu_action.py
​
@pytest.mark.usefixtures("browser_fix")
def test_baidu(browser_fix):
    driver = browser_fix
    driver.get("https://www.baidu.com/")
    driver.find_element(By.ID, "kw").send_keys("pytest", Keys.ENTER)
    loc = (By.XPATH, '//h3')
    WebDriverWait(driver,10).until(EC.visibility_of_element_located(loc))
    driver.find_element(*loc).click()

3)執行2)中的用例,會依次在google瀏覽器中執行完成,然後在firefox瀏覽器中執行完成。一共是2條測試用例。

2、fixture工廠

當我們在一個用例當中,需要多次呼叫fixture時,就可以使用fixture工廠

利用的是裝飾器的方式

在fixture內部,定義一個函數。fixture返回的是函數。

以下案例來自官網:

@pytest.fixture
def make_customer_record():
    def _make_customer_record(name):
        return {"name": name, "orders": []}
​
    return _make_customer_record
​
# 用例內部,多次呼叫了fixture.
def test_customer_records(make_customer_record):
    customer_1 = make_customer_record("Lisa")  # 第1次呼叫
    customer_2 = make_customer_record("Mike")  # 第2次呼叫
    customer_3 = make_customer_record("Meredith")  # 第3次呼叫

如果工廠建立的資料需要管理,那麼fixtue可以如下處理:

@pytest.fixture
def make_customer_record():
     
    # 管理工廠的資料。在前置中建立。在後置中銷燬
    created_records = []
​
    def _make_customer_record(name):
        record = models.Customer(name=name, orders=[])
        # 前置中新增資料
        created_records.append(record)
        return record
​
    yield _make_customer_record  # 返回內部函數
     
    # 銷燬資料
    for record in created_records:
        record.destroy()
​
# 測試用例
def test_customer_records(make_customer_record):
    customer_1 = make_customer_record("Lisa")
    customer_2 = make_customer_record("Mike")
    customer_3 = make_customer_record("Meredith")

3、request這個fixture

pytest內建的名為requests的fixture,主要功能: 提供請求fixture的測試用例/測試類的資訊的。

我們定義fixture之後,通常都是測試用例/測試類,來請求fixture。

而request fixture就會記錄 測試用例/測試類 相關資訊。

request fixture是通過FixtureRequest來實現的,有以下屬性(列舉部分)可以使用:

  • request.param:獲取fixture的params引數值
  • request.scope:獲取fixture的作用域
  • request.function:獲取呼叫fixture的用例函數名稱。如果fixture是函數級別的作用域。
  • request.cls:獲取測試用例是從哪個測試類裡收集的。
  • request.module:獲取測試用例/測試類從哪個python模組裡收集的。
  • request.config:從pytest的config檔案當中,獲取與當前請求有關的設定資訊

更多的請查閱官網:https://docs.pytest.org/en/stable/reference.html

既然requests是fixture,那麼我們定義的fixture,就可以直接把requests作為函數引數來用。

下面,以簡單案例來演示。

定義一個fixture,將requests作為引數。

import pytest
​
@pytest.fixture(params=[1,2])
def init(request):
    print("用例名稱:", request.function)
    print("fix引數 ", request.param)
    print("fix的作用域 ", request.scope)
    print("用例所在的類 ", request.cls)

定義一個測試類,直接請求名為init的fixture:

@pytest.mark.usefixtures("init")
class TestABC:
​
    def test_hello(self):
        print("-------------------------")

執行結果如下:

到此這篇關於Pytest框架之fixture的文章就介紹到這了。希望對大家的學習有所幫助,也希望大家多多支援it145.com。


IT145.com E-mail:sddin#qq.com