Pytest之收集用例規則與運行指定用例

🍅 點擊文末小卡片,免費獲取軟件測試全套資料,資料在手,漲薪更快?

小伙伴們大家好呀,今天筆者會給大家講解一下pytest是如何收集我們寫好的用例?我們又有哪些方式來運行單個用例或者批量運行用例呢?下面將為大家一一解答!

一、Pytest收集用例原理

首先我們按照如下目錄結構新建我們的項目

[pyttest搜索測試用例的規則]|[測試用例目錄1]|    |__init__.py|    |test_測試模塊1.py|    |test_測試模塊2.py|[測試用例目錄2]|    |__init__.py|    |test_測試用例1.py|    |測試用例.py|test_測試模塊.py|測試用例2.py    

二、代碼實例

# test_測試模塊1.py
def test_testFunc1():print('\n我是一個測試用例! in test_testFunc1')assert 1 == 1def func1():print('我不是一個測試用例')assert 1 == 1
# test_測試模塊2.py
class TestClass1(object):def test_class_func1(self):print('\n 我是一個類里面的測試用例 in test_class_func1')assert 1 == 1def class_func1(self):print('我是類里面的一個普通函數!')
# test_測試用例1.pyclass TestClass2(object):def test_class_func2(self):print('\n 我是一個類里面的測試用例 in test_class_func2',)assert 1 == 1def class_func2(self):print('我是類里面的一個普通函數!')def test_testFunc2():print('\n我是一個測試用例 in test_testFunc2!')assert 1 == 1def func2():print('我不是一個測試用例')assert 1 == 1
# 測試用例.pydef test_testFunc3():print('\n我是一個測試用例! in 測試用例.py')assert 1 == 1def func3():print('我不是一個測試用例')assert 1 == 1
# test_測試模塊3.pydef test_testFunc4():print('\n我是一個測試用例! in test_testFunc4')assert 1 == 1def func4():print('我不是一個測試用例')assert 1 == 1class TestClass3(object):def test_class_func3(self):print('\n 我是一個類里面的測試用例 in test_class_func3')assert 1 == 1def class_func3(self):print('我是類里面的一個普通函數!')
# 測試用例2.pydef test_testFunc5():print('\n我是一個測試用例! in test_testFunc5')assert 1 == 1def func5():print('我不是一個測試用例')assert 1 == 1

下面我們使用cmd命令來執行一下這個項目,看一下究竟會有多少條用例是有效的用例?打開cmd 切換到項目的根目錄執行命令 pytest -v

D:\pytest搜索測試用例規則>pytest -v
============================= test session starts =============================
platform win32 -- Python 3.6.4, pytest-3.8.0, py-1.6.0, pluggy-0.7.1 -- c:\python36\python.exe
cachedir: .pytest_cache
metadata: {'Python': '3.6.4', 'Platform': 'Windows-10-10.0.17134-SP0', 'Packages': {'pytest': '3.8.0', 'py': '1.6.0', 'pluggy': '0.7.1'}, 'Plugins': {'metadata': '1.8.0', 'html': '1.20.0', 'allure-adaptor': '1.7.10'}, 'JAVA_HOME': 'C:\\Program Files\\Java\\jdk1.8.0_181'}
rootdir: D:\pytest搜索測試用例規則, inifile:
plugins: metadata-1.8.0, html-1.20.0, allure-adaptor-1.7.10
collected 6 itemstest_測試模塊3.py::test_testFunc4 PASSED                                 [ 16%]
test_測試模塊3.py::TestClass3::test_class_func3 PASSED                   [ 33%]
測試用例目錄1/test_測試模塊1.py::test_testFunc1 PASSED                   [ 50%]
測試用例目錄1/test_測試模塊2.py::TestClass1::test_class_func1 PASSED     [ 66%]
測試用例目錄2/test_測試用例1.py::TestClass2::test_class_func2 PASSED     [ 83%]
測試用例目錄2/test_測試用例1.py::test_testFunc2 PASSED                   [100%]========================== 6 passed in 0.59 seconds ===========================

運行結果可以看到一共有6條用例passed,且詳細的列出了是哪6條,那么按照我們上面編寫的用例其實并不止6條,那么為什么會只運行了6條呢?綜合以上的代碼結構和我們的執行結果對比,我們應該能發現這樣的規律

Pytest會從我們當前運行的目錄開始查找所有目錄,查找以test_開頭的文件且文件中所有以test_開頭的函數和以Test開頭的類和類里面以test_開頭的函數為測試用例。這就是為什么上面只運行了6條測試用例!

三、Pytest運行指定測試用例

我們仍然使用上面的項目作為演示(cdm切換到項目的根目錄)

