通過一個例子理解pytest的fixture的使用

需求

  • 希望編寫登陸web后做一些操作的測試用例,使用pytest框架
  • 具體測試用例執行前,需要先拿到web的token,這個獲取token的動作只執行一次

例一

  • 先上測試用例代碼
admin@pc-1:~$ cat my_test.py 
import pytestclass TestWebLogin:@pytest.fixture(scope='function', autouse=True)def setup_teardown(self):# setupprint('@@@@@@@@@@@@@@@@@@@@@get token')#toke = login_web()self.token = 'abc'yield  # 運行測試用例# teardowndef test_case1(self):# 使用 self.app 進行測試assert self.token is not None# 其他測試邏輯def test_case2(self):# 使用 self.app 進行測試assert self.token is not None# 其他測試邏輯
admin@pc-1:~$ 
admin@pc-1:~$ 
admin@pc-1:~$ pytest -sv  my_test.py 
================================================================= test session starts ==================================================================
platform linux -- Python 3.8.10, pytest-7.4.0, pluggy-1.2.0 -- /usr/bin/python3
cachedir: .pytest_cache
rootdir: /home/centec
plugins: dash-2.14.1, solara-1.21.0, anyio-4.0.0
collected 2 items                                                                                                                                      my_test.py::TestWebLogin::test_case1 @@@@@@@@@@@@@@@@@@@@@get token
PASSED
my_test.py::TestWebLogin::test_case2 @@@@@@@@@@@@@@@@@@@@@get token
PASSED================================================================== 2 passed in 0.01s ===================================================================
admin@pc-1:~$ 
  • 解釋
    • class TestWebLogin里每個test_開頭的function就是一個測試用例
    • setup_teardown函數是實現login和logout,yield之前是setup,yield之后是teardown
  • 運行結果是在每個test case前都執行了一遍獲取token的動作(scope=‘function’)

例二

  • 希望所有的case只在執行第一個的時候獲取一下token,后面的case直接使用token即可
  • 嘗試將fixture的scope從fuction改為class,并執行
admin@pc-1:~$ cat my_test.py 
import pytestclass TestWebLogin:@pytest.fixture(scope='class', autouse=True)def setup_teardown(self):# setupprint('@@@@@@@@@@@@@@@@@@@@@get token')#toke = login_web()self.token = 'abc'yield  # 運行測試用例# teardowndef test_case1(self):# 使用 self.app 進行測試assert self.token is not None# 其他測試邏輯def test_case2(self):# 使用 self.app 進行測試assert self.token is not None# 其他測試邏輯
admin@pc-1:~$ 
admin@pc-1:~$ pytest -sv  my_test.py 
================================================================= test session starts ==================================================================
platform linux -- Python 3.8.10, pytest-7.4.0, pluggy-1.2.0 -- /usr/bin/python3
cachedir: .pytest_cache
rootdir: /home/centec
plugins: dash-2.14.1, solara-1.21.0, anyio-4.0.0
collected 2 items                                                                                                                                      my_test.py::TestWebLogin::test_case1 @@@@@@@@@@@@@@@@@@@@@get token
FAILED
my_test.py::TestWebLogin::test_case2 FAILED======================================================================= FAILURES =======================================================================
_______________________________________________________________ TestWebLogin.test_case1 ________________________________________________________________self = <my_test.TestWebLogin object at 0x7f909a307cd0>def test_case1(self):# 使用 self.app 進行測試
>       assert self.token is not None
E       AttributeError: 'TestWebLogin' object has no attribute 'token'my_test.py:17: AttributeError
_______________________________________________________________ TestWebLogin.test_case2 ________________________________________________________________self = <my_test.TestWebLogin object at 0x7f909a307610>def test_case2(self):# 使用 self.app 進行測試
>       assert self.token is not None
E       AttributeError: 'TestWebLogin' object has no attribute 'token'my_test.py:22: AttributeError
=============================================================== short test summary info ================================================================
FAILED my_test.py::TestWebLogin::test_case1 - AttributeError: 'TestWebLogin' object has no attribute 'token'
FAILED my_test.py::TestWebLogin::test_case2 - AttributeError: 'TestWebLogin' object has no attribute 'token'
================================================================== 2 failed in 0.14s ===================================================================
admin@pc-1:~$ 
  • 意料之外的是,在setup_teardown中明明已經給self.token賦值了,但是同在一個class下,其它的測試用例卻看不到self.token!!!
  • pytest的test class是比較特殊的,不能通過self.xxx來傳遞值,只能通過fixture
  • 于是有了下面的改進

例三

  • case修改如下
