pytest測試框架pytest-order插件自定義用例執行順序

? ? ?pytest提供了豐富的插件來擴展其功能,本章介紹插件pytest-order,用于自定義pytest測試用例的執行順序。pytest-order是插件pytest-ordering的一個分支,但是pytest-ordering已經不再維護了,建議大家直接使用pytest-order。

官方文檔:
https://pytest-order.readthedocs.io/en/stable/usage.html

pytest-order官方顯示的python和pytest版本限制:

  • pytest-order適用于 Python 3.7 - 3.12:
  • 對于 Python 3.9 之前的所有版本,pytest 版本 >= 5.0.0
  • 對于 Python >= 3.10,pytest >= 6.2.4。

默認情況下的執行順序

文件間執行順序

pytest會首先掃描當前目錄及子目錄下的所有文件,查找以test_開頭(或包含_test)的文件以及測試模塊(如test_*.py或*_test.py)。對于找到的測試文件,它們將按照文件名的ASCII碼順序執行,即數字、大寫英文字母、小寫英文字母的順序。

文件內執行順序

在每個測試文件中,pytest會按照測試用例(即測試函數或測試方法)定義的順序執行。如果使用了類組織測試用例,那么類內部的測試用例將按照定義的順序執行。

舉例:測試文件中函數測試用例順序是4,5,1,2,3,測試類中的測試用例順序也是4,5,1,2,3。

測試用例執行后,按照4,5,1,2,3的順序執行。

pytest-order安裝

使用pip命令安裝:?pip install?pytest-order?(安裝在pytest工程所運行的python環境,python的安裝目錄或者虛擬環境目錄,可以參考之前文章查看運行環境pycharm配置pytest運行環境)

通過pycharm安裝:打開設置,按照如下圖中安裝插件(windows系統)

pytest-order運行

使用@pytest.mark.order來裝飾用例,然后執行命令中無需增加額外的運行參數,運行時會自動化識別自定義的順序,并按照約定順序執行。

1 使用數字定義順序

使用正數或者負數定義順序,數字越小先執行。舉例@pytest.mark.order(1)或者@pytest.mark.order(index=1),可以直接填數字,也可以使用index=某個數字。

PS:該處的數字有點像python列表list的索引,0代表第一個元素,-1代表最后一個元素

  • 如果全是正數或者全是負數,按照數字小到大的順序執行
  • 如果既有正數又有負數,則按照正數由小到大排序,然后再按照負數由小到大排序
  • 沒有標記的測試用例在所有具有正數標記的測試之后執行,并在具有負數標記的測試之前執行。

舉例:上面的用例重新定義順序如下,既有正數也有負數排序

預期結果是先執行函數級用例并且執行順序是1,2,3,4,5,再執行測試類中的用例并且執行順序是5,4,3,2,1

用例執行后結果如下:符合預期

上面的測試用例如果全部換成使用@pytest.mark.order(index=1)這種格式定義,結果也是一樣,此處不在贅述

2 使用英文代表的數字定義順序

使用英文代表的數字定義順序,數字越小先執行。

舉例@pytest.mark.order("first")或者@pytest.mark.order(index="last")

first代表第1個(相當于數字0),last代表最后1個(相當于數字-1)

如果使用不在字典中的定義會告警,舉例:定義@pytest.mark.order(index="ninth"),ninth表示第9個,執行后會告警,但是不影響使用

3 在測試類上做標記

如果order在測試類上設置標記,則該類中的所有測試將被視為具有相同的序數標記,例如,整個測試類會重新排序,而不會改變測試類內的測試順序。

舉例:標記以下類順序。

預期結果是 先執行Testcase2的test_2_1,test_2_2,然后執行Testcase1的test_1_1,test_1_2

執行結果如下:符合預期

舉例:同時標記類和類內的用例順序,以用例標記為準

預期結果是 先執行Testcase1的test_1_2,test_1_1,然后執行Testcase2的test_2_2,test_2_1

執行后結果如下:符合預期

4 相對于其他測試用例的順序

通過標記屬性before和after引用其他測試用例的名稱,before表示要在引用測試用例之前執行,after表示在引用測試用例之后執行。

引用的測試用例支持如下幾種情況:

1)本文件內函數級用例引用其他函數級用例

預期結果是先執行test_3,然后test_2,最后test_1

執行后結果:符合預期

2)本文件內函數級用例引用其他測試類中的用例

預期結果是先執行test_3,然后Testcse1.test_1_1,Testcse1.test_1_2,最后是test_1

執行結果如下:符合預期

3)本文件內用例引用其他文件中的用例

舉例: 在同一個目錄有兩個測試文件test_case1.py和test_case2.py,其中test_case1.py文件中的用例通過before和after引用了test_case2.py文件中的test_1用例,

當執行這個目錄的用例時,預期結果是:先執行test_case1.py.test_2,然后是test_case2.py.test_1,然后是test_case1.py.test_1,最后是test_case2.py.test_2

執行后結果: 符合預期

4)在測試類上標記其他測試類

使用before或?after標記屬性來引用測試類,標記類中的測試將排在引用類中的所有測試前面或者后面。