3.1運行指定目錄下的所有用例

我們指定運行測試用例目錄1里面的所有用例(pytest -v 測試用例目錄1)

D:\pytest搜索測試用例規則>pytest -v 測試用例目錄1
============================= test session starts =============================
platform win32 -- Python 3.6.4, pytest-3.8.0, py-1.6.0, pluggy-0.7.1 -- c:\python36\python.exe
cachedir: .pytest_cache
metadata: {'Python': '3.6.4', 'Platform': 'Windows-10-10.0.17134-SP0', 'Packages': {'pytest': '3.8.0', 'py': '1.6.0', 'pluggy': '0.7.1'}, 'Plugins': {'metadata': '1.8.0', 'html': '1.20.0', 'allure-adaptor': '1.7.10'}, 'JAVA_HOME': 'C:\\Program Files\\Java\\jdk1.8.0_181'}
rootdir: D:\pytest搜索測試用例規則, inifile:
plugins: metadata-1.8.0, html-1.20.0, allure-adaptor-1.7.10
collected 2 items測試用例目錄1/test_測試模塊1.py::test_testFunc1 PASSED                   [ 50%]
測試用例目錄1/test_測試模塊2.py::TestClass1::test_class_func1 PASSED     [100%]========================== 2 passed in 0.05 seconds ===========================
# 這樣就會只搜索和指定指定目錄下面所有的用

3.2運行指定文件中的所有用例

我們指定運行test_測試模塊1.py(pytest -v 測試用例目錄1/test_測試模塊1.py )

D:\pytest搜索測試用例規則>pytest -v 測試用例目錄1/test_測試模塊1.py
============================= test session starts =============================
platform win32 -- Python 3.6.4, pytest-3.8.0, py-1.6.0, pluggy-0.7.1 -- c:\python36\python.exe
cachedir: .pytest_cache
metadata: {'Python': '3.6.4', 'Platform': 'Windows-10-10.0.17134-SP0', 'Packages': {'pytest': '3.8.0', 'py': '1.6.0', 'pluggy': '0.7.1'}, 'Plugins': {'metadata': '1.8.0', 'html': '1.20.0', 'allure-adaptor': '1.7.10'}, 'JAVA_HOME': 'C:\\Program Files\\Java\\jdk1.8.0_181'}
rootdir: D:\pytest搜索測試用例規則, inifile:
plugins: metadata-1.8.0, html-1.20.0, allure-adaptor-1.7.10
collected 1 item測試用例目錄1/test_測試模塊1.py::test_testFunc1 PASSED                   [100%]========================== 1 passed in 0.09 seconds ===========================
# 運行指定文件下的所有用例

3.3運行指定文件中的測試類

我們指定運行test_測試模塊2.py中的測試類Testclass1(pytest -v 測試用例目錄1/test_測試模塊2.py::TestClass1)

D:\pytest搜索測試用例規則>pytest -v 測試用例目錄1/test_測試模塊2.py::TestClass1
============================= test session starts =============================
platform win32 -- Python 3.6.4, pytest-3.8.0, py-1.6.0, pluggy-0.7.1 -- c:\python36\python.exe
cachedir: .pytest_cache
metadata: {'Python': '3.6.4', 'Platform': 'Windows-10-10.0.17134-SP0', 'Packages': {'pytest': '3.8.0', 'py': '1.6.0', 'pluggy': '0.7.1'}, 'Plugins': {'metadata': '1.8.0', 'html': '1.20.0', 'allure-adaptor': '1.7.10'}, 'JAVA_HOME': 'C:\\Program Files\\Java\\jdk1.8.0_181'}
rootdir: D:\pytest搜索測試用例規則, inifile:
plugins: metadata-1.8.0, html-1.20.0, allure-adaptor-1.7.10
collected 1 item測試用例目錄1/test_測試模塊2.py::TestClass1::test_class_func1 PASSED     [100%]========================== 1 passed in 0.05 seconds ===========================
# 運行指定的測試類中的所有測試用

3.4運行指定的測試用例函數

我們指定運行test_testFunc1(pytest -v 測試用例目錄1/test_測試模塊1.py::test_testFunc1)

D:\pytest搜索測試用例規則>pytest -v 測試用例目錄1/test_測試模塊1.py::test_testFunc1
============================= test session starts =============================
platform win32 -- Python 3.6.4, pytest-3.8.0, py-1.6.0, pluggy-0.7.1 -- c:\python36\python.exe
cachedir: .pytest_cache
metadata: {'Python': '3.6.4', 'Platform': 'Windows-10-10.0.17134-SP0', 'Packages': {'pytest': '3.8.0', 'py': '1.6.0', 'pluggy': '0.7.1'}, 'Plugins': {'metadata': '1.8.0', 'html': '1.20.0', 'allure-adaptor': '1.7.10'}, 'JAVA_HOME': 'C:\\Program Files\\Java\\jdk1.8.0_181'}
rootdir: D:\pytest搜索測試用例規則, inifile:
plugins: metadata-1.8.0, html-1.20.0, allure-adaptor-1.7.10
collected 1 item測試用例目錄1/test_測試模塊1.py::test_testFunc1 PASSED                   [100%]========================== 1 passed in 0.03 seconds ===========================

