Pytest 固件

来源:https://www.cnblogs.com/cdc1216/archive/2023/03/01/17154291.html
-Advertisement-
Play Games

一、固件使用背景 在執行測試用例時,我們常常需要在測試用例執行的前後去完成一些額外的操作。例如針對於 Web 測試,在用例執行前需要打開瀏覽器,完成用戶登錄等一系列前置操作;在用例執行完成後,要清除瀏覽器緩存,關閉瀏覽器...... Pytest 框架提供的固件機制(又稱為夾具)可以幫我們實現一系列 ...


一、固件使用背景

在執行測試用例時,我們常常需要在測試用例執行的前後去完成一些額外的操作。例如針對於 Web 測試,在用例執行前需要打開瀏覽器,完成用戶登錄等一系列前置操作;在用例執行完成後,要清除瀏覽器緩存,關閉瀏覽器...... Pytest 框架提供的固件機制(又稱為夾具)可以幫我們實現一系列的前後置操作。

我們先創建一套測試用例:

二、前後置函數

1. 測試方法級別

setupteardown 方法作用於每一個測試方法,每個測試方法執行之前都會先去執行 setup 方法,執行之後都會再去執行 teardown 方法。

 1 # cases/test_cases.py
 2 class TestCase:
 3  4     def setup(self):
 5         print("\n測試方法執行前做對應的操作!!!")
 6  7     def teardown(self):
 8         print("\n測試方法執行後做對應的操作!!!")
 9 10     def test_case_001(self):
11         print("模擬測試案例001")
12 13     def test_case_002(self):
14         print("模擬測試案例002")
15 16     def test_case_003(self):
17         print("模擬測試案例003")

需要註意的是:

  • 如果前後置方法是定義在測試類內部的,那麼作用的對象是當前測試類中的每一個測試方法,其他測試類和外部的測試方法將不會被影響。

 1 # cases/test_cases.py
 2 class TestCase:
 3  4     def setup(self):
 5         print("\n測試方法執行前做對應的操作!!!")
 6  7     def teardown(self):
 8         print("\n測試方法執行後做對應的操作!!!")
 9 10     def test_case_001(self):
11         print("模擬測試案例001")
12 13     def test_case_002(self):
14         print("模擬測試案例002")
15 16     def test_case_003(self):
17         print("模擬測試案例003")
18 19 20 class TestCase2:
21     def test_case_004(self):
22         print("模擬測試案例004")
23 24     def test_case_005(self):
25         print("模擬測試案例005")
26 27 28 def test_outer_case():
29     print("模擬測試外部的測試方法")

  • 如果前後置方法是定義在測試類外部的,那麼作用的對象是定義在外部的測試方法,測試類中的測試方法不會被影響。

 1 # cases/test_cases.py
 2 def setup():
 3     print("\n測試方法執行前做對應的操作!!!")
 4  5  6 def teardown():
 7     print("\n測試方法執行後做對應的操作!!!")
 8  9 class TestCase:
10 11     def test_case_001(self):
12         print("模擬測試案例001")
13 14     def test_case_002(self):
15         print("模擬測試案例002")
16 17     def test_case_003(self):
18         print("模擬測試案例003")
19 20 21 class TestCase2:
22     def test_case_004(self):
23         print("模擬測試案例004")
24 25     def test_case_005(self):
26         print("模擬測試案例005")
27 28 29 def test_outer_case():
30     print("模擬測試外部的測試方法")

2. 測試類級別

setup_classteardown_class 方法作用於當前的測試類,每個測試類執行之前都會先去執行 setup_class 方法,執行之後都會再去執行 teardown_class 方法。測試方法並不會受到這兩個方法的影響。

 1 # cases/test_cases.py
 2 class TestCase:
 3  4     def test_case_001(self):
 5         print("模擬測試案例001")
 6  7     def test_case_002(self):
 8         print("模擬測試案例002")
 9 10     def test_case_003(self):
11         print("模擬測試案例003")
12 13 14 class TestCase2:
15     def setup_class(self):
16         print("\n測試方法執行前做對應的操作!!!")
17 18     def teardown_class(self):
19         print("\n測試方法執行後做對應的操作!!!")
20 21     def test_case_004(self):
22         print("模擬測試案例004")
23 24     def test_case_005(self):
25         print("模擬測試案例005")

三、裝飾器實現

使用前後置函數的方式作用的對象都是一個模塊內或者是一個測試類中的全體對象,沒有辦法做到只作用於部分對象。Pytest 提供了 @pytest.fixture() 方法來實現部分用例的前後置操作。

1. 簡單使用

  • 第一步,先自定義一個生成器方法

1 def my_fixture():
2     print("前置操作")
3     yield
4     print("後置操作")
  • 第二步,添加裝飾器方法

