初學 pytest 記錄

  1. 安裝

    pip install pytest
    

    用例可以是函數也可以是類中的方法

    def test_func():print()class TestAdd:
    # def __init__(self):  在 pytest 中不可以使用__init__方法
    #     self.cc = 12345
    @pytest.mark.api
    def test_str(self):res = add('1', '2')assert res == '12'def test_int(self):res = add(1, 2)assert res == 3def test_list(self):res = add([1, 2], [3, 4])assert res == [1, 2, 3, 4]
    
  2. 啟動測試

    • 命令行輸入 pytest 會自動檢索項目中所有的用例去執行 參數 -k “xx” 模糊匹配文件執行
    • 根目錄新建 main.py 文件 右鍵運行腳本
    main.py
    import pytest
    pytest.main()
    
  3. 用戶自定義標記

    可以根據不同類型的用例分成不同的種類.在用例多的情況下可以根據需求執行部分種類測試日志.
    配置
    創建配置文件,我這邊創建在項目的根目錄下 pytest.ini

    [pytest]
    markers =api : 接口測試ui : UI測試ut : 重試login : 登錄測試ddt: 數據驅動測試
    

    在 markers 中key:value 形式的就是自定義的標記,名稱:注釋
    打標記
    @pytest.mark.標記名稱來使用.

    @pytest.mark.tt
    def test_func():print()
    

    使用

    • 命令行
    pytest -m 標記名稱
    
    • 添加到配置文件中 pytest.ini 在配置文件中添加參數后.在命令行直接執行 pytest 會自動攜帶addopts中的參數
    [pytest]
    addopts = -m 標記名稱
    
  4. 內置標記

    • skip 無條件跳過
    • skipif 滿足條件跳過
    • xfail 預期失敗
    • xfailif 滿足條件預期失敗
    • parametrize 參數化
      使用@pytest.mark.parametrize標記.參數1為字段,參數 2 為函數解析出來的嵌套列表
      @pytest.mark.parametrize('a, b, c', read_csv('/Users/nieminghua/Desktop/pycode/pythonProject/Apytest/data.csv'))
      def test_ddt(a, b, c):assert int(a) + int(b) == int(c)
      
  5. 夾具-fixture

    我把fixture 理解成用例執行的前置操作和后置操作(鉤子函數)
    比如,在對 web 網站進行測試時,前置必要條件需要先打開瀏覽器.測試完畢后關閉瀏覽器.

    • fixture 可以被 fixture 調用
    • 在fixture中的yield關鍵字可以返回值,只能返回 1 個值
    • 在使用 fixture 中參數scope可以控制夾具的作用范圍
      1. function 默認值, 每個用例都會執行一遍
      2. class 每個類執行一遍
      3. module 每個模塊執行一遍
      4. session 每個會話執行一遍
      5. package 每個包執行一遍
    如果不指定作用域,則每個用例執行都會單獨去執行 fixture
    @pytest.fixture()
    def func2():# 前置操作print(datetime.now(), "func2用例開始執行")yield [1, 2, 3]# 后置操作print(datetime.now(), "func2用例執行結束")@pytest.mark.usefixtures("func",'func2')
    def test_1():print('test1')@pytest.mark.usefixtures("func",'func2')
    def test_2():print('test2')>>>
    Apytest/test_fixture.py::test_1 2025-06-05 18:32:58.075634 func1用例開始執行
    2025-06-05 18:32:58.077104 func2用例開始執行
    test1
    PASSED2025-06-05 18:32:58.078129 func2用例執行結束
    2025-06-05 18:32:58.078950 func1用例執行結束Apytest/test_fixture.py::test_2 2025-06-05 18:32:58.080741 func1用例開始執行
    2025-06-05 18:32:58.080920 func2用例開始執行
    test2
    PASSED2025-06-05 18:32:58.081668 func2用例執行結束
    2025-06-05 18:32:58.082254 func1用例執行結束
    

    指定作用域給 fixture 添加scope=“session”

    @pytest.fixture(scope='session')
    def func():# 前置操作print(datetime.now(), "func1用例開始執行")yield# 后置操作print(datetime.now(), "func1用例執行結束")@pytest.fixture(scope='session')
    def func2():# 前置操作print(datetime.now(), "func2用例開始執行")yield [1, 2, 3]# 后置操作print(datetime.now(), "func2用例執行結束")@pytest.mark.usefixtures("func",'func2')
    def test_1():print('test1')@pytest.mark.usefixtures("func",'func2')
    def test_2():print('test2')>>>
    Apytest/test_fixture.py::test_1 2025-06-06 14:54:55.729863 func1用例開始執行
    2025-06-06 14:54:55.730163 func2用例開始執行
    test1
    PASSED
    Apytest/test_fixture.py::test_2 test2
    PASSED2025-06-06 14:54:55.733253 func2用例執行結束
    2025-06-06 14:54:55.733882 func1用例執行結束

    對于一些更通用的 fixture 可以定義在conftest.py 文件中.給 fixture添加 autouse=True 參數,和 scope 指定作用域,這樣所有的用例在作用域范圍內都會自動關聯到 fixture.(fixture同樣可以嵌套使用)

    conftest.py
    在 func2 方法中調用了 func 所以即使 func 并沒有 autouse=True,一樣會被調用.
    @pytest.fixture(scope='session')
    def func():# 前置操作print(datetime.now(), "conftest_func1用例開始執行")yield# 后置操作print(datetime.now(), "conftest_func1用例執行結束")@pytest.fixture(autouse=True, scope='session')
    def func2(func):# 前置操作print(datetime.now(), "conftest_func2用例開始執行")yield [1, 2, 3]# 后置操作print(datetime.now(), "conftest_func2用例執行結束")>>>>
    Apytest/test_fixture.py::test_1 2025-06-06 16:29:25.996684 conftest_func1用例開始執行
    2025-06-06 16:29:25.997059 conftest_func2用例開始執行
    test1
    PASSED
    Apytest/test_fixture.py::test_2 test2
    PASSED2025-06-06 16:29:26.000212 conftest_func2用例執行結束
    2025-06-06 16:29:26.001231 conftest_func1用例執行結束
  6. 測試報告

    這里用到第三方插件allure

    	pip install allure-pytest
    

    allure下載地址官網

    添加啟動命令

    pytest.ini
    [pytest]
    addopts =  --alluredir=allure-results --clean-alluredir
    

    加上這條命令后執行完會生成一個allure-results文件,里邊放著 json 格式的測試日志.
    在這里插入圖片描述
    之后在執行allure generate allure-results -o allure-report --clean命令. -o 參數為報告輸出路徑
    之后打開目錄里的 index.html 就可以看到報告
    在這里插入圖片描述

    可以在 main.py 文件中通過 os 模塊來執行生成的動作,這樣每次執行完用例會自動生成報告

    import pytest
    import ospytest.main()os.system("allure generate allure-results -o allure-report --clean")
    

    用例分類
    在報告中按功能給用例分類.

    • @allure.epic 項目名稱
    • @allure.feature 模塊名稱
    • @allure.story 業務場景名稱
    • @allure.title 標題
    • @allure.description 描述
    • @allure.setup 環境信息
    • @allure.testcase 測試用例鏈接
    • @allure.issue 缺陷鏈接
    • @allure.link 鏈接
    @allure.epic("hil測試")
    @allure.feature("故障注入")
    @allure.story("CVD")
    @allure.title("HTO")
    @allure.description("描述 11")
    @allure.testcase("https://www.baidu.com", "用例鏈接")
    @allure.issue("https://www.sogou.com", "缺陷鏈接", )
    @allure.link("鏈接")
    @pytest.mark.ut
    def test_01():assert 1 == 1@allure.epic("hil測試")
    @allure.feature("故障注入")
    @allure.story("CVD")
    @allure.title("低壓")
    @allure.description("描述 11")
    @allure.testcase("www.baidu.com", "用例鏈接")
    @allure.issue("www.sogou.com", "缺陷鏈接", )
    @pytest.mark.ut
    def test_02():assert 1 == 2@allure.epic("hil測試")
    @allure.feature("故障注入")
    @allure.story("HTO")
    @allure.description("描述 11")
    @allure.testcase("www.baidu.com", "用例鏈接")
    @allure.issue("www.sogou.com", "缺陷鏈接", )
    @pytest.mark.ut
    def test_03():assert 1 == 1
    

    在這里插入圖片描述

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

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

