最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

pytest利用request?fixture實現(xiàn)個性化測試需求詳解

 更新時間:2023年09月13日 08:31:04   作者:郝同學的測開筆記  
這篇文章主要為大家詳細介紹了pytest如何利用request?fixture實現(xiàn)個性化測試需求,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起了解一下

前言

深入理解 pytest-repeat 插件的工作原理這篇文章中,我們看到pytest_repeat源碼中有這樣一段

看到參數(shù)為request,我們知道fixture裝飾的函數(shù)入?yún)?,只能是其他fixture,所以這里request一定也是fixture。那它到底怎么用呢?這篇文章將詳細介紹,并通過實戰(zhàn)項目加深理解。

request fixture

The request fixture is a special fixture providing information of the requesting test function.這是pytest官方文檔的介紹,意思就是請求fixture是一個特殊的fixture,提供請求測試函數(shù)的信息。

源碼直達,感興趣的朋友可以查看源碼FixtureRequest

文檔直達

request.node

當前測試用例的節(jié)點對象,表示當前執(zhí)行的測試用例??梢允褂迷搶ο螳@取測試用例的名稱、文件路徑、測試類等信息。

import pytest
?
?
@pytest.fixture
def my_fixture(request):
 ? ?node = request.node
 ? ?print(f"Current test case: {node.name}")
 ? ?print(f"Test file path: {node.fspath}")
 ? ?print(f"Test class: {node.getparent}")
?
?
?
def test_demo(my_fixture):
 ? ?pass

輸出結果為:

Current test case: test_demo
Test file path: /Users/pxl/test_dir/test_demo.py
Test class: <bound method Node.getparent of <Function test_demo>>

fixture 使用了 request 參數(shù),并通過 request.node 獲取了當前測試用例的相關信息。具體來說,我們打印了當前測試用例的名稱、文件路徑和測試類名稱。

request.config

前運行的配置對象,表示當前 Pytest 的配置信息??梢允褂迷搶ο螳@取命令行參數(shù)、配置文件設置等信息。

pytest.ini

[pytest]
markers =
 ? ?p0: 冒煙
 ? ?p1: 功能
@pytest.fixture
def my_fixture(request):
 ? ?config = request.config
 ? ?print(f"Command line arguments: {config.option}")
 ? ?print(f"INI file options: {config.getini('markers')}")

該 fixture 使用了 request 參數(shù),并通過 request.config 獲取了當前 Pytest 的配置信息。具體來說,我們打印了命令行參數(shù)和配置文件中的一個選項。

request.param

當前 fixture 的參數(shù),表示當前 fixture 的實例所需的參數(shù)值

@pytest.fixture(params=[1, 2, 3])
def my_fixture(request):
 ? ?param_value = request.param
 ? ?print(f"Current parameter value: {param_value}")
 ? ?return param_value

該 fixture 使用了 request 參數(shù),并通過 request.param 獲取了當前實例所需的參數(shù)值。

request.fixturename

返回當前 fixture 的名稱。

@pytest.fixture
def my_fixture(request):
 ? ?fixture_name = request.fixturename
 ? ?print(f"Current fixture name: {fixture_name}")

我們使用 request.fixturename 獲取了當前 fixture 的名稱,并將其打印出來.

request.fixturenames

返回當前測試函數(shù)所使用的所有 fixture 的名稱列表

@pytest.fixture
def my_fixture(request):
 ? ?pass
?
def test_example(my_fixture, request):
 ? ?fixture_names = request.fixturenames
 ? ?print(f"Current fixture name: {fixture_names}")
?

我們使用 request.fixturename s獲取了test_example使用的所有 fixture 的名稱

request.cls

當前測試類的類對象。

class TestClass:
 ? ?@pytest.fixture
 ? ?def my_fixture(self, request):
 ? ? ? ?class_obj = request.cls
 ? ? ? ?print(f"Current class object: {class_obj}")

使用 request.cls 獲取了當前測試類的類對象,并將其打印出來。

request.addfinalizer(finalizer_func)

在 fixture 完成后執(zhí)行指定的函數(shù)。

@pytest.fixture
def my_fixture(request):
 ? ?def finalizer_func():
 ? ? ? ?print("Finalizer function called")
?
 ? ?request.addfinalizer(finalizer_func)
?
 ? ?print("Fixture setup")

我們使用 request.addfinalizer() 方法注冊了一個 finalizer 函數(shù) finalizer_func。該函數(shù)將在 fixture 執(zhí)行完畢后被調用,并打印一條消息。

request.applymarker(marker)

為當前測試用例或 fixture 應用指定的 marker。

@pytest.fixture
def my_fixture(request):
 ? ?request.applymarker(pytest.mark.slow)

我們使用 request.applymarker() 方法為當前 fixture 添加了一個 pytest.mark.slow 的標記。這個標記可以被 Pytest 識別并用于特定的測試運行策略。