1 import pytest
2 3 @pytest.fixture()
4 def my_fixture():
5     print("前置操作")
6     yield
7     print("後置操作")
  • 第三步,將函數名作為參數,傳遞給需要做前後置操作的測試方法。測試方法在執行前會先去執行生成器函數中 yield 的前半部分代碼;測試方法執行完成後,會去執行生成器函數中 yield 的後半部分代碼。

 1 # cases/test_cases.py
 2 import pytest
 3  4 @pytest.fixture()
 5 def my_fixture():
 6     print("前置操作")
 7     yield
 8     print("後置操作")
 9 10 class TestCase:
11 12     def test_case_001(self, my_fixture):
13         print("模擬測試案例001")
14 15     def test_case_002(self):
16         print("模擬測試案例002")
17 18     def test_case_003(self):
19         print("模擬測試案例003")

2. 相關參數詳解

2.1 autouse

值為 True 時,表示固件自動執行,即不需要在對應的測試方法中引用也會觸發,預設值為 False

 1 # cases/test_cases.py
 2 import pytest
 3  4 @pytest.fixture(autouse=True)
 5 def my_fixture():
 6     print("\n前置操作")
 7     yield
 8     print("\n後置操作")
 9 10 11 class TestCase:
12     # 並未傳入固件使用
13     def test_case_001(self):
14         print("模擬測試案例001")
15 16     def test_case_002(self):
17         print("模擬測試案例002")
18 19     def test_case_003(self):
20         print("模擬測試案例003")

2.2 scope

表示的是被 @pytest.fixture 標記的方法的作用域,有以下幾個值:

  • function:作用於測試方法級別,每個函數或方法都會調用

 1 # cases/test_cases.py
 2 import pytest
 3 
 4 @pytest.fixture(scope="function", autouse=True)
 5 def my_fixture():
 6     print("\n前置操作")
 7     yield
 8     print("\n後置操作")
 9 
10 
11 class TestCase:
12 
13     def test_case_001(self):
14         print("模擬測試案例001")
15 
16     def test_case_002(self):
17         print("模擬測試案例002")
18 
19     def test_case_003(self):
20         print("模擬測試案例003")

  • class:作用於測試類級別,測試類執行時會執行一次固件

 1 # cases/test_cases.py
 2 import pytest
 3 
 4 @pytest.fixture(scope="class", autouse=True)
 5 def my_fixture():
 6     print("\n前置操作")
 7     yield
 8     print("\n後置操作")
 9 
10 class TestCase:
11 
12     def test_case_001(self):
13         print("模擬測試案例001")
14 
15     def test_case_002(self):
16         print("模擬測試案例002")
17 
18     def test_case_003(self):
19         print("模擬測試案例003")
20 
21 class TestCase2:
22 
23     def test_case_004(self):
24         print("模擬測試案例004")
25 
26     def test_case_005(self):
27         print("模擬測試案例005")

  • module:作用於測試模塊,測試模塊(即 py 文件)執行時會執行一次固件

  • session:作用於會話,可以跨多個.py 文件,若多個模塊中的用例都調用了 fixture,只會運行一次

 1 ####################### cases/test_cases.py ########################
 2 import pytest
 3 
 4 @pytest.fixture(scope="session", autouse=True)
 5 def my_fixture():
 6     print("\n前置操作")
 7     yield
 8     print("\n後置操作")
 9 
10 class TestCase:
11 
12     def test_case_001(self):
13         print("模擬測試案例001")
14 
15     def test_case_002(self):
16         print("模擬測試案例002")
17 
18     def test_case_003(self):
19         print("模擬測試案例003")
20         
21 ####################### cases/test_cases_2.py ##############################
22 class TestCase2:
23 
24     def test_case_004(self):
25         print("模擬測試案例004")
26 
27     def test_case_005(self):
28         print("模擬測試案例005")

2.3 params

使用裝飾器方的固件,還可以進行參數傳遞。參數的類型支持以下四種:

  • 列表

  • 元組

  • 字典列表:[{},{},{}]

  • 字典元組:({},{},{})

我們先列印一下測試方法中接收的固件名的值是啥

 1 import pytest
 2 
 3 @pytest.fixture(scope="function")
 4 def my_fixture():
 5     print("一些操作......")
 6 
 7 class TestCase:
 8 
 9     def test_case_001(self, my_fixture):
10         print(f"模擬測試案例001----{my_fixture}")
11 
12     def test_case_002(self):
13         print("模擬測試案例002")
14 
15     def test_case_003(self):
16         print("模擬測試案例003")

