測試學習之——Pytest Day2

一、Pytest配置框架

Pytest的配置旨在改變其默認行為,以適應不同的測試需求和項目結構。理解其配置層級和常用參數,是高效使用Pytest的基礎。

1. 配置的意義與層級

配置的本質在于提供一種機制,允許用戶根據項目特點、團隊規范或特定測試場景,調整Pytest的運行方式。Pytest的配置具有多層級性,優先級從低到高依次為:

?默認配置:Pytest內置的默認行為。

?環境變量:以PYTEST_開頭的大寫環境變量,例如PYTEST_ADDOPTS。

?配置文件:pytest.ini、pyproject.toml或setup.cfg等配置文件。

?命令行參數:通過命令行傳遞的參數,優先級最高。

這種層級結構確保了配置的靈活性和可覆蓋性,允許用戶在不同粒度上進行定制。

2. 獲取所有配置信息

要全面了解Pytest支持的所有配置選項,可以通過運行pytest -h命令來獲取幫助信息。該命令會列出所有可用的命令行參數、INI配置選項以及相關的環境變量。

命令:

pytest -h 

結果為:

  • 輸出解析:

?-開頭的選項:通常是命令行參數,用于在執行時直接影響Pytest行為。

?小寫字母開頭的選項:通常是可以在pytest.ini等配置文件中設置的INI配置項。

?大寫字母開頭的選項:通常是環境變量,可以在系統層面或腳本中設置。

3. 常用的命令行參數

命令行參數是臨時調整Pytest行為最直接的方式,它們在當前測試運行中具有最高優先級。

參數

描述

示例用法

備注

-v

增加輸出的詳細程度,顯示每個測試用例的名稱和結果。

pytest -v

適用于需要查看每個測試執行狀態的場景。

-s

停止捕獲標準輸出(stdout)和標準錯誤(stderr),允許測試用例中的print()函數直接輸出到控制臺。

pytest -s

在調試測試用例時非常有用,可以直接看到print的輸出。

-x

遇到第一個失敗的測試用例時立即停止測試執行。

pytest -x

適用于快速定位問題,避免不必要的后續測試。

-m <MARKEXPR>

根據標記表達式篩選要執行的測試用例。

`pytest -m

api|<MARKEXPR>可以是標記名(如api),也可以是邏輯表達式(如'api and web'或'not slow')。 | | -k <EXPR>| 根據表達式篩選測試用例的名稱。 |pytest -k "test_add and not test_list"| 匹配測試函數、方法或類的名稱。 | |--collect-only| 只收集測試用例,不執行。 |pytest --collect-only| 適用于檢查測試發現是否符合預期。 | |--lf/--last-failed| 只運行上次失敗的測試用例。 |pytest --lf| 快速重跑失敗用例,提高調試效率。 | |--ff/--failed-first| 先運行上次失敗的測試用例,然后運行其他測試。 |pytest --ff` | 優先驗證修復效果,同時不遺漏其他測試。 |

示例代碼(結合-s參數):

Python

import pytestdef add(a, b):return a + b# 示例:測試失敗和print輸出
def test_print_and_fail():print("Hello from test_print_and_fail!")assert 1 == 2 # 預期失敗# 示例:測試輸入
def test_input_example():# 當使用 `pytest -s` 時,input() 可以正常工作user_input = input("請輸入您的姓名:")print(f"您輸入的是:{user_input}")assert len(user_input) > 0class TestCalculator:def test_int_addition(self):assert add(1, 2) == 3def test_string_concatenation(self):assert add("hello", "world") == "helloworld"def test_list_concatenation(self):# 列表的加法是拼接操作assert add([1], [2, 3, 4]) == [1, 2, 3, 4]

4. pytest.ini配置文件

pytest.ini是Pytest最常用的配置文件,它允許我們持久化配置選項,例如注冊自定義標記、設置默認命令行參數、配置測試發現規則等。它通常放置在項目的根目錄下。

pytest.ini 示例結構:

[pytest]
# Pytest的最低版本要求
minversion = 6.0# 默認添加到命令行參數的選項
# -s: 允許捕獲print輸出
# -v: 增加輸出詳細程度
# --strict-markers: 強制要求所有使用的標記都必須在markers中注冊
addopts = -s -v --strict-markers# 注冊自定義標記及其描述
markers =api: 標記接口測試用例web: 標記UI(Web)測試用例ut: 標記單元測試用例login: 標記登錄相關測試用例pay: 標記支付相關測試用例ddt: 標記數據驅動測試用例smoke: 標記冒煙測試用例,用于快速驗證核心功能# 配置測試發現規則 (可選)
python_files = test_*.py *_test.py
python_classes = Test*
python_functions = test_# 配置測試路徑 (可選)
# testpaths = tests/# 配置報告輸出 (可選)
# log_cli = true
# log_cli_level = INFO
# log_cli_format = %(asctime)s [%(levelname)s] %(message)s (%(filename)s:%(lineno)s)