admin@pc-1:~$ cat my_test.py 
import pytestclass TestWebLogin:@pytest.fixture(scope='class', autouse=False)def setup_teardown(self):# setupprint('@@@@@@@@@@@@@@@@@@@@@get token')#toke = login_web()token = 'abc'yield token # 運行測試用例# teardowndef test_case1(self, setup_teardown):token = setup_teardownassert token is not Noneprint(f'toke={token}')# 其他測試邏輯def test_case2(self, setup_teardown):token = setup_teardownassert token is not Noneprint(f'token={token}')# 其他測試邏輯
admin@pc-1:~$ 
admin@pc-1:~$ 
admin@pc-1:~$ 
admin@pc-1:~$ pytest -sv  my_test.py 
================================================================= test session starts ==================================================================
platform linux -- Python 3.8.10, pytest-7.4.0, pluggy-1.2.0 -- /usr/bin/python3
cachedir: .pytest_cache
rootdir: /home/centec
plugins: dash-2.14.1, solara-1.21.0, anyio-4.0.0
collected 2 items                                                                                                                                      my_test.py::TestWebLogin::test_case1 @@@@@@@@@@@@@@@@@@@@@get token
toke=abc
PASSED
my_test.py::TestWebLogin::test_case2 token=abc
PASSED================================================================== 2 passed in 0.01s ===================================================================
admin@pc-1:~$ 
  • 修改點包括
    • fixture的scope為class,表示在TestWebLogin中只會執行一次
    • fixture的autouse賦值為False,相當于需要顯式調用,不會自動運行
    • 所有的賦值就沒有要加self了
    • setup_teardown的yield后面加token,類似于return token
    • 后面的testcase 將setup_teardown作為一個參數傳入,然后進行顯式的賦值
  • 從執行結果來看,獲取token只做了一次,后續所有的case都直接使用這個token了

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

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

相關文章

基于springboot實現農機電招平臺系統項目【項目源碼+論文說明】

基于springboot實現農機電招平臺系統演示 摘要 隨著農機電招行業的不斷發展&#xff0c;農機電招在現實生活中的使用和普及&#xff0c;農機電招行業成為近年內出現的一個新行業&#xff0c;并且能夠成為大群眾廣為認可和接受的行為和選擇。設計農機電招平臺的目的就是借助計算…

軟件開發中對圖片的加工處理的一些個人思考和總結

前言&#xff1a; 最近在公司做項目的時候&#xff0c;有一個業務場景就是同一張圖片&#xff0c;在不同的位置上展示的效果是不一致的&#xff0c;其實理解起來也很簡單&#xff0c;就以大家熟悉的微信頭像而言&#xff0c;我們在正常使用的情況下&#xff0c;一個微信頭像的大…

尋找多個項目的漏洞賞金實戰,不同技術的詳細實現

尋找多個項目的漏洞賞金實戰,不同技術的詳細實現。 破-解Slack App得到3500美金漏洞賞金 文章的核心要點如下: 漏洞發現:作者在Slack的安卓應用中發現了一個漏洞。這個漏洞是由于目錄遍歷,導致可以竊取密碼。這個漏洞的重要性在于,它允許“跳躍”在賬戶之間,也就是說,你…

[kingbase鎖等待問題分析]

參考文章:https://www.modb.pro/db/70021 概述 為了確保復雜的事務可以安全地同時運行&#xff0c;kingbase&#xff08;PostgreSQL&#xff09;提供了各種級別的鎖來控制對各種數據對象的并發訪問&#xff0c;使得對數據庫關鍵部分的更改序列化。事務并發運行&#xff0c;直到…

關閉EntityFramework日志輸出SQL

項目場景&#xff1a; 提示&#xff1a;這里簡述項目相關背景&#xff1a; EntityFramework日志輸出SQL 問題描述 提示&#xff1a;這里描述項目中遇到的問題&#xff1a; EntityFramework日志輸出SQL&#xff0c;造成發布后&#xff0c;無效日志太多&#xff0c;且容器化部…

Linux安全之AIDE系統入侵檢測工具安裝和使用

一、AIDE 系統入侵檢測工具簡介 AIDE&#xff0c;全稱為Advanced Intrusion Detection Environment&#xff0c;是一個主要用于檢測文件完整性的入侵檢測工具。它能夠構建一個指定文件的數據庫&#xff0c;并使用aide.conf作為其配置文件。AIDE數據庫能夠保存文件的各種屬性&am…

Django(十、中間件)

文章目錄 一、中間件的介紹中間件有什么用中間件功能自定義中間中間件的順序 一、中間件的介紹 中間件顧名思義&#xff0c;是介于request與response處理之間的一道處理過程&#xff0c;相對比較輕量級&#xff0c;并且在全局上改變django的輸入與輸出。因為改變的是全局&…

U盤啟動制作工具Rufus