相關文章

【LeetCode】算法詳解#6 ---除自身以外數組的乘積

1.題目介紹 給定一個整數數組 nums,返回 數組 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘積 。 題目數據 保證 數組 nums之中任意元素的全部前綴元素和后綴的乘積都在 32 位 整數范圍內。 請 不要使用除法,且在 O…

Kubernetes 節點自動伸縮(Cluster Autoscaler)原理與實踐

在 Kubernetes 集群中,如何在保障應用高可用的同時有效地管理資源,一直是運維人員和開發者關注的重點。隨著微服務架構的普及,集群內各個服務的負載波動日趨明顯,傳統的手動擴縮容方式已無法滿足實時性和彈性需求。 Cluster Auto…

LLMs 系列科普文(11)

目前我們已經介紹了大語言模型訓練的兩個主要階段。第一階段被稱為預訓練階段,主要是基于互聯網文檔進行訓練。當你用互聯網文檔訓練一個語言模型時,得到的就是所謂的 base 模型,它本質上就是一個互聯網文檔模擬器,我們發現這是個…

深度學習環境配置指南:基于Anaconda與PyCharm的全流程操作

一、環境搭建前的準備 1. 查看基礎環境位置 conda env list 操作說明:通過該命令確認Anaconda默認環境(base)所在磁盤路徑(如D盤),后續操作需跳轉至該磁盤根目錄。 二、創建與激活獨立虛擬環境 1. 創…