說明:

?[pytest]:配置文件的主體部分。

?minversion:指定Pytest的最低版本要求,如果當前Pytest版本低于此值,則會發出警告。

?addopts:用于設置每次運行Pytest時默認添加的命令行選項。這對于團隊協作和CI/CD環境非常有用,可以確保測試運行的一致性。

?markers:這是非常重要的部分,用于注冊自定義標記。在pytest.ini中注冊標記可以避免PytestUnknownMarkWarning警告,并為標記提供清晰的描述,方便團隊成員理解和使用。

二、標記mark

標記 可以讓用例與眾不同,進而可以讓用例被區別對待

(一)、用戶自動義標記

標記是Pytest中一種強大的元數據機制,它允許我們為測試函數、測試方法或測試類附加額外的信息。通過標記,我們可以對測試用例進行分類、篩選,甚至改變它們的執行行為。

1. 用戶自定義標記

用戶自定義標記主要用于對測試用例進行分類和篩選。它們需要在使用前在pytest.ini文件中進行注冊。

步驟:

1、先注冊

[pytest]markers =api:接口測試web:UI測試ut:單元測試login:登錄相關pay:支付相關

2、再標記

實例:

import pytestdef add(a, b):return a + bclass TestAdd:@pytest.mark.apidef test_int(self):assert add(1, 2) == 3@pytest.mark.webdef test_str(self):assert add("1", "2") == "12"@pytest.mark.paydef test_list(self):assert add([1] ,[2,3,4,5]) == [1,2,3,4,5]

3、后篩選

利用命令: pytest -m 參數

實例:

pytest -m web

結果:

(二)、框架內置標記

Pytest提供了一些內置標記,它們無需在pytest.ini中注冊即可直接使用,并且除了篩選功能外,還具有特殊的執行效果。這些標記通常用于控制測試的跳過、預期失敗以及參數化等高級行為。

和用戶自定義的區別

特性

用戶自定義標記

框架內置標記

注冊

必須在pytest.ini中注冊

無需注冊,直接使用

功能

主要用于篩選測試用例

除了篩選,還具有特殊的執行效果(如跳過、預期失敗)

效果

僅影響測試的執行范圍

影響測試的執行結果和報告狀態

1、無需注冊、可以直接使用

2、不僅可以篩選,還可以增加特殊效果

3、不同的標記、增加不同的特殊效果

  • skip:無條件跳過

@pytest.mark.skip裝飾器用于無條件地跳過某個測試函數或測試類。這通常用于標記那些暫時不相關、尚未完成或由于特定原因不應執行的測試。

語法:

@pytest.mark.skip(reason="跳過原因")

示例:

import pytestdef add(a, b):return a + bclass TestSkip:@pytest.mark.skip(reason="此功能正在重構,暫時跳過測試")@pytest.mark.apidef test_old_api_endpoint(self):assert add(1, 2) == 3
  • skipif:有條件跳過

@pytest.mark.skipif裝飾器允許我們根據特定條件來決定是否跳過測試。如果條件為真,則測試被跳過;否則,測試正常執行。這在跨平臺測試、依賴特定環境或版本時非常有用。

語法:

@pytest.mark.skipif(condition, reason="跳過原因")

示例:

import pytest
import sysdef add(a, b):return a + bclass TestSkipIf:@pytest.mark.skipif(sys.version_info < (3, 9), reason="此測試需要Python 3.9或更高版本")@pytest.mark.webdef test_new_python_feature(self):assert add("Python", "3.9+") == "Python3.9+"@pytest.mark.skipif(True, reason="這是一個永遠跳過的示例")@pytest.mark.webdef test_always_skip(self):assert add("a", "b") == "ab"
  • xfail:預期失敗

@pytest.mark.xfail裝飾器用于標記那些我們預期會失敗的測試用例。當一個被標記為xfail的測試實際失敗時,它不會被報告為錯誤,而是顯示為“預期失敗”(xfailed)。如果一個xfail測試意外地通過了,它會被報告為“預期通過”(xpassed)。這對于跟蹤已知bug、尚未修復的功能或正在開發中的特性非常有用。