request.config.getoption(name)

獲取命令行選項的值。

@pytest.fixture
def my_fixture(request):
 ? ?my_option = request.config.getoption("--my_option")
 ? ?print(f"Value of --my_option: {my_option}")

我們使用 request.config.getoption() 方法獲取了命令行選項 --my_option 的值,并將其打印出來。

request.module

當前測試用例所屬的模塊對象

def my_fixture(request):
 ? ?module_obj = request.module
 ? ?print(f"Current module object: {module_obj}")

我們使用 request.module 獲取了當前測試用例所屬的模塊對象,并將其打印出來

request.param_index

參數(shù)化 fixture 的參數(shù)索引

@pytest.fixture(params=[1, 2, 3])
def my_fixture(request):
 ? ?param_value = request.param
 ? ?param_index = request.param_index
 ? ?print(f"Current parameter value: {param_value}")
 ? ?print(f"Current parameter index: {param_index}")
 ? ?return param_value

我們對帶有參數(shù)的 my_fixture fixture 進行了參數(shù)化。使用 request.param_index 可以獲取當前參數(shù)在參數(shù)列表中的索引,并將其打印出來。

request.keywords

當前測試用例的關鍵字集合

@pytest.fixture
def my_fixture(request):
 ? ?keywords = request.keywords
 ? ?print(f"Current test keywords: pytest?request?fixture個性化測試,pytest?request?fixture")

我們使用 request.keywords 獲取了當前測試用例的關鍵字集合,并將其打印出來

request.getfixturevalue(fixturename)

獲取已注冊的 fixture 對象的值

import pytest
?
@pytest.fixture
def my_fixture():
 ? ?return "Hello, Fixture!"
?
def test_example(request):
 ? ?fixture_value = request.getfixturevalue("my_fixture")
 ? ?assert fixture_value == "Hello, Fixture!"
?

實戰(zhàn)

到這里request fixture的常用屬性和方法應該了解差不多了。更多屬性和方法,可以參考官方文檔。

接下來我們就利用request屬性實現(xiàn)數(shù)據(jù)庫環(huán)境的切換??磳崿F(xiàn)代碼

conftest.py

def pytest_addoption(parser):
 ? ?parser.addoption("--test", action="store_true", help="Run tests in test mode")
?
?
@pytest.fixture(scope="session")
def config_parser(request):
 ? ?class Clazz(object):
 ? ? ? ?config = ConfigParser()
 ? ? ? ?config.read(config_path)
 ? ? ? ?section = 'test' if request.config.getoption("--test") else 'prod'
 ? ? ? ?log.info(f"section: {config.sections()}")
 ? ? ? ?db_host = config.get(section, 'host')
 ? ? ? ?db_port = config.get(section, 'port')
 ? ? ? ?db_username = config.get(section, 'username')
 ? ? ? ?db_password = config.get(section, 'password')
 ? ? ? ?db_database = config.get(section, 'database')
 ? ? ? ?api_url = config.get(section, 'url')
?
 ? ?return Clazz
?
?
@pytest.fixture(scope="session")
def db_connection(config_parser):
 ? ?db_conn = MySQLDB(
 ? ? ? ?config_parser.db_host,
 ? ? ? ?int(config_parser.db_port),
 ? ? ? ?config_parser.db_username,
 ? ? ? ?config_parser.db_password,
 ? ? ? ?config_parser.db_database
 ?  )
?
 ? ?yield db_conn
?
 ? ?db_conn.close()

config_parser 是一個會話級別的 fixture,它返回一個配置解析器對象。這個配置解析器對象可以讀取配置文件,并根據(jù)傳入的命令行參數(shù) --test 來確定讀取哪個配置文件的特定部分(測試環(huán)境或生產環(huán)境)。具體流程如下:

a. 首先,在 pytest_addoption 函數(shù)中,通過調用 parser.addoption() 方法來添加一個命令行選項 --test,它的作用是告訴 pytest 在測試模式下運行。

b. 在 config_parser fixture 中,我們首先創(chuàng)建了一個名為 Clazz 的類,它包含了從配置文件中讀取的各個配置項的值。

c. 根據(jù)傳入的 --test 參數(shù)值,決定使用測試環(huán)境還是生產環(huán)境的配置。如果 --test 參數(shù)被指定,則使用配置文件中的 test 部分,否則使用 prod 部分。

d. 通過 config.get() 方法獲取具體的配置項的值,例如 db_hostdb_port、db_username 等。

e. 最后,將 Clazz 類作為返回值,供其他測試代碼使用。

db_connection 是一個會話級別的 fixture,它返回一個數(shù)據(jù)庫連接對象。這個對象在測試期間可以被使用,并在測試完成后進行關閉。具體流程如下:

a. 在 db_connection fixture 中,我們創(chuàng)建了一個 MySQLDB 對象,將從 config_parser fixture 中獲取的數(shù)據(jù)庫連接參數(shù)傳入。

