【接口自動化測試】---自動化框架pytest

目錄

1、用例運行規則

2、pytest命令參數

3、pytest配置文件

4、前后置

5、斷言

6、參數化---對函數的參數(重要)

7、fixture

7.1、基本用法

7.2、fixture嵌套:

7.3、請求多個fixture:

7.4、yield fixture

7.5、帶參數的fixture


安裝:

pip install pytest==8.3.2

1、用例運行規則

? ?文件名、類名、方法名命名時必須遵循規則,pytest才能自動識別到測試用例,不需要再手動編寫main函數調用測試用例。?

寫一個類:

class Test03():def test03_01(self):print("test03_01")

Test類中為什么不能有__init__方法?

1、pytest采用自動發現機制收集測試用例

2、它會自動實例化測試類并調用test測試方法作為測試用例。

如果寫了__init__那么在pytest實例化類的時候,__init__方法就會被調用,這就會掩蓋測試類的實際測試用例

那么,我們在初始化的時候應該怎么做呢?

class test02:#python默認構造方法---類的初始化def __init__(self):print("__init__")#類中的普通方法def init(self)print("init")

2、pytest命令參數

pytest -sv .\tests\test_aaa.py::Testaaa::testa_03:指定運行tests目錄下的test_aaa.py文件中的Testaaa類中的teata_03方法

3、pytest配置文件

pytest.ini ?件通常位于項?的根?錄下。通過在 pytest.ini 中定義配置項,可以覆蓋
pytest 的默認?為,以滿?項?的需求。
在當前項?下創建 pytest.ini ?件,該?件為 pytest 的配置?件,以下為常?的配置選項:

若不配置,則走默認規則。加了配置之后,就可以使用pytest執行不符合規則的文件名、類名、方法名了。

4、前后置

在測試類中,不能有init方法。那我們有初始化的需求該怎么辦呢?

pytest框架提供了三種方法做前后置操作


1、setup_method 和 teardown_method:這兩個方法用于類中的每個測試方法的前后置操作(setup_method 法一?teardown_method、setup_method 法二?teardown_method)

2、setup_class和teardown_class:兩個方法用于整個測試類的前后置操作

(setup_clas 法一 teardown_class、 setup_clas 法二 teardown_class)

3、fixture:這是pytest推薦的方式來實現測試用例的前后置操作。這個方法更加靈活,后面專門進行講解

5、斷言

斷言時調試的輔助工具,檢查代碼狀態是否符合預期,如果斷言失敗,即條件為假,就會拋出AssertionError異常。??

對返回值內容進行測試。

assert 條件,錯誤信息

條件:必須是bool值

錯誤信息:當條件為假時顯示,可選。

#斷?接?返回值重要字段
def test2():
url = "http://jsonplaceholder.typicode.com/comments?postId=1"
r = requests.get(url=url)
print(r.json())
assert r.json()[1]['id'] == 1 #下標從0開始
#斷?接?html返回值
def test3():
url = "http://jsonplaceholder.typicode.com/"
r = requests.get(url=url) #r是返回值  
assert "Use your own data" in r.text #前面的字符串是不是包含在r.text中
#html返回值是text格式的

6、參數化---對函數的參數(重要)

對測試函數的參數進行參數化,使用pytest內置的pytest.mark.parametrize裝飾器

對單個參數的參數化:可以使用不同的數據類型

eg1:在用例上使用參數化:多個參數的參數化

import pytest@pytest.mark.parametrize("test_input,expected",[("3+5",8),("2+4",6),("6*9",54)])def test_eval(test_input,expected):assert eval(test_input) == expected
#通過eval進行計算

給了三組參數,函數就會執行三次

eg2:在類上使用參數化:在類上使用就可以使用參數集調用多個函數

用例可能用到同樣的參數,就要對多組用例都使用參數化,那么把參數化定義在類上就是更好的方式。下面的每個用例都會跑兩遍。

import pytest
@pytest.mark.parametrize("n,expected", [(1, 2), (3, 4)])class TestClass:
def test_simple_case(self, n, expected):
assert n + 1 == expecte
def test_weird_simple_case(self, n, expected):
assert (n * 1) + 1 == expected

將參數化的結果保存在pytestmark中 表明是一個全局變量,不寫pytestmark的時候就要在每個類前面寫@pytest.mark.parametrize(.......)

#將參數化的結果保存在pytestmark中 表明是一個全局變量
pytestmark = pytest.mark.parametrize("data",(1,2))
class Test_A:def test_a01(self,data):print(data)def test_a02(self,data):print("data")
class Test_B:def test_b01(self,data):print(data)def test_b02(self,data):print("data")