【2D與3D SLAM中的掃描匹配算法全面解析】

引言 掃描匹配(Scan Matching)是同步定位與地圖構建(SLAM)系統中的核心組件,它通過對齊連續的傳感器觀測數據來估計機器人的運動。本文將深入探討2D和3D SLAM中的各種掃描匹配算法,包括數學原理、實現細節以及實際應用中的性能對比,特別關注…

力扣160.相交鏈表

題目描述 難度:簡單 示例 思路 使用雙指針 使用指針分別指向兩個不同的鏈表進行比較 解題方法 1.首先進行非空判斷 2.初始化指針分別指向兩個鏈表 3.遍歷鏈表 while (pA ! pB): 當pA和pB不相等時,繼續循環。如果pA和pB相等,說明找…

本地項目push到git

cd /home/user/project git init 添加遠程倉庫地址 git remote add origin https://github.com/user/repo.git 創建并切換到新分支 git checkout -b swift 添加文件到暫存區 git add . git commit -m “swift訓練評測” git push -u origin swift —force #首次 git push …

uni-app學習筆記二十九--數據緩存

uni.setStorageSync(KEY,DATA) 將 data 存儲在本地緩存中指定的 key 中&#xff0c;如果有多個key相同&#xff0c;下面的會覆蓋掉原上面的該 key 對應的內容&#xff0c;這是一個同步接口。數據可以是字符串&#xff0c;可以是數組。 <script setup>uni.setStorageSyn…

GitHub 趨勢日報 (2025年06月06日)

&#x1f4ca; 由 TrendForge 系統生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日報中的項目描述已自動翻譯為中文 &#x1f4c8; 今日獲星趨勢圖 今日獲星趨勢圖 590 cognee 551 onlook 399 project-based-learning 348 build-your-own-x 320 ne…

NFC碰碰卡發視頻源碼搭建與寫卡功能開發實踐

在信息快速傳播的時代&#xff0c;便捷的數據交互方式成為用戶的迫切需求。“碰一碰發視頻” 結合寫卡功能&#xff0c;為視頻分享提供了新穎高效的解決方案&#xff0c;在社交娛樂、商業推廣等場景中展現出巨大潛力。本文將詳細介紹碰一碰發視頻源碼搭建以及寫卡功能開發的全過…

詳解K8s 1.33原地擴縮容功能:原理、實踐、局限與發展