舉例:標記Testcase1類在Testcase2之后運行,并且設置Testcase2中先運行test_2_2

執行后結果:符合預期

5 絕對排序和相對排序的組合

如果將絕對順序標記和相對順序標記組合在一起,則首先對絕對標記(例如序數)進行排序,然后再對相對標記(before或者after)進行排序,這意味著相對順序始終優先。

舉例:設置如下兩條用例,test_1_1用例標記index=1和after=’tet_1_2’,雖然設置test_1_2順序為0,但按照相對順序優先的原則,預期先執行test_1_2,然后再執行test_1_1。

執行結果如下:符合預期

6 同一標記的幾種關系

如果需要相對于多個其他測試用例的順序對某個測試用例進行排序,則可以使用測試名稱列表或元組將多個測試名稱添加到before或after參數中。

舉例:設置如下4條用例,測試類Testcase.test_1_1用例標記在Testcase1.test_1_2和Testcase2.test_2_2之后執行。同時標記Testcase2.test_2_1和Testcase2.test_2_2的順序。

如果Testcase.test_1_1不做標記,執行順序為Testcase2.test_2_2 > Testcase2.test_2_1 > Testcase1.test_1_1 > Testcase1.test_1_2

但是標記之后,預期執行順序是Testcase2.test_2_2 > Testcase2.test_2_1 > Testcase1.test_1_2 > Testcase1.test_1_1

執行后結果: 符合預期

7 與參數化測試的關系

1)引用被參數化的測試用例,只能使用測試名稱,而不能引用某個參數。

舉例:設置2條用例,test_2用例設置3個參數,而test_1標記after=’test_2’,只能標記測試用例名稱。

預期是先執行3條test_2,然后再執行test_1

執行結果:符合預期

2) 在參數化用例上設置順序標記

舉例:設置2條用例,test_2用例設置3個參數并標記順序為0

預期是先執行3條test_2,然后再執行test_1

執行結果:符合預期

8 用例上設置多個順序標記

可以為測試設置多個順序標記,在這種情況下,測試將按照定義的順序執行多次。

舉例:設置2條用例,test_1用例標記順序0和1,test_2用例設置3個參數,標記兩個順序1和3,

預期是先執行 test_1,然后再執行3條test_2,再執行test_1,最后執行3條test_2

執行結果:符合預期

? ? ? 以上就是介紹的插件pytest-order的功能,但實際在編寫測試用例時還是要盡量避免存在過多的用例的順序依賴,如果有依賴可以參考之前文章介紹盡量使用setup或者teardown功能,總之我們要考慮盡可能減少后期維護用例的工作量。

共勉: 東漢·班固《漢書·枚乘傳》:“泰山之管穿石,單極之綆斷干。水非石之鉆,索非木之鋸,漸靡使之然也。”

-----指水滴不斷地滴,可以滴穿石頭;

-----比喻堅持不懈,集細微的力量也能成就難能的功勞。

----感謝讀者的閱讀和學習,謝謝大家。

---祝愿大家都能夠龍騰虎躍,步步高升!!!

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

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

相關文章

華為云安全防護,九河云綜合分解優劣勢分析

隨著全球化的發展,越來越多的企業開始尋求在國際市場上擴展業務,這一趨勢被稱為企業出海。然而,企業在海外擴張面臨諸多隱患與安全挑戰,其中因為地域的不同,在安全性方面與國內相比會變得薄弱,從而導致被黑…

如何在瀏覽器中查看網頁的HTML源代碼?

如何在瀏覽器中查看網頁的HTML源代碼? 瀏覽html網頁,查看其源代碼,可以幫助我們了解該版網頁的信息以及架構,每個瀏覽器都是允許用戶查看他們訪問的任何網頁的HTML源代碼的。以下編程獅小師妹就介紹幾個常見瀏覽器的查看網頁 HTM…

mysql安裝創建數據庫防止踩坑

為了安裝MySQL的家人們走彎路,稍微有些啰嗦,講述我安裝的時遇到的問題,如何解決。仔細看看離成功不遠。 mysql下載鏈接 MySQL :: Download MySQL Community Server windows下安裝mysql-8.0.29-winx64,下載安裝包后解壓到文件夾中…

C語言 | Leetcode C語言題解之第191題位1的個數

題目: 題解: int hammingWeight(uint32_t n) {int ret 0;while (n) {n & n - 1;ret;}return ret; }

基于深度學習的文本檢索

基于深度學習的文本檢索 文本檢索(Text Retrieval)是指在大量文本數據中,根據用戶的查詢文本找到相關文檔。基于深度學習的方法通過提取文本的高層次語義特征,實現了高效和準確的文本檢索。 深度學習在文本檢索中的優勢 語義理…

Windows安裝jdk配置環境變量(基礎)

一、下載安裝JDK 下載地址:https://www.oracle.com/java/technologies/downloads/?er221886#java8-windows 因為JDK8比較穩定,所以建議選擇這個。電腦32位的下載jdk-8u411-windows-i586.exe;電腦是64位的下載jdk-8u411-windows-x64.exe 1、…