注意我們在使用pytest的時候,import pytest會在語法層面出現報錯,但是實際包是可以找到的,也意味著可以直接使用

自定義參數化數據源,而不是寫死的。

#從函數的返回值來獲取參數
def data_provider():#....return ["a","b","c"]
@pytest.mark.parametrize("data",data_provider())
def test_data(data):print(data)

7、fixture

7.1、基本用法

可以進行前后置操作,也可以進行參數化。?于提供測試函數所需的資源或上下?

import pytest@pytest.fixture
def fixture_01():print("第?個fixture標記的?法")def test_01(fixture_01):print("第?個測試?例")

測試腳本中存在很多重復的代碼、公共的數據對象,使用fixture最為合適。

用例之前必須要先進行登錄:

import pytest@pytest.fixture
def login():print("---執?登陸操作-----")def test_list(login):print("---訪問列表?")
def test_detail(login):print("---訪問詳情?")

7.2、fixture嵌套:

import pytest@pytest.fixture
def first_entry():return "a"@pytest.fixture
def order(first_entry):return [first_entry]def test_string(order):order.append("b")assert order == ["a", "b"] # 斷?

7.3、請求多個fixture:

import pytestclass Fruit:
def __init__(self, name):self.name = name
def __eq__(self, other): #重寫的比較方法 在比較兩個Fruit對象是否相等時被調用return self.name == other.name@pytest.fixture
def my_fruit():return Fruit("apple") #類對象 就會調用Fruit類里面的初始化函數@pytest.fixture
def fruit_basket(my_fruit):return [Fruit("banana"), my_fruit] #類對象放在列表里面def test_my_fruit_in_basket(my_fruit, fruit_basket):assert my_fruit in fruit_basket  #這里是在比較兩個類對象 調用__eq__方法

上面的在測試方法中傳入函數名作為參數時,會先執行傳入的函數,這就實現了前置。那么后置怎么實現呢?

7.4、yield fixture

@pytest.fixture
def operator():print("前置操作:數據的初始化")yieldprint("后置操作:數據的清理")def test_01(operator):print("第一個測試用例")

由結果可以看出,先執行operator中yield之前的部分,再執行調用operator的函數,執行完函數再執行yield的后半部分,就完成了前后置操作。和前面介紹的setup_method和teardown_method效果一樣

yield可以返回數據。那么可以看出,是先執行前部分+yield,再執行測試用例,再執行后部分

@pytest.fixture
def operator():print("數據的初始化")yield 100print("數據的清理")
def test_01(operator):print(100 + operator)

文件:打開——讀模式:讀文件、寫模式:寫文件——關閉

@pytest.fixture
def file_read():print("打開文件句柄")fo = open("case/test.txt","r",encoding="utf-8")yield foprint("關閉文件句柄")fo.close()@pytest.fixture
def file_write():print("打開文件句柄")fo = open("case/test.txt","w",encoding="utf-8")return fo# yield fo# print("關閉文件句柄")# fo.close()def test_file(file_read,file_write):w = file_writew.write("我們")w.close()r = file_readstr = r.read()print(str)

7.5、帶參數的fixture

pytest.fixture(scope='', autouse='',params='',ids='',name='')

1、scope:控制fixture的作用范圍,決定了fixture的生命周期

? ? ? ? 1)funtion(默認)

? ? ? ? 2)class:在同一個測試類中共享(類中的第一個測試函數調用fixture函數的前部分,最后一個函數調用后部分、如果有第二個類的話和第一個類相同)---(初始化--第一個用例、第二個用例---清理--初始化---第一個用例、第二個用例--清理)

? ? ? ? 3)module:在同一個測試模塊中共享這個fixture(一個文件里)(要加一個conftest.py文件)----(一個文件中有兩個類,只會在第一個類之前執行初始化,在第二個類之后執行清理)---(初始化--第一個用例、第二個用例--第一個用例、第二個用例--清除)(同一個文件中的

? ? ? ? 4)session:整個測試會話中共享這個fixture初始化--第一個用例、第二個用例--第一個用例、第二個用例--清除)---將cnftest.py文件涉及到的所有的文件整合到一起

2、autouse:默認值為false。設置為ture時,就不需要進行顯示傳遞

3、params:用于參數化fixture,支持列表傳入。每個參數都會使fixture執行一次。

4、ids:與params配合使用,給參數取名字

5、name:給fixture取名字

當測試用例在不同的文件里時,需要將fixture放到配置文件里,實現多個文件共享。