四、總結

收集用例規則:搜索所有以test_開頭的測試文件,以Test開頭的測試類,以test_開頭的測試函數

執行用例規則:從-v 參數輸出的執行信息我們就應該能發現,運行指定的目錄下用例 使用命令 pytest 目錄/目錄 即可;運行指定文件使用 pytest 目錄/文件 即可;運行指定類或者函數 使用命令 pytest 目錄/文件::類名::函數名 或者 pytest 目錄/文件::函數名

搜索用例規則也是我們命名用例文件,測試類,測試函數的規則;執行指定測試用例記住規則即可。

最后感謝每一個認真閱讀我文章的人,禮尚往來總是要有的,雖然不是什么很值錢的東西,如果你用得到的話可以直接拿走:

這些資料,對于做【軟件測試】的朋友來說應該是最全面最完整的備戰倉庫,這個倉庫也陪伴我走過了最艱難的路程,希望也能幫助到你!凡事要趁早,特別是技術行業,一定要提升技術功底。

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

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

相關文章

qt 使用memcpy進行內存拷貝時注意的問題

int offset sizeof(st_target_data);// 預先分配足夠空間this->featureData.resize(offsetsize);// 再執行拷貝memcpy(this->featureData.data()offset, dataa, size);注意 一定要在mencpy之前 使用resize分配足夠的空間,否則在方法退出時候會閃退&#xff…

微調性能趕不上提示工程怎么辦?Can Gradient Descent Simulate Prompting?——論文閱讀筆記

今天速讀一篇文章 Can Gradient Descent Simulate Prompting? 一句話總結 針對【新知識應用的場景里,FT效果往往追不上ICL】這個情況,作者引入MAML的思想↓ 內圈讓模型學習新知識形成知識FT模型; 外圈通過最小化ICL和知識FT模型的KL散度&…

從“直覺搶答”到“深度思考”:大模型的“慢思考”革命,思維鏈、樹、圖如何讓AI越來越像人?

注:此文章內容均節選自充電了么創始人,CEO兼CTO陳敬雷老師的新書《GPT多模態大模型與AI Agent智能體》(跟我一起學人工智能)【陳敬雷編著】【清華大學出版社】 GPT多模態大模型與AI Agent智能體書籍本章配套視頻課程【陳敬雷】 文…

Android系統的問題分析筆記 - Android上的調試方式 debuggerd

debuggerd 是 Android 系統中的一個重要調試工具,主要用于生成進程崩潰時的核心轉儲(core dump)和調試信息(如堆棧跟蹤)。以下是關于 debuggerd 的詳細說明: 1. 基本功能 崩潰分析:當 Native 進…

python 雙下劃線開頭函數

在 Python 里,雙下劃線開頭的函數(準確地說是方法)有著特殊的用途和意義。下面為你詳細介紹相關內容: 1. 類的特殊方法(魔術方法) 以雙下劃線開頭和結尾的方法,被稱為特殊方法或者魔術方法&…

VyOS起步指南:用Docker快速搭建網絡實驗環境

文章目錄1. VyOS是什么?為什么選擇它?2. 五分鐘快速部署:Docker方案3. 進入容器:初探VyOS世界4. 核心操作:像開發者一樣思考5. 踩坑提醒:新手常見問題6. 結語:網絡即代碼的未來1. VyOS是什么&am…

動態規劃理論基礎,LeetCode 509. 斐波那契數 LeetCode 70. 爬樓梯 LeetCode 746. 使用最小花費爬樓梯

動態規劃理論基礎動態規劃,英文:Dynamic Programming,簡稱DP,如果某一問題有很多重疊子問題,使用動態規劃是最有效的。所以動態規劃中每一個狀態一定是由上一個狀態推導出來的,這一點就區分于貪心&#xff…

暑期自學嵌入式——Day02(C語言階段)

點關注不迷路喲。你的點贊、收藏,一鍵三連,是我持續更新的動力喲!!! 主頁: 一位搞嵌入式的 genius-CSDN博客https://blog.csdn.net/m0_73589512?spm1000.2115.3001.5343 目錄 Day02→數據類型&#xf…

如何單獨安裝設置包域名