鏈動2+1模型:驅動用戶增長與業務提升的新引擎

大家好,我是吳軍,來自一家業界領先的科技創新公司。在今天,我想與大家分享一個在我們業務中取得顯著成果的運營策略——鏈動21模型,以及它是如何助力我們優化用戶滿意度,提高用戶粘性和促進復購率的。 盡管鏈動模式在業…

安裝Flask

自學python如何成為大佬(目錄):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 大多數Python包都使用pip實用工具安裝,使用Virtualenv創建虛擬環境時會自動安裝pip。激活虛擬環境后,pip 所在的路徑會被添加…

計算機組成原理——系統總線

題目:計算機使用總線結構便于增減外設,同時__C____。 A.減少了信息傳送量 B.提高了信息傳輸速度 C.減少了信息傳輸線的條數 1. 總線的分類 1.1. 片內總線 芯片內部的總線 在CPU芯片內部,寄存器與寄存器之間、寄存器與邏輯單元ALU之間 1.1.1. 數據總線 雙向傳輸總線 數…

深入解析B樹:節點子節點數量的奧秘

在計算機科學中,B樹是一種自平衡的樹形數據結構,它能夠保持數據有序,并且允許進行高效的搜索、順序訪問、插入和刪除操作。B樹廣泛應用于數據庫和文件系統的索引結構中,因為它可以有效地減少磁盤I/O操作次數。本文將深入探討B樹的…

VUE----通過nvm管理node版本

使用 NVM(Node Version Manager)來管理和切換 Node.js 版本是一個很好的選擇。以下是在 蘋果電腦macos系統 上使用 NVM 安裝和切換 Node.js 版本的步驟: 1. 安裝 NVM 如果你還沒有安裝 NVM,可以按照以下步驟進行安裝: 打開終端,運行以下命令以下載并安裝 NVM: curl …

c語言中的for循環

在C語言中,for循環是控制結構之一,用于多次執行一段代碼。其具體用法如下: 語法 for (初始化表達式; 條件表達式; 更新表達式) {// 循環體 }參數說明 初始化表達式:在循環開始前執行一次,用于初始化循環控制變量。條…

BeautifulSoup解析HTML

需要解析HTML源碼里面的內容&#xff0c;包含特定標簽和屬性 <div class"file-source"><table><tr><th align"right">Line</th><th align"right">Branch</th><th align"right">Exec…

箭頭函數的應用場景

箭頭函數是 ES6 中新增的一種函數書寫方式&#xff0c;通常用于簡潔地定義匿名函數。它的應用場景包括但不限于以下幾個方面&#xff1a; 1.簡化回調函數&#xff1a;箭頭函數可以讓回調函數的書寫更加簡潔&#xff0c;減少代碼量。 // 傳統函數形式 setTimeout(function() {…

麒麟系統安裝Redis

一、背景 如前文&#xff08;《麒麟系統安裝MySQL》&#xff09;所述。 二、下載Redis源碼 官方未提供麒麟系統的Redis軟件&#xff0c;須下載源碼編譯。 下載地址&#xff1a;https://redis.io/downloads 6.2.14版本源碼下載地址&#xff1a;https://download.redis.io/re…

Linux系統中管理文件和目錄權限的詳細說明,部署服務器遇到文件權限的問題,就想著記錄一下

Linux 文件權限基礎 在Linux中&#xff0c;每個文件和目錄都關聯著三個類別的權限&#xff1a; 所有者&#xff08;Owner&#xff09;&#xff1a;通常是創建文件或目錄的用戶。組&#xff08;Group&#xff09;&#xff1a;與文件或目錄關聯的用戶組。組成員共享文件的組權限…

【linux】socket通信代碼解析

目錄 一、Linux中Socket編程的基本步驟 1.1 創建Socket 1.2 綁定Socket 2.3 監聽Socket(僅服務器端) 2.4 接受連接(僅服務器端) 2.5 連接Socket(僅客戶端) 2.6 發送和接收數據 2.7. 關閉Socket 二、Linux中Socket編程具體實現 2.1 TCP服務器 2.2 TCP客戶端 2…

生成隨機函數f3,利用f3生成f18(python)

一、題目 給定一個完全隨機函數f3。能夠完全隨機產生1~3之間任意一個自然數。現在要構造一個f18&#xff0c;讓其能隨機產生1~18之間任意一個自然數&#xff0c;要求寫出f18的函數&#xff0c;另外要測試是否符合預期&#xff0c;f18要用f3 二、代碼 歡迎大家給我更優解&…

mac 安裝mysql啟動報錯 ERROR!The server quit without update PID file

發現問題&#xff1a; mac安裝mysql初次啟動報錯&#xff1a; 一般出現這種問題&#xff0c;大多是文件夾權限&#xff0c;或者以前安裝mysql卸載不干凈導致。首先需要先確定問題出在哪&#xff1f;根據提示我們可以打開mysql的啟動目錄&#xff0c;查看啟動日志。 問題解決&a…

項目如何整合sentinel

1、添加依賴 <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifact…