pytest教程-13-conftest.py文件

上一小節我們學習了fixture的作用域,本小節我們學習一下pytest conftest.py文件的使用方法。

conftest.py文件的作用

conftest.py文件是pytest框架中的一個特殊文件,用于定義共享的設置、夾具(fixture)和鉤子函數(hook)。

在pytest中,conftest.py文件可以用于在整個測試項目中共享夾具、配置和鉤子函數。通過在conftest.py文件中定義夾具,你可以提供測試所需的初始化數據和對象,并使其在測試文件中可用。這樣可以避免在每個測試文件中重復定義夾具,提高代碼的復用性和可維護性。

此外,conftest.py文件也可以定義鉤子函數,用于在測試執行的不同階段插入自定義的行為。通過定義鉤子函數,你可以在測試開始前、測試結束后或其他特定的測試事件發生時執行特定的代碼邏輯。這樣可以擴展和定制pytest的行為,實現特定的測試需求和額外的操作。

當pytest運行時,它會自動搜索項目中的conftest.py文件,并根據其中的定義來加載夾具和鉤子函數。conftest.py文件可以位于項目的根目錄下,也可以位于子目錄中,它們會在對應的作用域內生效。

conftest.py文件的特點

  • conftest.py文件名是固定的,不能修改
  • contest.py文件不需要導入,pytest運行的時候會自動識別該文件
  • conftest.py文件不能被其他文件導入
  • 所有同目錄測試文件運行前都會執行conftest.py文件
  • conftest.py與運行的用例要在同一個pakage下,并且有__init__.py文件
  • conftest.py作用于文件同級目錄和子目錄下的所有測試用例,當有多個conftest.py文件的時候,子目錄的conftest.py文件優先級較高
  • 如果希望fixture(夾具)共享給所有測試,則可以把conftest.py文件放在測試框架的根目錄下。
  • 定義夾具@pytest.fixture的作用域參數scope:session,module,class,function
  • 可以跨.py文件調用,有多個.py文件調用時,可讓conftest.py只調用了一次fixture,或調用多次fixture

conftest.py的使用

夾具(fixture)示例

conftest.py

import pytest@pytest.fixture()
def conftest_fixture():print("fixture前置")yieldprint("fixture后置")

test_demo.py

def test_case(conftest_fixture):print("測試用例")

運行結果

============================= test session starts =============================
collecting ... collected 1 itemtest_demo.py::test_case fixture前置
PASSED                                           [100%]測試用例
fixture后置============================== 1 passed in 0.02s ==============================

鉤子函數(hook)示例

比如在pytest教程-9-pytest-html生成html報告這一小節中,使用鉤子函數來定制html報告就是一個比較好的例子。

conftest.py

# conftest.py
import pytest
from py._xmlgen import html
from datetime import datetime# 1、修改報告標題
def pytest_html_report_title(report):report.title = "我的測試報告標題"# 2、運行測試前修改環境信息
@pytest.hookimpl(optionalhook=True)
def pytest_metadata(metadata: dict):metadata['項目名稱'] = '我的項目'metadata['接口地址'] = "https://www.example.com"# 3、修改摘要信息
def pytest_html_results_summary(prefix, summary, postfix):prefix.extend([html.p("所屬部門: 測試保障部")])prefix.extend([html.p("測試人員: 張三")])# 4、測試結果表格
@pytest.mark.optionalhook
def pytest_html_results_table_header(cells):cells.insert(1, html.th("Description"))  # 表頭添加Descriptioncells.insert(2, html.th("Time", class_="sortable time", col="time"))cells.pop(-1)  # 刪除link@pytest.mark.optionalhook
def pytest_html_results_table_row(report, cells):cells.insert(1, html.td(report.description))  # 表頭對應的內容cells.insert(2, html.td(datetime.now(), class_="col-time"))cells.pop(-1)  # 刪除link@pytest.mark.hookwrapper
def pytest_runtest_makereport(item, call):  # Description取值為用例說明__doc__outcome = yieldreport = outcome.get_result()report.description = str(item.function.__doc__)report.nodeid = report.nodeid.encode("utf-8").decode("unicode_escape")

test_demo.py

import pytestdef fun(x):return x + 1def test_answer_1():"""測試斷言一"""assert fun(3) == 4def test_answer_2():"""測試斷言二"""assert fun(5) == 7@pytest.mark.parametrize("test_input,expected", [("3+5", 8),("2+4", 6),pytest.param("6 * 9", 42, marks=pytest.mark.xfail),pytest.param("6 * 6", 42, marks=pytest.mark.skip)
])
def test_mark(test_input, expected):"""用例集合"""assert eval(test_input) == expected

修改完成,重新執行腳本,查看最終效果。

conftest.py文件作用域

  • 比如在測試框架的根目錄創建conftest.py文件,文件中的Fixture的作用范圍是所有測試模塊。
  • 比如在某個單獨的測試文件夾里創建conftest.py文件,文件中Fixture的作用范圍,就僅局限于該測試文件夾里的測試模塊。
  • 該測試文件夾外的測試模塊,或者該測試文件夾外的測試文件夾,是無法調用到這個conftest.py文件中的Fixture。
  • 如果測試框架的根目錄和子包中都有conftest.py文件,并且這兩個conftest.py文件中都有一個同名的Fixture,實際生效的是測試框架中子包目錄下的conftest.py文件中配置的Fixture。

conftest層級關系

在pytest_demo項目工程下建兩個子項目baidu、blog,并且每個目錄下都放一個conftest.py和init.py(python的每個package必須要有init.py)

pytest_demo是工程名稱├─baidu
│  │  conftest.py
│  │  test_1_baidu.py
│  │  __init__.py
│  
│          
├─blog
│  │  conftest.py
│  │  test_2_blog.py
│  │  __init__.py
│   
│  conftest.py
│  __init__.py


案例分析

pytest_demo工程下conftest.py文件代碼案例

# pytest_demo/conftest.py
import pytest@pytest.fixture(scope="session")
def start():print("\n打開首頁")

baidu目錄下conftest.py和test_1_baidu.py


運行test_1_baidu.py結果可以看出,start和open_baidu是session級別的,只運行一次

============================= test session starts =============================
collecting ... collected 2 itemstest_1_baidu.py::test_01 
打開首頁
打開百度頁面_session
PASSED                                          [ 50%]測試用例test_01test_1_baidu.py::test_02 PASSED                                          [100%]測試用例test_02============================== 2 passed in 0.02s ==============================

blog目錄下conftest.py和test_2_blog.py代碼

# pytest_demo/blog/conftest.py
import pytest@pytest.fixture(scope="function")
def open_blog():print("打開blog頁面_function")# web_conf_py/blog/test_2_blog.pyimport pytestdef test_03(start, open_blog):print("測試用例test_03")assert 1def test_04(start, open_blog):print("測試用例test_04")assert 1def test_05(start, open_baidu):'''跨模塊調用baidu模塊下的conftest'''print("測試用例test_05,跨模塊調用baidu")assert 1if __name__ == "__main__":pytest.main(["-s", "test_2_blog.py"])

運行結果可以看出,start起到全局作用,blog目錄下的open_blog是function級別,每個用例調用一次。
test_05(start, open_baidu)用例不能跨模塊調用baidu模塊下的open_baidu,所以test_05用例會運行失敗

============================= test session starts =============================
collecting ... collected 3 itemstest_2_blog.py::test_03 
打開首頁
打開blog頁面_function
PASSED                                           [ 33%]測試用例test_03test_2_blog.py::test_04 打開blog頁面_function
PASSED                                           [ 66%]測試用例test_04test_2_blog.py::test_05 ERROR                                            [100%]
test setup failed
file D:\PycharmProjects\Source_Code\pytest_demo\blog\test_2_blog.py, line 14def test_05(start, open_baidu):
E       fixture 'open_baidu' not found
>       available fixtures: cache, capfd, capfdbinary, caplog, capsys, capsysbinary, doctest_namespace, extra, extras, include_metadata_in_junit_xml, metadata, monkeypatch, open_blog, pytestconfig, record_property, record_testsuite_property, record_xml_attribute, recwarn, start, tmp_path, tmp_path_factory, tmpdir, tmpdir_factory
>       use 'pytest --fixtures [testpath]' for help on them.D:\PycharmProjects\Source_Code\pytest_demo\blog\test_2_blog.py:14========================= 2 passed, 1 error in 0.03s ==========================

