Pytest框架 — 08、Pytest的Fixture(部分前後置)(三)

来源:https://www.cnblogs.com/qishuaiRisen/archive/2022/08/16/16591149.html
-Advertisement-
Play Games

8、Fixture帶返回值 在fixture中我們可以使用yield或者return來返回我們需要的東西,如測試數據,資料庫連接對象,文件對象等。 沒有後置處理 直接採用return的方式返回數據(yield也可以) import pytest @pytest.fixture() def data_ ...


目錄

8、Fixture帶返回值

fixture中我們可以使用yield或者return來返回我們需要的東西,如測試數據,資料庫連接對象,文件對象等。

  1. 沒有後置處理
    直接採用return的方式返回數據(yield也可以)
import pytest

@pytest.fixture()
def data_fixture():
    return ["a", "b", "c"]


def test_case(data_fixture):
    print(f"測試數據為:{data_fixture}")

"""
執行結果
fixture/yield_data.py::test_case 測試數據為:['a', 'b', 'c']
PASSED
"""
  1. 有後置處理
  • 使用yield返回數據,在yield下麵添加後置處理
import pytest

@pytest.fixture()
def data_fixture():
   print("【前置】")
   yield ["a", "b", "c"]
   print("【後置】")

def test_case(data_fixture):
   print(f"測試數據為:{data_fixture}")

"""
執行結果
fixture/yield_data.py::test_case 【前置】
測試數據為:['a', 'b', 'c']
PASSED【後置】
"""
  • 使用return返回數據,通過addfinalizer註冊後置處理
import pytest

@pytest.fixture()
def data_fixture(request):
    print("【前置】")

    def addfinalizer_demo():
        print("【後置】")
    request.addfinalizer(addfinalizer_demo)
    return ["a", "b", "c"]


def test_case(data_fixture):
    print(f"測試數據為:{data_fixture}")

"""
執行結果
fixture/return_data.py::test_case 【前置】
測試數據為:['a', 'b', 'c']
PASSED【後置】
"""

9、Fixture實現參數化

可以通過fixtureparams參數來實現參數化。(有更好的參數化方式,故此方法不常用)
示例1:

import pytest
data = [("張三","男"), ("李四","女")]


@pytest.fixture(params=data)
def fixture_data(request):
    print("【前置】")
    def addfinalizer_demo():
        print("【後置】")
    request.addfinalizer(addfinalizer_demo)
    return request.param


def test_case(fixture_data):
    print(fixture_data[0], fixture_data[1])


"""
執行結果
fixture/fixture_params.py::test_case[fixture_data0] 【前置】
張三 男
PASSED【後置】

fixture/fixture_params.py::test_case[fixture_data1] 【前置】
李四 女
PASSED【後置】
"""

示例2:通過ids參數為每個用例取別名

import pytest
data = [("張三","男"), ("李四","女")]


@pytest.fixture(params=data,ids=["Developer", "Tester"])
def fixture_data(request):
    print("【前置】")
    def addfinalizer_demo():
        print("【後置】")
    request.addfinalizer(addfinalizer_demo)
    return request.param


def test_case(fixture_data):
    print(fixture_data[0], fixture_data[1])

"""
執行結果
fixture/fixture_params_ids.py::test_case[Developer] 【前置】
張三 男
PASSED【後置】

fixture/fixture_params_ids.py::test_case[Tester] 【前置】
李四 女
PASSED【後置】
"""

總結:

  • 通過params參數實現參數化需要用到request關鍵字,通過return request.param將測試數據返回。
  • params中有多少數據,ids就必須對應多少參數,脫離使用params實現參數化,ids將毫無意義。
  • params支持的參數格式:
    • 列表[]
    • 元祖()
    • 元祖列表[(),(),()]
    • 字典列表[{},{},{}]
    • 字典元祖({},{},{})

10、可靠的Fixture寫法

假如,我們有一個登錄頁面,需要進行登錄測試。為了方便測試,我們還有一個管理員的api,可以直接調用來生成測試用戶。那麼,這個測試場景通常會這樣去構建:

  • 通過管理API創建一個用戶
  • 使用Selenium啟動瀏覽器
  • 進入我們網站的登錄頁面
  • 使用創建好的用戶進行登錄
  • 斷言登錄後的用戶名出現在登錄頁的頁眉中

(一)一個不可靠Fixture的例子

說明:該例子不可執行,僅做示例

import pytest
from selenium import webdriver
import AdminApiClent
import LoginPage
import IndexPage
from urllib.parse import urljoin
base_url = "https:xxx.com"
username = "xxx"

@pytest.fixture()
def setup_fixture():
    # 【前置處理】
    # 1、通過AdminApiClent創建一個用戶
    client = AdminApiClent()
    client.create_user(username)
    # 2、獲取驅動對象
    driver = webdriver.Chrome()
    # 3、打開登錄頁
    driver.(urljoin(base_url,"/login"))
    # 4、執行登錄操作
    login_page = LoginPage(driver)
    login_page.login(username)
    yield username
    # 【後置處理】
    # 1、關閉瀏覽器
    driver.quit()
    # 2、刪除用戶
    client.del_user(username)
    # 3、退出AdminApiClent
    client.quit()


