測試學習之——Pytest Day4

Pytest作為Python中功能強大且易于使用的測試框架,深受開發者喜愛。它不僅提供了簡潔的測試編寫方式,還通過豐富的配置選項、靈活的標記機制和強大的數據驅動能力,極大地提升了測試效率和可維護性。本文將深入探討Pytest的配置意義與層級、常用命令參數、標記(mark)的使用,以及數據驅動測試的實現方法。

一、Pytest配置:意義、層級與常用參數

Pytest的配置允許我們自定義測試行為,例如指定測試文件發現規則、添加命令行選項、定義fixture等。理解其配置意義和層級對于高效使用Pytest至關重要。

1. 配置意義與層級

Pytest的配置具有層級性,允許在不同粒度上進行設置,從項目級別到測試文件級別。當存在多個配置時,Pytest會按照一定的優先級進行合并和覆蓋。

?全局配置: 通常通過pytest.ini、pyproject.toml或setup.cfg文件在項目根目錄進行配置。這些配置對整個項目的所有測試都有效。

?目錄級配置: 可以在子目錄中放置pytest.ini等配置文件,這些配置僅對當前目錄及其子目錄下的測試文件生效,并會覆蓋全局配置中的同名設置。

?模塊/文件級配置: 在測試文件中,可以通過pytest.mark等裝飾器對單個測試函數或類進行更細粒度的配置。

?命令行參數: 命令行參數具有最高的優先級,會覆蓋所有文件中的配置。

2. 常用命令參數

Pytest提供了豐富的命令行參數,用于控制測試的執行行為。以下是一些常用的參數:

?-v:顯示更詳細的測試結果(verbose)。

?-s:允許捕獲標準輸出(stdout)和標準錯誤(stderr),通常用于打印調試信息。

?-x:遇到第一個失敗的測試時立即停止測試。

?--lf (--last-failed):只運行上次失敗的測試。

?--ff (--failed-first):先運行上次失敗的測試,然后運行所有其他測試。

?-k <expression>:根據名稱表達式選擇要運行的測試。例如,-k "keyword and not another_keyword"。

?-m <marker_expression>:根據標記表達式選擇要運行的測試。例如,-m "web and not slow"。

?--collect-only:只收集測試,不執行。

?--maxfail=<num>:在達到指定數量的失敗后停止測試。

?--html=<path>:生成HTML格式的測試報告(需要安裝pytest-html插件)。

?--alluredir=<path>:指定Allure報告結果的輸出目錄(需要安裝allure-pytest插件)。

示例:命令行執行

pytest -v -s my_test_file.py pytest -m "smoke" pytest --alluredir=./allure-results

3. 配置文件:pytest.ini

pytest.ini是Pytest最常用的配置文件,它允許我們將常用的命令行參數、標記注冊、測試發現規則等固化到文件中,避免每次都在命令行中輸入。一個典型的pytest.ini文件可能包含以下內容:

# pytest.ini
[pytest]
# 添加默認的命令行參數
addopts = -vs --strict-markers# 注冊自定義標記,避免出現Unknown marker警告
markers =smoke: 冒煙測試regression: 回歸測試web: Web自動化測試# 配置測試文件和目錄的發現規則
python_files = test_*.py *_test.py
python_classes = Test*
python_functions = test_# 配置測試路徑,只在指定路徑下查找測試
testpaths =tests/e2e_tests/# 配置allure報告輸出目錄(如果使用allure)
# addopts = --alluredir=./allure-results --clean-alluredir

配置說明:

?addopts:用于設置默認的命令行參數,每次運行pytest時都會自動加上這些參數。

?markers:用于注冊自定義的測試標記。注冊后,Pytest就不會對這些標記發出“Unknown marker”警告。

?python_files、python_classes、python_functions:定義Pytest如何發現測試文件、測試類和測試函數。

?testpaths:指定Pytest應該在哪些目錄下查找測試文件。

二、標記(Mark):用戶自定義與框架內置

Pytest的標記(pytest.mark)是一個強大的功能,它允許我們對測試函數、測試類甚至模塊進行分類和篩選。通過標記,我們可以靈活地選擇性執行特定類型的測試,例如只運行冒煙測試、跳過某些測試等。

1. 用戶自定義標記步驟

自定義標記的步驟非常簡單:

1.在測試代碼中使用@pytest.mark.<marker_name>裝飾器: 將標記應用到測試函數或類上。