語法:

@pytest.mark.xfail(condition=None, reason="預期失敗原因", raises=None, run=True, strict=False)

常用參數:

?reason:說明預期失敗的原因。

?raises:指定預期失敗時拋出的異常類型。如果測試失敗但未拋出指定異常,則會被報告為意外通過。

?strict:如果設置為True,當xfail測試意外通過時,Pytest會將其報告為失敗。默認為False。

示例:

import pytestdef divide(a, b):return a / bclass TestXfail:@pytest.mark.xfail(reason="除數為零,預期會拋出ZeroDivisionError")@pytest.mark.paydef test_divide_by_zero_xfail(self):# 預期此操作會引發ZeroDivisionErrorassert divide(10, 0) == 0 # 這個斷言會失敗,但因為xfail而被標記為預期失敗@pytest.mark.xfail(raises=TypeError, reason="預期類型錯誤,例如字符串和數字相加")@pytest.mark.paydef test_type_error_xfail(self):# 預期此操作會引發TypeErrorassert 1 + "a" # 這會引發TypeError@pytest.mark.xfail(strict=True, reason="此功能正在開發中,如果意外通過則視為錯誤")def test_feature_in_progress_xfail(self):# 模擬一個正在開發中且目前預期會失敗的功能assert False # 模擬失敗
  • parametrize:參數化

@pytest.mark.parametrize是Pytest中用于數據驅動測試的核心標記。它允許我們使用不同的數據集重復執行同一個測試函數,從而提高測試的覆蓋率和效率。

語法:

@pytest.mark.parametrize(argnames, argvalues, ids=None, scope=None)

常用參數:

?argnames:一個字符串,包含用逗號分隔的參數名稱。

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

?ids:一個字符串列表,用于為每個參數組合生成更具可讀性的測試ID。

示例:

import pytestdef multiply(a, b):return a * b@pytest.mark.parametrize("num1, num2, expected_result", [(1, 2, 2),(3, 4, 12),(5, 0, 0),(-1, 2, -2),
], ids=["positive_multiplication", "another_positive", "multiply_by_zero", "negative_multiplication"])
def test_multiply_operation(num1, num2, expected_result):assert multiply(num1, num2) == expected_result

一個實例:

import pytestdef add(a, b):return a + bclass TestAdd:@pytest.mark.skip@pytest.mark.apidef test_int(self):assert add(1, 2) == 3@pytest.mark.skipif(1 == 2,reason = "Java太難學了")@pytest.mark.webdef test_str(self):assert add("1", "2") == "12"@pytest.mark.xfail@pytest.mark.paydef test_list(self):assert add([1] ,[2,3,4,5]) == [1,2,3,4,5]@pytest.mark.xfail@pytest.mark.paydef test_list1(self):assert add([1] ,[2,3,4,5]) != [1,2,3,4,5]

結果:

三、數據驅動測試參數

在實際項目中,為了更好地管理和維護測試數據,通常會將測試數據存儲在外部文件中,例如CSV、Excel或JSON格式。Pytest結合參數化(parametrize)功能,可以方便地實現數據驅動測試,即通過外部數據文件來驅動測試用例的執行數量和內容。

我們可以編寫一個輔助函數來讀取這些外部數據,并將其作為@pytest.mark.parametrize裝飾器的參數值(argvalues)。

1. 數據文件示例:data.csv

a, b, c
1, 1, 1
2, 3, 5
3, 3, 6
4, 4, 7

2. 測試代碼示例置文件

@pytest.mark.ddt
@pytest.mark.parametrize("a, b, c",read_csv("data.csv")
)
def test_ddt(self, a, b, c):res = add(int (a),int(b))assert res == int(c)

在上述test_ddt測試用例中,read_csv("data.csv")會讀取data.csv中的每一行數據,并將其作為a、b、c的參數值傳遞給測試函數。每次執行時,a和b會被轉換為整數進行add操作,然后結果與轉換后的c進行斷言。

3. 配置文件:pytest.ini

為了更好地管理自定義標記,例如本例中的ddt標記,建議在pytest.ini文件中進行注冊。這有助于避免Pytest的警告,并提供標記的清晰描述。

[pytest]markers =api:接口測試web:UI測試ut:單元測試login:登錄相關pay:支付相關ddt:數據驅動測試

pytest.ini中注冊ddt標記,我們可以使用pytest -m ddt命令來專門執行所有數據驅動測試用例。

總結