U盤啟動制作工具Rufus 下載U盤啟動制作工具Rufus&#xff0c;進入Rufus官網&#xff1a;http://rufus.ie/en/&#xff0c;打開之后往后滑動&#xff0c;找到download即可點擊下載。 需要插入U盤 首先需要插入U盤&#xff0c;如果U盤有重要文件一定要備份&#xff0c;然后右鍵…

mysql安裝親測有效

http://t.csdnimg.cn/UHuy4

Grails 啟動

Grails系列 Grails項目啟動 文章目錄 Grails系列Grails一、項目創建二、可能的問題1.依賴下載2.項目導入到idea失敗3.項目導入到idea后運行報錯 Grails Grails是一款基于Groovy語言的Web應用程序框架&#xff0c;它使用了許多流行的開源技術&#xff0c;如Spring Framework、…

Go語言初始化已有環境,跟蹤已有依賴環境

在Go語言中&#xff0c;go.mod文件是Go模塊的管理文件&#xff0c;用于跟蹤和管理項目的依賴關系。go.sum 文件是 Go 語言模塊的另一個關鍵文件&#xff0c;它記錄了項目依賴的確切版本以及相應的哈希值。如果你得到了一個包含go.mod和go.sum文件的Go代碼&#xff0c;&#xff…

內衣洗衣機怎么選?性價比高的小型洗衣機推薦

在機器解放了雙手的時代中&#xff0c;洗衣機走進了千家萬戶&#xff0c;雖然在某種程度上緩解了人們手洗衣服的壓力&#xff0c;但還是有不少人選擇了人工手洗自己的內衣內褲&#xff0c;甚至連襪子都是手工洗的&#xff0c;這讓人很是郁悶&#xff0c;倒不是說洗衣機不方便&a…

SpringBoot整合SpringSecurity+jwt+knife4生成api接口(從零開始簡單易懂)

一、準備工作 ①&#xff1a;創建一個新項目 1.事先創建好一些包 ②&#xff1a;引入依賴 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency>&…

可以遠程控制電腦桌面的軟件有哪些?

隨著電腦辦公的普及&#xff0c;人們對于遠程控制電腦的需求也越來越大。遠程控制電腦技術能夠讓用戶在不同地點的電腦之間進行操作和訪問&#xff0c;能夠提高工作效率。可以遠程控制電腦桌面的軟件有哪些&#xff1f; 1. 遠程監控電腦軟件 需要安裝在被控制端電腦&#xff…

【cppcheck 靜態代碼分析工具使用教程】

cppcheck 是一個流行的靜態代碼分析工具,用于 C 和 C++ 程序。它可以幫助檢測代碼中的錯誤、未定義的行為、內存泄漏等。在 Ubuntu 系統上使用 cppcheck 的基本步驟和示例如下: 安裝 cppcheck 打開終端。使用以下命令安裝 cppcheck:sudo apt-get update sudo apt-get insta…

linux -系統通用命令查詢

有時候內網環境下&#xff0c;系統有些命令沒有安裝因此掌握一些通用的linux 命令也可以幫助我們解決一些問題查看 1.查看系統內核版本 uname -r2.查看系統版本 cat /etc/os-release3. 查看cpu 配置 lscpu4.查看內存信息 free [參數] 中各個數值的解釋如下表 數值解釋t…

4.并發中的各種鎖概念

目錄 概述鎖分類按上鎖方式劃分按特性劃分悲觀鎖/樂觀鎖重入鎖/不可重入鎖公平鎖/非公平鎖獨享鎖/共享鎖 其它自旋鎖分段鎖無鎖/偏向鎖/輕量級鎖/重量級鎖 結束 概述 java 鎖分類&#xff0c;雖是概念&#xff0c;很常見。 鎖分類 按上鎖方式劃分 鎖關鍵字解釋隱式鎖synchr…

提高工作效率的寶藏網站和寶藏工具(高級版)

一、參考資料 親測&#xff1a;你這些網站都不知道&#xff0c;哪來時間去摸魚&#xff1f; 提高工作效率的寶藏網站和寶藏工具&#xff08;基礎版&#xff09; 二、好用的網站 HelloGitHub - 開源項目平臺 HelloGitHub 是一個分享有趣、 入門級開源項目的平臺。 希望大家能…

MySQL-02-InnoDB存儲引擎

實際的業務系統開發中&#xff0c;使用MySQL數據庫&#xff0c;我們使用最多的當然是支持事務并發的InnoDB存儲引擎的這種表結構&#xff0c;下面我們介紹下InnoDB存儲引擎相關的知識點。 1-Innodb體系架構 InnoDB存儲引擎有多個內存塊&#xff0c;可以認為這些內存塊組成了一…

qgis添加arcgis的mapserver

左側瀏覽器-ArcGIS地圖服務器-右鍵-新建連接 Folder: / 展開-雙擊圖層即可