scope = "moudle"、scope = "session"時可用于實現全局的前后置應用,這里需要多一個文件配合,conftest.py和@pytest.fixture結合使用實現全局變量的前后置應用

conftest.py名稱時固定的不能改變

每個conftest.py文件都會對其所在的目錄及其子目錄下的測試模塊生效

在不同模塊的測試中需要用到conftest.py的前后置功能時,不需要做任何的import導入操作。

可以在不同的.py文件中使用同一個fixture文件

scope = "moudle"、scope = "session"區別:module每個都進行初始化和清理,session第一個進行初始化,最后一個進行清理

params實現參數化和@pytest.mark.parametrize實現參數化的區別:

parametrize更適合簡單場景,而fixture更適合需要動態數據和資源的復雜場景。

@pytest.mark.parametrize("參數名",(參數1,參數2)

測試函數

@pytest.fixture(params=[1,2,3])
def data_provider(request): #fixture標記的參數里面參數叫做requestreturn request.param #通過request讀取paramsdef test_data(data_provider):print(data_provider)

注意:要寫為request.param而不是request.params

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

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

相關文章

Flink Stream API 源碼走讀 - socketTextStream

概述 本文深入分析了 Flink 中 socketTextStream() 方法的源碼實現,從用戶API調用到最終返回 DataStream 的完整流程。 核心知識點 1. socketTextStream 方法重載鏈 // 用戶調用入口 env.socketTextStream("hostname", 9999)↓ 補充分隔符參數 env.socket…

待辦事項小程序開發

1. 項目規劃功能需求:添加待辦事項標記完成/未完成刪除待辦事項分類或標簽管理(可選)數據持久化(本地存儲)2. 實現功能添加待辦事項:監聽輸入框和按鈕事件,將輸入內容添加到列表。 標記完成/未完…

【C#】Region、Exclude的用法

在 C# 中,Region 和 Exclude 是與圖形編程相關的概念,通常在使用 System.Drawing 命名空間進行 GDI 繪圖時出現。它們主要用于定義和操作二維空間中的區域(幾何區域),常用于窗體裁剪、控件重繪、圖形繪制優化等場景。 …

機器學習 - Kaggle項目實踐(3)Digit Recognizer 手寫數字識別

Digit Recognizer | Kaggle 題面 Digit Recognizer-CNN | Kaggle 下面代碼的kaggle版本 使用CNN進行手寫數字識別 學習到了網絡搭建手法學習率退火數據增廣 提高訓練效果。 使用混淆矩陣 以及對分類出錯概率最大的例子單獨拎出來分析。 最終以99.546%正確率 排在 86/1035 …

新手如何高效運營亞馬遜跨境電商:從傳統SP廣告到DeepBI智能策略

"為什么我的廣告點擊量很高但訂單轉化率卻很低?""如何避免新品期廣告預算被大詞消耗殆盡?""為什么手動調整關鍵詞和出價總是慢市場半拍?""競品ASIN投放到底該怎么做才有效?""有沒有…

【論文閱讀 | CVPR 2024 | UniRGB-IR:通過適配器調優實現可見光-紅外語義任務的統一框架】

論文閱讀 | CVPR 2024 | UniRGB-IR:通過適配器調優實現可見光-紅外語義任務的統一框架?1&&2. 摘要&&引言3.方法3.1 整體架構3.2 多模態特征池3.3 補充特征注入器3.4 適配器調優范式4 實驗4.1 RGB-IR 目標檢測4.2 RGB-IR 語義分割4.3 RGB-IR 顯著目…

Hyperf 百度翻譯接口實現方案

保留 HTML/XML 標簽結構,僅翻譯文本內容,避免破壞富文本格式。采用「HTML 解析 → 文本提取 → 批量翻譯 → 回填」的流程。百度翻譯集成方案:富文本內容翻譯系統 HTML 解析 百度翻譯 API 集成 文件結構 app/ ├── Controller/ │ └──…

字節跳動 VeOmni 框架開源:統一多模態訓練效率飛躍!

資料來源:火山引擎-開發者社區 多模態時代的訓練痛點,終于有了“特效藥” 當大模型從單一語言向文本 圖像 視頻的多模態進化時,算法工程師們的訓練流程卻陷入了 “碎片化困境”: 當業務要同時迭代 DiT、LLM 與 VLM時&#xff0…

配置docker pull走http代理

之前寫了一篇自建Docker鏡像加速器服務的博客,需要用到境外服務器作為代理,但是一般可能沒有境外服務器,只有http代理,所以如果本地使用想走代理可以用以下方式 臨時生效(只對當前終端有效) 設置環境變量…

OpenAI 開源模型 gpt-oss 本地部署詳細教程

OpenAI 最近發布了其首個開源的開放權重模型gpt-oss,這在AI圈引起了巨大的轟動。對于廣大開發者和AI愛好者來說,這意味著我們終于可以在自己的機器上,完全本地化地運行和探索這款強大的模型了。 本教程將一步一步指導你如何在Windows和Linux…

力扣-5.最長回文子串

題目鏈接 5.最長回文子串 class Solution {public String longestPalindrome(String s) {boolean[][] dp new boolean[s.length()][s.length()];int maxLen 0;String str s.substring(0, 1);for (int i 0; i < s.length(); i) {dp[i][i] true;}for (int len 2; len …

Apache Ignite超時管理核心組件解析

這是一個非常關鍵且設計精巧的 定時任務與超時管理組件 —— GridTimeoutProcessor&#xff0c;它是 Apache Ignite 內核中負責 統一調度和處理所有異步超時事件的核心模塊。&#x1f3af; 一、核心職責統一管理所有需要“在某個時間點觸發”的任務或超時邏輯。它相當于 Ignite…

DAY 42 Grad-CAM與Hook函數

知識點回顧回調函數lambda函數hook函數的模塊鉤子和張量鉤子Grad-CAM的示例# 定義一個存儲梯度的列表 conv_gradients []# 定義反向鉤子函數 def backward_hook(module, grad_input, grad_output):# 模塊&#xff1a;當前應用鉤子的模塊# grad_input&#xff1a;模塊輸入的梯度…

基于 NVIDIA 生態的 Dynamo 風格分布式 LLM 推理架構

網羅開發&#xff08;小紅書、快手、視頻號同名&#xff09;大家好&#xff0c;我是 展菲&#xff0c;目前在上市企業從事人工智能項目研發管理工作&#xff0c;平時熱衷于分享各種編程領域的軟硬技能知識以及前沿技術&#xff0c;包括iOS、前端、Harmony OS、Java、Python等方…

《吃透 C++ 類和對象(中):拷貝構造函數與賦值運算符重載深度解析》

&#x1f525;個人主頁&#xff1a;草莓熊Lotso &#x1f3ac;作者簡介&#xff1a;C研發方向學習者 &#x1f4d6;個人專欄&#xff1a; 《C語言》 《數據結構與算法》《C語言刷題集》《Leetcode刷題指南》 ??人生格言&#xff1a;生活是默默的堅持&#xff0c;毅力是永久的…

Python 環境隔離實戰:venv、virtualenv 與 conda 的差異與最佳實踐

那天把項目部署到測試環境&#xff0c;結果依賴沖突把服務拉崩了——本地能跑&#xff0c;線上不能跑。折騰半天才發現&#xff1a;我和同事用的不是同一套 site-packages&#xff0c;版本差異導致運行時異常。那一刻我徹底明白&#xff1a;虛擬環境不是可選項&#xff0c;它是…

[ 數據結構 ] 時間和空間復雜度

1.算法效率算法效率分析分為兩種 : ①時間效率, ②空間效率 時間效率即為 時間復雜度 , 時間復雜度主要衡量一個算法的運行速度空間效率即為 空間復雜度 , 空間復雜度主要衡量一個算法所需要的額外空間2.時間復雜度2.1 時間復雜度的概念定義 : 再計算機科學中 , 算法的時間復雜…

一,設計模式-單例模式

目的設計單例模式的目的是為了解決兩個問題&#xff1a;保證一個類只有一個實例這種需求是需要控制某些資源的共享權限&#xff0c;比如文件資源、數據庫資源。為該實例提供一個全局訪問節點相較于通過全局變量保存重要的共享對象&#xff0c;通過一個封裝的類對象&#xff0c;…

AIStarter修復macOS 15兼容問題:跨平臺AI項目管理新體驗

AIStarter是全網唯一支持Windows、Mac和Linux的AI管理平臺&#xff0c;為開發者提供便捷的AI項目管理體驗。近期&#xff0c;熊哥在視頻中分享了針對macOS 15系統無法打開AIStarter的修復方案&#xff0c;最新版已完美兼容。本文基于視頻內容&#xff0c;詳解修復細節與使用技巧…

LabVIEW 紡織檢測數據傳遞

基于 LabVIEW 實現紡織檢測系統中上位機&#xff08;PC 機&#xff09;與下位機&#xff08;單片機&#xff09;的串口數據傳遞&#xff0c;成功應用于煮繭機溫度測量系統。通過采用特定硬件架構與軟件設計&#xff0c;實現了溫度數據的高效采集、傳輸與分析&#xff0c;操作簡…