def test_login_success(setup_fixture):
    # 斷言登錄後用戶名是否出現在首頁
    assert setup_fixture == IndexPage.username

上面例子存在的問題:

  • setup_fixture這一個fixture函數中做的事情太多,很多步驟不容易重用。
  • 假設setup_fixtureyield之前出現異常,後置處理不會執行。(雖然可以使用addfinalizer,但是不易維護和重用)

(二)修改成可靠Fixture的例子

說明:該例子不可執行,僅做展示

import pytest
from selenium import webdriver
import AdminApiClent
import LoginPage
import IndexPage
from urllib.parse import urljoin
base_url = "https:xxx.com"
username = "xxx"

# 處理AdminApiClient
@pytest.fixture(name="client")
def AdminApiClient_fixture():
    client = AdminApiClent()
    yield client
    client.quit()

# 處理用戶
@pytest.fixture()
def user_fixture(client):
    client.create_user(username)
    yield username
    client.del_user(username)

# 處理驅動
@pytest.fixture()
def driver_fixture():
    driver = selenium.Chrome()
    yield driver
    driver.quit()

# 處理登錄
@pytest.fixture()
def login_fixture(driver_fixture, user_fixture):
    driver_fixture.get(urljoin(base_url, "/login"))
    login_page = LoginPage(driver_fixture)
    login_page.login(user_fixture)

# 處理首頁
@pytest.fixture()
def index_fixture(driver_fixture):
    return IndexPage(driver_fixture)

# 斷言
def test_login_success(login_fixture,index_fixture,user_fixture):
    assert user_fixture == index_fixture.username

這麼改造的優點:

  • 每一步都單獨進行了封裝,提高了復用性
  • 假設運行中user_fixture報錯了,那麼不影響driver_fixture關閉瀏覽器
  • 假設運行中driver_fixture報錯了,那麼根本就不會執行user_fixture

參考
https://www.cnblogs.com/liuyuelinfighting/p/15999810.html
https://zhuanlan.zhihu.com/p/359125816


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Which is Faster For Loop or For-each in Java 對於Java迴圈中的For和For-each,哪個更快 通過本文,您可以瞭解一些集合遍歷技巧。 Java遍歷集合有兩種方法。一個是最基本的for迴圈,另一個是jdk5引入的for each。通過這種方法,我們可 ...
  • 項目場景:Mysql 實現資料庫讀寫分離 搭建3台MySQL伺服器,完成主從複製,搭建一臺amoeba伺服器,完成MySQL的讀寫分離 問題描述: 問題1、 在服務搭建完畢後,利用客戶機連接amoeba伺服器登錄資料庫,無法查看資料庫內容客戶端報錯的數據代碼: mysql> show databas ...
  • 參考:https://javajgs.com/archives/26157 一.背景 1-1 需求 前端上傳Word文檔,後端將接收到的Word文檔①上傳到文件伺服器②將Word轉為Pdf。 1-2 方案 因為Word轉Pdf的耗時較長,為了及時給到前端返回信息,在將文件上傳到文件伺服器後,非同步將W ...
  • 最近經常遇到一個問題:輸入端在同一行輸入兩個整型數字,並用空格間隔,問如何方便快捷的將這兩個變數分別賦予給x1,x2? 新手小白,由於不知道map()函數的用法,便想要用僅有的知識去解決它: 1 list1=[int(i) for i in input().split()] 2 x1=list1[0 ...
  • 常用類 筆記目錄:(https://www.cnblogs.com/wenjie2000/p/16378441.html) 包裝類 包裝類的分類 針對八種基本數據類型相應的引用類型—包裝類 有了類的特點,就可以調用類中的方法。 | 基本數據類型 | 包裝類 | | | | | boolean | B ...
  • 7.1 順序性場景 7.1.1 場景概述 假設我們要傳輸一批訂單到另一個系統,那麼訂單對應狀態的演變是有順序性要求的。 已下單 → 已支付 → 已確認 不允許錯亂! 7.1.2 順序級別 1)全局有序: 串列化。每條經過kafka的消息必須嚴格保障有序性。 這就要求kafka單通道,每個groupi ...
  • 前言 本文基於Dubbo2.6.x版本,中文註釋版源碼已上傳github:xiaoguyu/dubbo 負載均衡,英文名稱為Load Balance,其含義就是指將負載(工作任務)進行平衡、分攤到多個操作單元上進行運行。 例如:在Dubbo中,同一個服務有多個服務提供者,每個服務提供者所在的機器性能 ...
  • 大家好,我是三友~~ 上周花了一點時間從頭到尾、從無到有地搭建了一套RocketMQ的環境,覺得還挺easy的,所以就寫篇文章分享給大家。 整篇文章可以大致分為三個部分,第一部分屬於一些核心概念和工作流程的講解;第二部分就是純手動搭建了一套環境;第三部分是基於環境進行測試和集成到SpringBoot ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...