最后感謝每一個認真閱讀我文章的人,禮尚往來總是要有的,雖然不是什么很值錢的東西,如果你用得到的話可以直接拿走,希望可以幫助到大家!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/713636.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/713636.shtml
英文地址,請注明出處:http://en.pswp.cn/news/713636.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

2.模擬問題——2.使用二維數組輸出圖形

用二維數組描述圖形 首先要計算出整個輸出的方框大小&#xff0c;從而判定相應關鍵循環點 #include <cstdio> char arr[1000][3000]; int main() {int h;//初始化&#xff0c;全部內部填空格while(scanf("%d",&h) ! EOF){for (int i 0; i < h; i) {f…

HTML---表單驗證

文章目錄 目錄 本章目標 一.表單驗證概述 二.表單選擇器 屬性過濾選擇器 三.表單驗證 表單驗證的方法 總結 本章目標 掌握String對象的用法會使用表單選擇器的選擇頁面元素會使用JQuery事件進行表單驗證Ajax的概念和作用 一.表單驗證概述 前端中的表單驗證是在用戶提交表…

圖神經網絡導論 - 劉知遠

一、神經網絡基礎 近年來&#xff0c;機器學習領域的發展迅速&#xff0c;主要表現在多種神經網絡架構的出現。盡管不同的神經網絡架構相差甚遠&#xff0c;但現有的神經網絡架構可以分為幾個類別&#xff1a; 卷積神經網路是前饋神經網路的特殊形式&#xff0c;FNN通常是全…

什么是VR虛擬現實|虛擬科技博物館|VR設備購買

虛擬現實&#xff08;Virtual Reality&#xff0c;簡稱VR&#xff09;是一種通過計算機技術模擬出的一種全新的人機交互方式。它可以通過專門的設備&#xff08;如頭戴式顯示器&#xff09;將用戶帶入一個計算機生成的虛擬環境之中&#xff0c;使用戶能夠與這個虛擬環境進行交互…

Spring Boot文檔目錄

目錄 官方文檔 說明&#xff1a;本文檔翻譯的版本&#xff1a;2.7.18-SNAPSHOT。 1. 法規&#xff08;Legal&#xff09; 2. 獲取幫助&#xff08;Getting Help&#xff09; 3. 文檔概述&#xff08;Documentation Overview&#xff09; 4. 開始使用&#xff08;Getting Sta…

BUUCTF---另外一個世界1

1.這是一道雜項題&#xff0c;也是我覺得最值得記錄的一道題。 2.話不多說&#xff0c;題目描述&#xff08;真的是另一個世界&#xff09; 3.下載附件&#xff0c;是一張圖片 4.嘗試了查看屬性&#xff0c;以及在記事本中打開看看有沒有什么有用的信息&#xff0c;發現沒什么…

FaceBook獲取廣告數據

1、訪問 廣告管理工具 確認自己登陸的賬號下面能看到戶。 ? 2、使用 圖譜Api探索工具 生成用戶短期口令 ? 3、get請求(或者瀏覽器直接打開)訪問&#xff1a; https://graph.facebook.com/v19.0/me?fieldsid,name, email&access_token{上一步生成的口令} ? 4、短期…

c# 獲取源碼路徑與當前程序所在路徑

獲取源碼路徑 private static string GetFilePath([CallerFilePath] string path null) {return path;}//當程序所在路徑string str67 System.Environment.CurrentDirectory;//源碼路徑 var path GetFilePath();var directory Path.GetDirectoryName(path);參考

Vue2:用node+express寫一個輕量級的后端服務

1、桌面創建demo文件夾 進入demo&#xff0c;執行如下命令 npm init輸入名稱&#xff1a; test_server然后一路回車 2、安裝express框架 npm i express3、新建server.js 在demo文件夾中&#xff0c;新建server.js const express require(express) const app express()…

2023年12月CCF-GESP編程能力等級認證Scratch圖形化編程三級真題解析

一、單選題(共15題,共30分) 第1題 現代計算機是指電子計算機,它所基于的是( )體系結構。 A:艾倫圖靈 B:馮諾依曼 C:阿塔納索夫 D:埃克特-莫克利 答案:B 第2題 默認小貓角色,執行下列程序,舞臺上會看到? ( ) A: B: C: D: 答案:C

干凈的語料沒有免疫力嗎?

干凈的語料指的是沒有雜音、無污染、無錯誤的語言材料。雖然干凈的語料本身沒有免疫力&#xff0c;但可以提供給機器學習算法或自然語言處理模型&#xff0c;幫助提高其性能和準確性。通過使用干凈的語料&#xff0c;可以降低噪聲干擾&#xff0c;減少模型的誤差&#xff0c;提…

Java類加載器 和 雙親委派【詳解】

一.類加載器&#xff1a; 由JDK提供的&#xff0c;用于加載一些資源文件到JVM內存里的一項技術。主要是加載class文件到內存&#xff0c;也可以加載一些資源文件。 2.JDK提供了三個類加載器&#xff1a; BootstrapClassLoader&#xff1a;引導類加載器&#xff0c; 是c語言編寫…

LightGBM高級教程:高級特征工程

導言 特征工程是機器學習中至關重要的一部分&#xff0c;它直接影響到模型的性能和泛化能力。在LightGBM中進行高級特征工程可以進一步提高模型的效果。本教程將詳細介紹如何在Python中使用LightGBM進行高級特征工程&#xff0c;并提供相應的代碼示例。 1. 特征交叉 特征交叉…

界面控件DevExpress .NET MAUI v23.2新版亮點 - 擁有全新的彩色主題

DevExpress擁有.NET開發需要的所有平臺控件&#xff0c;包含600多個UI控件、報表平臺、DevExpress Dashboard eXpressApp 框架、適用于 Visual Studio的CodeRush等一系列輔助工具。屢獲大獎的軟件開發平臺DevExpress 今年第一個重要版本v23.1正式發布&#xff0c;該版本擁有眾多…

python鏈接數據庫,實現數據增刪改查

要在Python中鏈接數據庫并實現數據的增刪改查&#xff0c;需要使用數據庫的API&#xff08;Application Programming Interface&#xff09;。以下是一個示例&#xff0c;演示如何使用Python的SQLite3模塊連接并操作數據庫&#xff1a; 安裝SQLite3模塊&#xff08;如未安裝&a…

如何克隆樹莓派系統到較小的硬盤/SD卡上(如何分區、設置修復引導)

最近有個老固態硬盤空下來了&#xff0c;雖然寫入速度沒那么快&#xff0c;但是足夠滿足千兆網絡了&#xff0c;所以我就想把現在給樹莓派使用的固態硬盤換下來。由于一些設置很浪費時間&#xff0c;所以我不打算重裝系統。此外這個老固態是 120GB 的&#xff0c;要小于正在使用…

redis實現分布式全局唯一id

目錄 一、前言二、如何通過Redis設計一個分布式全局唯一ID生成工具2.1 使用 Redis 計數器實現2.2 使用 Redis Hash結構實現 三、通過代碼實現分布式全局唯一ID工具3.1 導入依賴配置3.2 配置yml文件3.3 序列化配置3.4 編寫獲取工具3.5 測試獲取工具 四、運行結果 一、前言 在很…

Linux運維_Bash腳本_部署安裝DocBook-XML-4.5(XML-DTD)

Linux運維_Bash腳本_部署安裝DocBook-XML-4.5(XML-DTD) Bash (Bourne Again Shell) 是一個解釋器&#xff0c;負責處理 Unix 系統命令行上的命令。它是由 Brian Fox 編寫的免費軟件&#xff0c;并于 1989 年發布的免費軟件&#xff0c;作為 Sh (Bourne Shell) 的替代品。 您可…

leetcode 熱題 100_最長連續序列

題解一&#xff1a; 哈希表&#xff1a;找連續最長的數字序列&#xff0c;很容易聯想到排序&#xff0c;但排序的時間復雜度O(nlogN)過大&#xff0c;判題容易超時。因此我們需要使用哈希表來快速查找&#xff0c;序列中是否存在與某個數相鄰的數。用HashSet建立哈希表并去重&a…

【Javascript編程實操02】1、判斷一個年份是閏年還是平年 2、找到三個數中最小的數

目錄 前言 1、判斷一個年份是閏年還是平年 原理&#xff1a; 代碼&#xff1a; 實現效果&#xff1a; 2、找到三個數中最小的數 流程圖&#xff1a; 代碼&#xff1a; 實現效果&#xff1a; 總結 前言 本次繼續針對Javascript階段的if...else...的實操練習&#xff0…