前言 在 npm 中,直接通過 package-lock.json 無法單獨設置包的安裝地址,因為該文件是自動生成的依賴關系鎖定文件。但你可以通過以下方法間接實現: 一、在 package.json 中指定包來源(推薦) 在 package.json 的 depend…

存儲過程探秘:數據庫編程的藝術

文章目錄存儲過程語法格式BEGIN...END語句塊DECLARE(聲明局部變量)流控制語句if函數批處理操作測試2測試3存儲過程與函數的關系存儲過程 MYSQL的存儲過程是一組預處理的SQL語句,可以像函數一樣在數據庫中進行存儲和調用。 它們允許在數據庫…

非阻塞寫入核心:asyncio.StreamWriter 的流量控制與數據推送之道

在 asyncio 的異步編程框架中,如果說 asyncio.StreamReader 是你異步應用的數據輸入管道,那么 asyncio.StreamWriter 就是你異步應用的數據輸出管道。它是一個至關重要的組件,讓你能夠方便、高效且非阻塞地向連接的另一端(如 TCP …

控制臺打開mysql服務報錯解決辦法

控制臺打開mysql服務報錯解決辦法這個MySQL錯誤表示訪問被拒絕,通常是因為沒有提供正確的用戶名和密碼。以下是幾種解決方法: 方法1:指定用戶名和密碼連接 mysql -u root -p然后輸入root用戶的密碼。 方法2:如果忘記了root密碼&am…

Unsloth 實戰:DeepSeek-R1 模型高效微調指南(下篇)

食用指南 本系列因篇幅原因拆分為上下兩篇: 上篇以基礎環境搭建為主,介紹了 Unsloth 框架、基座模型下載、導入基座模型、數據集下載/加載/清洗、SwanLab 平臺賬號注冊。 下篇(本文)以實戰微調為主,介紹預訓練、全量…

Ubuntu安裝Jenkins

Ubuntu安裝Jenkins方法1:使用官方的Jenkins倉庫1. 添加Jenkins倉庫2. 更新軟件包列表3. 安裝Jenkins4. 啟動Jenkins服務5. 設置Jenkins開機啟動6. 查找初始管理員密碼7. 訪問Jenkins方法2:使用Snap包(適用于較新的Ubuntu版本)1. 安…

ubuntu22.04下配置qt5.15.17開發環境

自從qt5.15版本開始,不再提供免費的離線安裝包,只能通過源碼自行編譯。剛好最近需要在ubuntu22.04下配置qt開發環境,于是寫篇文章記錄配置的過程。 其實一開始是想配置qt5.15.2的,但是在編譯配置參數這一步驟中出現如下報錯 em…

S7-1200 與 S7-300 CPS7-400 CP UDP 通信 Step7 項目編程

S7-1200 CPU 與S7-300 CP STEP7 UDP通信S7-1200 與 S7-300 CP 之間的以太網通信可以通過 UDP 協議來實現,使用的通信指令是在S7-1200 CPU 側調用通信-開放式用戶通信TSEND_C,TRCV_C指令或TCON,TDISCON,TUSEND,TURCV 指…

基于YOLOv11的無人機目標檢測實戰(Windows環境)

1. 環境搭建 1.1 硬件與操作系統 操作系統:Windows 11 CPU:Intel i7-9700 GPU:NVIDIA RTX 2080(8GB顯存) 1.2 安裝CUDA和cuDNN 由于YOLOv11依賴PyTorch的GPU加速,需要安裝CUDA和cuDNN: 安…

Spring Cloud分布式配置中心:架構設計與技術實踐

從單體到微服務:Spring Cloud 開篇與微服務設計 Spring Cloud服務注冊與發現:架構設計與技術實踐深度分析 在以往分享中,碼友們已經掌握了微服務的設計和注冊中心的設計,部分聰明的碼友已經察覺了,已經到了需要設計一個…

15.2 Common Criteria合規

目錄1. Common Criteria簡介1.1 CC評估要素1.2 CC與TF-A的關系2. TF-A的CC合規要求2.1 安全功能需求2.2 開發過程要求3. TF-A的CC合規實現3.1 關鍵安全機制3.2 開發流程控制4. CC認證實踐指南4.1 認證準備步驟4.2 典型挑戰與解決方案4.3 已認證案例參考5. 持續合規建議1. Commo…

【前端:Typst】--let關鍵字的用法

在 Typst 中,#let 命令是用于定義變量和函數的核心指令,其用法非常靈活。以下是詳細的用法說明和示例。 目錄 1.基礎變量定義 2.函數定義 3.默認參數 4.內容塊參數(Content Blocks) 5.遞歸函數 1.基礎變量定義 // 定義簡單…