b. 使用 yield 語句將數(shù)據(jù)庫連接對象返回給測試代碼。yield 使得這個 fixture 可以在測試期間提供數(shù)據(jù)庫連接,而在測試完成后繼續(xù)執(zhí)行下面的代碼。

c. 在 yield 之后的代碼將在測試完成后執(zhí)行,這里使用 db_conn.close() 來關閉數(shù)據(jù)庫連接。

可以看到我們正是使用request.config.getoption這個方法來 獲取命令行選項的值。

這段代碼展示了如何使用 pytest 的 fixture 來管理測試環(huán)境和資源的初始化和清理。通過使用會話級別的 fixture,可以確保在整個測試會話期間只進行一次配置解析和數(shù)據(jù)庫連接操作,避免重復的開銷和不必要的操作。

后續(xù)

到這里我們有攻克了一個知識點request,不僅介紹了它的基本用法,也介紹了筆者在工作中真實使用場景。多加嘗試,才能印象深刻。

到此這篇關于pytest利用request fixture實現(xiàn)個性化測試需求詳解的文章就介紹到這了,更多相關pytest request fixture內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Win/Lin/Mac中Miniconda-Python3.11環(huán)境變量配置詳解

    Win/Lin/Mac中Miniconda-Python3.11環(huán)境變量配置詳解

    本文主要介紹了Miniconda與Python 3.11在三大平臺的環(huán)境變量配置,涵蓋Conda工作流程、跨平臺一致性保障、Jupyter集成及常見問題解決,助你構建穩(wěn)定高效的AI開發(fā)環(huán)境,實現(xiàn)真正可復現(xiàn)的科研與工程實踐,感興趣的可以了解一下
    2026-04-04
  • Python測試線程應用程序過程解析

    Python測試線程應用程序過程解析

    這篇文章主要介紹了Python測試線程應用程序過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-12-12
  • Django中的FBV和CBV用法詳解

    Django中的FBV和CBV用法詳解

    這篇文章主要介紹了Django中的FBV和CBV用法詳解,本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-09-09
  • Python實例一個類背后發(fā)生了什么

    Python實例一個類背后發(fā)生了什么

    Python實例一個類背后發(fā)生了什么,本文為大家一一列出,感興趣的朋友可以參考一下
    2016-02-02
  • Python使用Asyncio進行web編程方法詳解

    Python使用Asyncio進行web編程方法詳解

    這篇文章主要為大家介紹了Python使用Asyncio進行web編程的方法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-08-08
  • python之pymysql模塊簡單應用示例代碼

    python之pymysql模塊簡單應用示例代碼

    這篇文章主要介紹了python之pymysql模塊簡單應用示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-12-12
  • Python  連接字符串(join %)

    Python 連接字符串(join %)

    join 方法用于連接字符串數(shù)組,使用 % 連接多個變量下面看例子
    2008-09-09
  • python游戲實戰(zhàn)項目之智能五子棋簡易版

    python游戲實戰(zhàn)項目之智能五子棋簡易版

    利用Python實現(xiàn)智能五子棋,實現(xiàn)之后發(fā)現(xiàn)我玩不贏它!本篇為你帶來用python編寫的五子棋小游戲,文中給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值
    2021-09-09
  • 零基礎寫python爬蟲之HTTP異常處理

    零基礎寫python爬蟲之HTTP異常處理

    我們在使用爬蟲來抓取網(wǎng)頁內容的時候,HTTP異常是必須要注意的一項,所以本文,我們來詳細探尋一下HTTP異常處理的相關內容,通過一些具體的實例來分析一下,非常的簡單,但是卻很實用。
    2014-11-11
  • Python辦公自動化之網(wǎng)絡監(jiān)控和壓縮文件處理

    Python辦公自動化之網(wǎng)絡監(jiān)控和壓縮文件處理

    Python辦公?動化是利用Python編程語?來創(chuàng)建腳本和程序,以簡化、加速和?動化?常辦公任務和工作流程的過程,本文主要介紹了如何進行網(wǎng)絡監(jiān)控和壓縮文件處理,感興趣的可以了解下
    2023-12-12

最新評論

乌鲁木齐市| 莱阳市| 龙山县| 竹溪县| 高唐县| 永福县| 仁布县| 清流县| 定襄县| 保山市| 永福县| 健康| 龙游县| 成武县| 丹凤县| 衡东县| 华蓥市| 交口县| 永和县| 额济纳旗| 临沧市| 穆棱市| 余姚市| 泗洪县| 松阳县| 沭阳县| 通渭县| 扎鲁特旗| 阳谷县| 通化市| 札达县| 岳池县| 五台县| 若羌县| 余干县| 青铜峡市| 丽江市| 镇江市| 聂荣县| 赞皇县| 颍上县|