通過本文的詳細闡述,我們深入了解了Pytest的配置機制和強大的標記功能。合理利用命令行參數、pytest.ini配置文件以及各種內置和自定義標記,可以極大地提升測試的組織性、可控性和執行效率。掌握這些高級特性,將幫助您構建更專業、更高效的Python測試實踐。

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

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

相關文章

Go-Redis × RediSearch 全流程實踐

1. 連接 Redis ctx : context.Background()rdb : redis.NewClient(&redis.Options{Addr: "localhost:6379",Password: "",DB: 0,Protocol: 2, // 推薦 RESP2// UnstableResp3: true, // 若要體驗 RESP3 Raw* })2. 準備示例數據 u…

深入理解指針(指針篇2)

在指針篇1我們已經了解了整型指針&#xff0c;當然還有很多其他類型的指針&#xff0c;像字符指針、數組指針、函數指針等&#xff0c;他們都有他們的特別之處&#xff0c;讓我們接著學習。1. 指針類型介紹和應用1.1 字符指針變量字符指針變量類型為char*&#xff0c;一般這樣使…

Python+Selenium自動化爬取攜程動態加載游記

1. 引言 在旅游行業數據分析、輿情監測或競品研究中&#xff0c;獲取攜程等平臺的游記數據具有重要價值。然而&#xff0c;攜程的游記頁面通常采用動態加載&#xff08;Ajax、JavaScript渲染&#xff09;&#xff0c;傳統的**<font style"color:rgb(64, 64, 64);backg…

ESP8266服務器建立TCP連接失敗AT+CIPSTART=“TCP“,“192.168.124.1“,8080 ERROR CLOSED

1.檢查服務器端口8081是否開啟監聽2.檢查路由項是否被防火墻攔截方法 1&#xff1a;使用 netsh查看防火墻規則?netsh advfirewall firewall show rule nameall dirout | findstr "8081"如果無輸出&#xff0c;說明防火墻未針對該端口設置規則&#xff08;可能默認攔…

Linux 內存管理(2):了解內存回收機制

目錄一、透明大頁1.1 原理1.2 透明大頁的三大優勢1.3 透明大頁控制接口詳解1.4 使用場景與最佳實踐1.5 問題排查與監控1.6 與傳統大頁的對比二、Linux伙伴系統水位機制詳解2.1 三種核心水位詳解2.2 水位在伙伴系統中的實現2.3 水位觸發機制的實際行為2.4 水位關鍵操作接口2.5 水…

前端學習7:CSS過渡與動畫--補間動畫 (Transition) vs 關鍵幀動畫 (Animation)

一、補間動畫&#xff08;Tween Animation&#xff09;vs 關鍵幀動畫&#xff08;Keyframe Animation&#xff09;概念對比表&#xff1a;補間動畫 (Transition)關鍵幀動畫 (Animation)定義元素從初始狀態到結束狀態的過渡效果通過定義多個關鍵幀控制動畫的中間狀態觸發方式需要…

PyTorch 損失函數詳解:從理論到實踐

目錄 一、損失函數的基本概念 二、常用損失函數及實現 1. 均方誤差損失&#xff08;MSELoss&#xff09; 2. 平均絕對誤差損失&#xff08;L1Loss/MAELoss&#xff09; 3. 交叉熵損失&#xff08;CrossEntropyLoss&#xff09; 4. 二元交叉熵損失&#xff08;BCELoss&…

MinIO深度解析:從核心特性到Spring Boot實戰集成

在當今數據爆炸的時代&#xff0c;海量非結構化數據的存儲與管理成為企業級應用的關鍵挑戰。傳統文件系統在TB級數據面前捉襟見肘&#xff0c;而昂貴的云存儲服務又讓中小企業望而卻步。MinIO作為一款開源高性能對象存儲解決方案&#xff0c;正以其獨特的技術優勢成為開發者的首…

騰訊云服務上下載docker以及使用Rabbitmq的流程

執行以下命令&#xff0c;添加 Docker 軟件源并配置為騰訊云源。sudo yum-config-manager --add-repohttps://mirrors.cloud.tencent.com/docker-ce/linux/centos/docker-ce.repo sudo sed -i "s/download.docker.com/mirrors.tencentyun.com\/docker-ce/g" /etc/yu…

UE5 一些關于過場動畫sequencer,軌道track的一些Python操作

刪除多余的軌道 import unreal def execute():movie_scene_actors []sequence_assets []data 0.0# 獲取編輯器實用工具庫lib unreal.EditorUtilityLibrary()selected_assets lib.get_selected_assets()for asset in selected_assets:if asset.get_class() unreal.LevelS…

前端性能優化“核武器”:新一代圖片格式(AVIF/WebP)與自動化優化流程實戰

前端性能優化“核武器”&#xff1a;新一代圖片格式(AVIF/WebP)與自動化優化流程實戰 當你的頁面加載時間超過3秒時&#xff0c;用戶的跳出率會飆升到40%以上。而在所有的前端性能優化手段中&#xff0c;圖片優化無疑是投入產出比最高的一環。一張未經優化的巨大圖片&#xff0…

單元測試學習+AI輔助單測

標題單元測試衡量指標具體測試1、Resource2、MockBean3、Test4、Test模板5、單測示例H2數據庫JSON1、使用方式AI輔助單測使用方法單元測試 單元測試一般指程序員在寫好代碼后&#xff0c;提交測試前&#xff0c;需要驗證自己的代碼是否可以正常工作&#xff0c;同時將自己的代…

Spring Cloud Gateway與Envoy Sidecar在微服務請求路由中的架構設計分享

Spring Cloud Gateway與Envoy Sidecar在微服務請求路由中的架構設計分享 在現代微服務架構中&#xff0c;請求路由層承擔著流量分發、安全鑒權、流量控制等多重職責。傳統的單一網關方案往往面臨可擴展性和可維護性挑戰。本文將從真實生產環境出發&#xff0c;分享如何結合Spri…

GitHub Pages+Jekyll 靜態網站搭建(二)

GitHub PagesJekyll 靜態網站搭建&#xff08;二&#xff09;GitHub PagesJekyll 靜態網站搭建&#xff08;二內容簡介搭建模板網站部署工作流程GitHub PagesJekyll 靜態網站搭建&#xff08;二 內容簡介 &#x1f6a9; Tech Contents 該文主要涉及Jekyll主題的下載與使用。Gi…

Django 實戰:I18N 國際化與本地化配置、翻譯與切換一步到位

文章目錄一、國際化與本地化介紹定義相關概念二、安裝配置安裝 gettext配置 settings.py三、使用國際化視圖中使用序列化器和模型中使用四、本地化操作創建或更新消息文件消息文件說明編譯消息文件五、項目實戰一、國際化與本地化介紹 定義 國際化和本地化的目標&#xff0c;…

通過國內扣子(Coze)搭建智能體并接入discord機器人

國內的扣子是無法直接授權給discord的&#xff0c;但是用國外的coze的話&#xff0c;大模型調用太貴&#xff0c;如果想要接入國外的平臺&#xff0c;那就需要通過調用API來實現。 1.搭建智能體&#xff08;以工作流模式為例&#xff09; 首先&#xff0c;我們需要在扣子平臺…

【辦公類-107-02】20250719視頻MP4轉gif(削減MB)

背景需求 最近在寫第五屆智慧項目結題(一共3篇)寫的昏天黑地,日以繼夜。 我自己《基于“AI技術”的幼兒園教學資源開發和運用》提到了AI繪畫、AI視頻和AI編程。 為了更好的展示AI編程的狀態,我在WORD里面插入了MP4轉gif的動圖。 【教學類-75-04】20241023世界名畫-《蒙…

一文講清楚React的render優化,包括shouldComponentUpdate、PureComponent和memo

文章目錄一文講清楚React的render優化&#xff0c;包括shouldComponentUpdate、PureComponent和memo1. React的渲染render機制2. shouldComponentUpdate2.1 先上單組件渲染&#xff0c;驗證state變化2.2 上父子組件&#xff0c;驗證props2. PureComponent2.1 單組件驗證state2.…

物聯網iot、mqtt協議與華為云平臺的綜合實踐(萬字0基礎保姆級教程)

本學期的物聯網技術與應用課程&#xff0c;其結課設計內容包含&#xff1a;mqtt、華為云、PyQT5和MySQL等結合使用&#xff0c;完成了從華為云配置產品信息以及轉發規則&#xff0c;到mqtt命令轉發&#xff0c;再到python編寫邏輯代碼實現相關功能&#xff0c;最后用PyQT5實現面…

使用IntelliJ IDEA和Maven搭建SpringBoot集成Fastjson項目

使用IntelliJ IDEA和Maven搭建SpringBoot集成Fastjson項目 下面我將詳細介紹如何在IntelliJ IDEA中使用Maven搭建一個集成Fastjson的SpringBoot項目&#xff0c;包含完整的環境配置和代碼實現。 一、環境準備 軟件要求 IntelliJ IDEA 2021.x或更高版本JDK 1.8或更高版本&#x…