在固件中我們嘗試返回一個值試試:

 1 import pytest
 2 
 3 @pytest.fixture(scope="function")
 4 def my_fixture():
 5     print("一些操作......")
 6     return "success"
 7 
 8 class TestCase:
 9 
10     def test_case_001(self, my_fixture):
11         print(f"模擬測試案例001----{my_fixture}")
12 
13     def test_case_002(self):
14         print("模擬測試案例002")
15 
16     def test_case_003(self):
17         print("模擬測試案例003")

可見在測試方法中傳入固件名,除了可以執行固件對應的操作,還可以拿到固件的返回值。那麼想結合 params 參數在固件中傳值就十分容易了:

 1 import pytest
 2 
 3 @pytest.fixture(scope="function", params=["aaa", "bbb", "ccc"])
 4 def my_fixture(request):  # 固定寫法,使用參數時必須接收一個request變數
 5     print("一些操作......")
 6     return request.param  # 固定寫法,返回參數
 7 
 8 class TestCase:
 9 
10     def test_case_001(self, my_fixture):
11         print(f"模擬測試案例001----{my_fixture}")
12 
13     def test_case_002(self):
14         print("模擬測試案例002")
15 
16     def test_case_003(self):
17         print("模擬測試案例003")

被標記的測試方法被執行了三次,是因為傳的參數有三個值,每執行一次就會傳一個值過去。

如果固件要執行前後置操作,就不能用 return 返回值了,要使用 yield:

 1 import pytest
 2 
 3 @pytest.fixture(scope="function", params=["aaa", "bbb", "ccc"])
 4 def my_fixture(request):  # 固定寫法,使用參數時必須接收一個request變數
 5     print("前置操作......")
 6     yield request.param  # 固定寫法,返回參數
 7     print("後置操作......")
 8 
 9 class TestCase:
10 
11     def test_case_001(self, my_fixture):
12         print(f"模擬測試案例001----{my_fixture}")
13 
14     def test_case_002(self):
15         print("模擬測試案例002")
16 
17     def test_case_003(self):
18         print("模擬測試案例003")

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在vue中父子組件傳值是必不可少的,大家必須要學會! 首先父組件向子組件傳值: 父組件:比如我們傳teacher為index,如果我們傳值變數可以使用 : 綁定我們在data中定義的變數。 子組件:為了規範一般使用對象的形式,type表示值的類型,default表示如果不傳值就預設是null. 在子 ...
  • 環境 vue2 導入 安裝npm包 echarts echarts-gl import * as echarts from "echarts" import "echarts-gl" html <div id="map-container"></div> js import GeoZJ from ' ...
  • RxEditor是一款開源企業級可視化低代碼前端,目標是可以編輯所有 HTML 基礎的組件。比如支持 React、VUE、小程式等,目前僅實現了 React 版。 RxEditor運行快照: 項目地址:https://github.com/rxdrag/rxeditor 演示地址( Vercel 部 ...
  • 如何畫好一張架構圖,要做好這件事情首先要回答的就是什麼是架構圖。我們日常工作中經常能看到各種各樣的架構圖,而且經常會發現大家對架構圖的理解各有側重。深入追究到這個問題,可能一下子還很難有一個具象的定義,如果我們把這個問題進行拆分,理解起來就會容易一點。 ...
  • 1. JPA 1.1. 性能直接受底層JDBC驅動性能的影響 1.2. 性能提升是通過改變實體類的位元組碼來實現的 1.2.1. 在類載入到JAR文件或者由JVM運行之前增強位元組碼的方法 1.2.1.1. 在編譯過程中完成的 1.2.1.2. 在實體類編譯完成後,它們會被傳遞給一個特定實現的後置處理器 ...
  • 一、前戲 在之前我們已經學會使用 pytest-html 插件生成 html 格式的測試報告: 1 # 第一步,安裝插件 2 pip install pytest-html 3 ​ 4 # 第二步,執行用例時使用 --html 參數 5 ## main 函數中執行 6 if __name__ == ...
  • MyBatis的關聯映射02 3.一對多 3.1基本介紹 mybatis – MyBatis 3 | XML 映射器 多對一關係也是一個基本的映射關係,多對一,也可以理解為一對多。例如: User--Pet:一個用戶可以有多只寵物 Dep--Emp:一個部門有多個員工 雙向的多對一關係:通過User ...
  • 背景 公司目前主要聚焦於視頻這個領域,利用視頻為媒體、文旅、會議等行業進行賦能。 既然聚焦於視頻領域,那麼視頻轉碼則是繞不開的話題。 為了降低成本,以及保證產品的核心能力,公司自建了一套轉碼系統。 轉碼服務除了儘可能多的相容業界的視頻格式外,轉碼的速度是另一個非常重要的指標。 因為視頻轉碼對用戶來說 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...