你是否有過這樣的經歷&#xff1f; 精心配置了 Kubernetes 的 Pod&#xff0c;設置了“剛剛好”的 CPU 和內存&#xff08;至少你當時是這么想的&#xff09;&#xff0c;結果應用不是資源緊張喘不過氣&#xff0c;就是像“雙十一”搶購一樣瘋狂搶占資源。 過去&#xff0c;唯…

IOS 打包賬號發布上傳和IOS Xcode證書配置

xcode下載 https://developer.apple.com/download/all/ App發布 https://appstoreconnect.apple.com/ https://appstoreconnect.apple.com/teams/83ba877c-af24-4fa5-aaf2-e9b9b6066e82/apps/6473148620/testflight/groups/eb983352-b2e2-4c29-bbb7-071bf7287795 https://devel…

【從零學習JVM|第三篇】類的生命周期(高頻面試題)

前言&#xff1a; 在Java編程中&#xff0c;類的生命周期是指類從被加載到內存中開始&#xff0c;到被卸載出內存為止的整個過程。了解類的生命周期對于理解Java程序的運行機制以及性能優化非常重要。本文會深入探尋類的生命周期&#xff0c;讓讀者對此有深刻印象。 目錄 ?…

Significant Location Change

一、Significant Location Change是什么 “Significant Location Change&#xff08;重大位置變化&#xff09;” 是蘋果 iOS 系統中一項用于在應用未主動運行時&#xff0c;監測設備位置顯著變化的功能。它主要通過基站、Wi-Fi 網絡等信號來判斷設備是否發生了有意義的位置移…

ubuntu22.04有線網絡無法連接,圖標也沒了

今天突然無法有線網絡無法連接任何設備&#xff0c;并且圖標都沒了 錯誤案例 往上一頓搜索&#xff0c;試了很多博客都不行&#xff0c;比如 Ubuntu22.04右上角網絡圖標消失 最后解決的辦法 下載網卡驅動&#xff0c;重新安裝 操作步驟 查看自己網卡的型號 lspci | gre…

基于cnn的通用圖像分類項目

背景 項目上需要做一個圖像分類的工程。本人希望這么一個工程可以幫助學習ai的新同學快速把代碼跑起來&#xff0c;快速將自己的數據集投入到實戰中&#xff01; 代碼倉庫地址&#xff1a;imageClassifier: 圖片分類器 代碼切到master分支&#xff0c;master分支是本地訓練圖…

【HarmonyOS 5 開發速記】如何獲取用戶信息(頭像/昵稱/手機號)

1.獲取 authorizationCode&#xff1a; 2.利用 authorizationCode 獲取 accessToken&#xff1a;文檔中心 3.獲取手機&#xff1a;文檔中心 4.獲取昵稱頭像&#xff1a;文檔中心 首先創建 request 若要獲取手機號&#xff0c;scope必填 phone&#xff0c;permissions 必填 …

從OCR到Document Parsing,AI時代的非結構化數據處理發生了什么改變?

智能文檔處理&#xff1a;非結構化數據提出的挑戰 在這個時代的每一天&#xff0c;無論是個人處理賬單&#xff0c;還是企業處理合同、保險單、發票、報告或成堆的簡歷&#xff0c;我們都深陷在海量的非結構化數據之中。這類數據不像整齊排列的數據庫表格那樣規整&#xff0c;…

Python Ovito統計金剛石結構數量

大家好,我是小馬老師。 本文介紹python ovito方法統計金剛石結構的方法。 Ovito Identify diamond structure命令可以識別和統計金剛石結構,但是無法直接輸出結構的變化情況。 本文使用python調用ovito包的方法,可以持續統計各步的金剛石結構,具體代碼如下: from ovito…

相關類相關的可視化圖像總結

目錄 一、散點圖 二、氣泡圖 三、相關圖 四、熱力圖 五、二維密度圖 六、多模態二維密度圖 七、雷達圖 八、桑基圖 九、總結 一、散點圖 特點 通過點的位置展示兩個連續變量之間的關系&#xff0c;可直觀判斷線性相關、非線性相關或無相關關系&#xff0c;點的分布密…