2.在pytest.ini中注冊標記(可選但推薦): 在pytest.ini文件的[pytest]部分添加markers選項,注冊自定義標記。這可以避免Pytest在運行時發出“Unknown marker”警告,并提供標記的描述。

3.通過命令行執行帶有特定標記的測試: 使用-m參數加上標記表達式來運行測試。

示例:自定義標記

# test_example.py
import pytest@pytest.mark.smoke
def test_login_success():assert True@pytest.mark.regression
@pytest.mark.slow
def test_complex_calculation():assert True@pytest.mark.web
def test_homepage_load():assert True

pytest.ini配置:

# pytest.ini
[pytest]
markers =smoke: 冒煙測試regression: 回歸測試slow: 運行緩慢的測試web: Web自動化測試

?Web自動化測試

執行命令:

# 運行所有冒煙測試
pytest -m smoke# 運行所有回歸測試,但不包括慢速測試
pytest -m "regression and not slow"# 運行所有web測試
pytest -m web

2. 框架內置標記

Pytest也提供了一些內置的標記,用于處理常見的測試場景:

?@pytest.mark.skip:無條件跳過測試。可以提供一個reason參數說明跳過的原因。

?@pytest.mark.skipif(condition, reason):根據條件跳過測試。當condition為True時跳過。

?@pytest.mark.xfail(condition, reason, raises):預期失敗的測試。即使測試失敗,也不會計入失敗總數,而是標記為“xfailed”。

?@pytest.mark.parametrize(argnames, argvalues):用于數據驅動測試,將在下一節詳細介紹。

三、Pytest的數據驅動測試:parametrize實現

數據驅動測試(Data-Driven Testing)是一種測試方法,它將測試邏輯與測試數據分離。通過使用不同的測試數據重復執行相同的測試邏輯,可以有效地增加測試覆蓋率并減少代碼冗余。Pytest通過@pytest.mark.parametrize裝飾器提供了強大的數據驅動能力。

1. parametrize的基本用法

@pytest.mark.parametrize裝飾器接受兩個主要參數:

?argnames:一個字符串,包含用逗號分隔的參數名稱。這些參數將作為測試函數的參數傳入。

?argvalues:一個列表,包含參數值的元組或列表。每個元組/列表對應一次測試執行的參數組合。

示例:單個參數的數據驅動

# test_data_driven.py
import pytest@pytest.mark.parametrize("input_value, expected_output", [(1, 2),(2, 3),(3, 4),
])
def test_increment(input_value, expected_output):assert input_value + 1 == expected_output

在這個例子中,test_increment函數會被執行三次,每次傳入不同的input_value和expected_output。

2. 多個參數的數據驅動

parametrize可以很方便地處理多個參數的組合。

示例:多個參數的數據驅動

# test_data_driven.py
import pytest@pytest.mark.parametrize("num1, num2, expected_sum", [(1, 2, 3),(0, 0, 0),(-1, 5, 4),(10, -3, 7),
])
def test_addition(num1, num2, expected_sum):assert num1 + num2 == expected_sum

3. parametrize與fixture結合

parametrize還可以與fixture結合使用,為每個參數組合提供不同的fixture實例。

示例:parametrize與fixture結合

# conftest.py
import pytest@pytest.fixture
def setup_data(request):# request.param 會獲取到parametrize傳入的參數data = request.param * 2yield data# test_data_driven.py
import pytest@pytest.mark.parametrize("setup_data", [1, 2, 3], indirect=True)
def test_with_fixture_data(setup_data):# setup_data 會依次是 2, 4, 6assert setup_data % 2 == 0

在@pytest.mark.parametrize中設置indirect=True,表示setup_data不是直接作為參數傳入,而是作為fixture的名稱,Pytest會為每個參數值調用setup_data fixture。

4. 從外部文件加載數據

對于大量的測試數據,通常會將其存儲在外部文件(如CSV、JSON、YAML)中,然后動態加載。這里以YAML為例,結合之前提到的PyYAML庫。

data.yaml文件:

# data.yaml
- test_case:id: 1input: 10expected: 20
- test_case:id: 2input: 0expected: 0
- test_case:id: 3input: -5expected: -10

test_from_file.py文件:

import pytest
import yamldef load_test_data(file_path):with open(file_path, 'r', encoding='utf-8') as f:return yaml.safe_load(f)@pytest.mark.parametrize("test_data", load_test_data('data.yaml'))
def test_multiply_by_two(test_data):input_value = test_data['test_case']['input']expected_output = test_data['test_case']['expected']assert input_value * 2 == expected_output

這種方式使得測試數據與測試邏輯完全分離,便于數據的管理和維護。

總結

Pytest通過其靈活的配置機制、強大的標記功能和便捷的數據驅動能力,為Python項目的測試提供了全面的支持。合理利用pytest.ini進行項目級配置,通過@pytest.mark對測試進行分類和篩選,以及運用@pytest.mark.parametrize實現數據驅動測試,都能夠顯著提升測試的效率、可讀性和可維護性。掌握這些進階用法,將幫助您構建更加健壯和高效的自動化測試體系。

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

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

相關文章

【軟件系統架構】系列七:系統性能——路由器性能深入解析

目錄 一、路由器的核心功能 二、路由器性能核心指標 1. 吞吐量&#xff08;Throughput&#xff09; 2. 并發連接數&#xff08;Session Capacity&#xff09; 3. 每秒連接數&#xff08;CPS&#xff0c;Connections Per Second&#xff09; 4. 轉發延遲&#xff08;Laten…

【數據結構】第一講 —— 概論

【數據結構】第一講 —— 概論 文章目錄【數據結構】第一講 —— 概論1.1 基本概念和常用術語1.2 了解數據結構1. 數據結構2. 數據的邏輯結構3. 數據的物理結構&#xff08;存儲結構&#xff09;4. 數據的運算1.3 算法的描述和分析1.3.1 算法的描述1.3.21.1 基本概念和常用術語…

全面解析MySQL(2)——CRUD基礎

1.CreateCreate(創建)&#xff1a;添加新數據到數據庫中#基礎語法 insert into table_name (column1,column2,column3, ...) values (value1,value2,value3, ...);1.1 單行全列插入value中值的數量和順序必須和column?致describe demo1; -----------------------------------…

某外企筆試總結——純C語言

這里寫自定義目錄標題一、sizeof 計算&#xff08;32位環境&#xff09;二、簡答題三、數據存儲區域與可修改性四、字符串比較輸出及原因五、數組指針運算輸出六、字符串倒序代碼錯誤排查七、下面程序可以把1維數組轉為2維數組&#xff0c;然后調用 printArr2D 打印出數組內容&…

Qt Graphs 模塊擬取代 charts 和 data visualization還有很長的路要走

近期關注 Qt 6.10 的分支進展&#xff0c; 發現了 Qt 6.10 的 charts 和 data visualization &#xff08;以下簡稱 DV&#xff09;已經被deprecated, 功能將會合并到 graphs 模塊。如果后面 charts\ DV 被棄用&#xff0c;那算是很大的API變化了。從Qt 6.5 以后開始引入的 gra…

2025牛客暑期多校訓練營2(部分補題)

題目鏈接&#xff1a;牛客競賽_ACM/NOI/CSP/CCPC/ICPC算法編程高難度練習賽_牛客競賽OJ B Bitwise Perfect 思路 考慮到由&#xff0c;那么只有變小的時候對答案的貢獻才能夠減少&#xff0c;從二進制的角度考慮什么時候變小&#xff0c;只有min(x,y)中的最高位1異或之后變…

Nginx的location匹配規則

Nginx的location匹配規則 為什么你的Nginx配置總是不生效&#xff1f; 改了Nginx配置無數次&#xff0c;reload命令執行了幾十遍&#xff0c;瀏覽器訪問時卻依然返回404&#xff1f;運維工程師小張上周就遇到了這個問題&#xff1a;明明配置了location /static/ { root /var/ww…

USB 2.0 vs USB 3.0:全面技術對比與選擇指南

USB 2.0 vs USB 3.0&#xff1a;全面技術對比與選擇指南 引言 在當今數字時代&#xff0c;USB接口已成為連接設備與計算機的最普遍標準之一。從2000年USB 2.0的發布到2008年USB 3.0的問世&#xff0c;USB技術經歷了顯著的演進。本文將深入比較這兩種廣泛使用的USB標準&#xff…

DApp架構設計與開發流程指南

目錄 DApp架構設計與開發流程指南 引言:DApp的核心特性 一、DApp架構設計 1.1 分層架構設計 各層核心組件: 1.2 典型架構模式 1.2.1 全去中心化架構 1.2.2 混合架構(推薦) 二、開發流程 2.1 敏捷開發流程 2.2 詳細開發階段 階段1:需求分析與設計(1-2周) 階段2:智能合約…

Windows下odbc配置連接SQL Server

一、查看SQL Server服務是否啟動打開SQL Server 2022配置管理器查看SQL Server運行狀態&#xff0c;可以設置 啟動或停止服務二、windows下如何配置ODBC數據源1、Windows搜索欄中輸入“ODBC數據源管理器”并選擇“以管理員身份運行”來打開它2、添加新的數據源ODBC數據源管理器…

MySQL—表設計和聚合函數以及正則表達式

文章目錄一、第一范式&#xff08;原子性&#xff09;二、第二范式&#xff08;消除部分依賴&#xff09;三、第三范式&#xff08;消除傳遞依賴&#xff09;四、表設計五、聚合函數六、正則表達式MySQL 的三大范式&#xff08;1NF、2NF、3NF&#xff09;是關系型數據庫設計的核…

基于Electron打包jar成Windows應用程序

基于Electron打包jar成Windows應用程序簡介注意編譯及命令&#xff1a;運行效果登錄界面用戶管理界面界面全屏鎖屏界面文檔查看界面簡介 本文介紹了一種將maven jar包打包成Windows下EXE可執行程序的方法。 Maven打包Java Web應用成jar&#xff0c;Electron封裝jar成Windows …

Autosar RTE實現觀測量生成-基于ETAS軟件

文章目錄前言觀測量定義arTypedPerInstanceMemoryPorts Measurable工具鏈配置及使用Port中的配置arTypedPerInstanceMemory觀測量生成文件分析總結前言 之前我們在XCP中&#xff0c;對于標定量和觀測量并沒有嚴格按照Autosar標準中定義&#xff0c;Autosar RTE中對標定量和觀測…

【REACT18.x】creat-react-app在添加eslint時報錯Environment key “jest/globals“ is unknown

今天在創建新項目的時候&#xff0c;給cra創建的項目添加eslint支持&#xff0c;出現如下報錯 添加eslint npx eslint --init頁面報錯 Compiled with problems:ERROR [eslint] package.json eslint-config-react-app/jest#overrides[0]:Environment key "jest/globals&…

Linux的例行性工作 -- (練習)

1、atd和crond兩個任務管理程序的區別 答&#xff1a; atd 專為一次性任務設計&#xff0c;允許用戶在特定未來時間點&#xff08;絕對或相對時間&#xff09;執行單次命令后就結束。 crond 則是周期性任務的調度核心&#xff0c;通過配置文件&#xff08;crontab&#xff09;實…

《Java語言程序設計》1.6 復習題

1.6.1 什么是Java語言規范?計算機有嚴格的使用規則。如果編寫程序時沒有遵循這些規則&#xff0c;計算機就不能理解程序。Java語言規范和Java API定義了Java的標準。Java語言規范(Java language specification)是對Java程序設計語言的語法和語義的技術定義。應用程序接口(Appl…

【機器學習深度學習】什么是量化?

目錄 前言 一、量化的基本概念 1.1 量化對比示例 1.2 量化是如何實現的&#xff1f; 二、為什么要進行量化&#xff1f; 2.1 解決模型體積過大問題 2.2 降低對算力的依賴 2.3 加速模型訓練和推理 2.4 優化訓練過程 2.5 降低部署成本 小結&#xff1a;量化的應用場…

告別 T+1!解密金融級實時數據平臺的構建與實踐

在數字金融浪潮下&#xff0c;數據處理的“實時性”已不再是加分項&#xff0c;而是逐漸成為決定業務價值的核心競爭力。然而&#xff0c;金融機構在追求實時的道路上&#xff0c;往往陷入一個新的困境&#xff1a;實時分析系統與離線大數據平臺形成了兩套獨立的“煙囪”&#…

[Python] -項目實戰7- 用Python和Tkinter做一個圖形界面小游戲

一、為什么從小游戲入門GUI? 趣味性強:小游戲直觀、有趣,一學就上手。 系統掌握事件驅動:了解按鈕點擊、鍵盤響應、圖形刷新機制。 扎實基礎:為日后構建更復雜應用奠定 GUI 編程基礎。 二、選定游戲:猜數字小游戲 ?? 這個小游戲界面簡單,核心機制是:3 個按鈕分別…

【18】MFC入門到精通——MFC(VS2019)+ OpenCV 顯示圖片的3種方法

MFC (VS2019)+ OpenCV,顯示圖片的3種方法 1 方法介紹 2 方法一:嵌套OpenCV窗口顯示圖片 2.1 建立供工程 添加控件 2.2 引用頭文件 2.3 找到OnInitDialog()函數,在其中添加如下代碼 2.4 在button觸發函數中加入代碼(就是你雙擊button進入的函數) 2.5 注意事項 3 方法二:…