pytest「conftest、pytest參數化、重運行、出測試報告」

2021-03-02 清菡軟體測試
文章總覽圖

一、conftest問題整理:

1.這個conftest.py分路徑嗎?如果在TestCases下建這個包可以直接用嗎?

TestCases這裡有ModeA和ModeB,想在ModeA或ModeB下面用這個conftest.py裡面的,一樣全部都可以用。

看目錄結構,conftest.py是頂級目錄的。實際工作過程中,ModeA和ModeB是個獨立的模塊,這個獨立的模塊下有屬於自己的前置後置。如果ModeA和ModeB下面有5個模塊,把5個模塊的前置後置全部放在conftest.py裡面,會覺得太多也太繁瑣了,同樣存在問題。

conftest也支持包的層級,注意一定要是包。 為什麼命令行當中提示我引入失敗呢?

那是因為這個地方沒有創建成包的形式,一定要以Python包的形式創建:

在ModeA或ModeB下面同樣可以右鍵創建conftest,可以作為本模塊下的conftest,名字照樣是conftest,因為它只有一個名字。

2.在這個文件夾裡創建的conftest,可以針對本模塊做一些事情。

但是會存在一些問題,這個conftest和最外層的conftest,它有函數名稱是重複的。如果存在函數名稱重複,按照常規的思路,優先使用自己模塊下的conftest,相當於是在子級的conftest當中,對它去做重寫

類和對象當中有學過,子類當中會覆蓋父類的同名函數。這裡本質上的意思是一樣的,雖然我沒有定義成類和對象。

如圖,有個和它重名的conftest,那麼在ModeB下面就用自己模塊下的conftest裡面的函數。

所以,它是允許分層創建的。也允許在外面放個大的conftest:

這個大的conftest裡面可以放ModeA和ModeB這樣的模塊裡面都涉及到的前置和後置。如果是ModeA或ModeB獨有的前置和後置,那麼就放在它們自己目錄下的conftest裡面就可以了。所以它是支持層級的。

3.一個文件夾下不宜放太多的.py文件,不然你會發現一個文件夾下的文件列表會很長。

具體怎麼放,視實際情況而定,切記不可死讀書。

二、pytest參數化

pytest當中不能使用ddt。流程性質的東西,在pytest裡面叫做參數化。

1.pytest和ddt的方式很像,但是還是有區別的:

@pytest.mark.parametrize("參數名",列表數據)

你看,它後面跟了2個變量,ddt當中只要跟一個變量就可以了。比如現在有好幾組數據,那在我們ddt當中用一個*號就可以解決它。但是這裡不行。

這裡最基本的用法是這樣的:

2.首先在這裡整個參數名,這個參數名的作用是什麼?

因為你這個數據是要給測試用例用的。那麼這個參數名就是用來接收每一組數據,如果你這個列表當中有10組數據,那麼參數名就依次接收這10組數據。

參數名是放在測試用例當中的參數。列表數據就是那10組數據。

它是作為函數的參數傳進來的。

3.這個參數名能都叫data嗎?

當然可以。

4.運行的時候它告訴我搜集了多少測試用例,沒有報錯就證明沒問題。

要麼從文件開頭開始運行,要麼從文件結束開始運行。

5.為什麼會報錯?

登錄用例當中用到了pytest當中的fixture,access_web是我們的前置條件。它代表了它的返回值,我們有修改,但是我們在這個地方並沒有修改:

第一張圖,我們可以看到,搜集了8個用例,那就證明這樣的寫法是沒錯的。

6.接收下access_web。前置條件中返回的driver對象以及login的對象。

7.為什麼我這裡不是py開頭?

可以這樣設置:

8.在控制臺運行,如果有多個文件夾,是不是要先切換到當前的文件夾,再用pytest?

Terminal裡面直接是當前的工程路徑。和多個文件夾沒關係,是從當前路徑下面一層一層去找到對應的就行了。

三、重運行

Web自動化中還重視重運行

在調試的時候會發現用例有的時候能運行成功,有的時候它不能運行成功。Web自動化的用例,準確來說是不太穩定的。它和網頁網速、渲染的速度、伺服器的狀態和自己寫腳本的能力都有關係。這些都導致腳本不是特別穩定。

寫的每條測試用例應該在本地連續運行3-5次以上。如果沒有報錯,都能夠執行通過,那這種情況下才算在本地調試通過。但是在本地調試通過,不代表在其它的電腦上就一定能調試通過。這是個正常的現象,不要懷疑。

因為不同的電腦,環境也是不一樣的。但是你的腳本是一樣的,所以大家把代碼寫好放在其它伺服器上去運行的時候,還是需要有一個調試的過程。 但是你在本地調試通過後,再去其它的伺服器上調試,問題就會少很多,只有一些小問題需要調試下了。

針對這個現象,Web自動化中有個機制叫做重運行。重運行是專門針對失敗的測試用例去重新運行一下

如果第一次有8個測試用例,運行成功後有2個失敗了。那麼這2個會重運行。

1.是在這個用例失敗後馬上重運行,還是等全部用例執行完成後再去把這些失敗的用例選出來再去運行?

pytest它的重運行原則是當前這個用例失敗後馬上重運行。

它的重運行也是命令行,但是需要裝插件。插件的名稱是rerunfailures(翻譯為重運行失敗的用例)

安裝命令:pip install pytest-rerunfailures

四、出測試報告

我想在jenkins上直接看到測試報告(方便測試經理或產品經理看這個項目的測試結果)。只需自己登錄jenkins上看下最新的測試結果數據。

1.xml就是給jenkins集成這樣的東西。我們可以進一步解析xml文件,接口測試中有一種數據表達方式就是xml,xml是用來存儲數據。我們拿到這樣的數據就可以解析。

第一,如果想二次定製更漂亮的測試報告,可以解析這個xml。

第二,外部的一些軟體想要獲取測試結果,放到別人的平臺上去。那就是通過xml的解析。

2.result log就是在控制臺中看到輸出的樣子。這個格式基本沒啥用。

3.Html和Htmltestrunner的區別是比較大的。

以上3種測試報告都有自己的命令格式。xml和result log這2種是自帶的,只有Html是需要安裝插件的。

命令:

pytest -m demo --reruns 2 --reruns-delay 5 -s --junitxml=Outputs/reports/report.xml --html=Outputs/a.html

怎麼寫命令,根據實際情況而定,有時候配置了pycharm後,命令也不一樣,所以不可死讀書。

命令的順序沒有要求,可隨便放。

相對路徑:相對於當前的工程。

不支持絕對路徑,只支持相對路徑。

出來的html報告是這個樣子的:

路徑這個東西表達的方式也是相對路徑,因為我們運行的時候是在當前工程這個目錄下,所以相對的都是工程的路徑。

自己寫的logging也可以配置參數在這裡輸出日誌。

歡迎掃碼關注!

相關焦點

  • Pytest系列(6) - conftest.py的詳細講解
    conftest.py的出現,就是為了解決上述問題,單獨管理一些全局的fixture conftest.py配置fixture注意事項pytest會默認讀取conftest.py裡面的所有fixtureconftest.py 文件名稱是固定的,不能改動conftest.py只對同一個package下的所有測試用例生效不同目錄可以有自己的
  • Pytest中conftest.py共享fixture(五)
    有一點首先需要確認的的是,pytest中的fixture是pytest用於將測試前後進行預備,清理工作的代碼分離出核心測試邏輯的一種機制
  • pytest(8):fixture與conftest.py結合使用
    上一篇介紹了fixture scope的幾種使用方式,除了直接寫入到用例頁,也可以使用conftest.py文件達到同樣的效果。  1.conftest.py名稱是固定的,必須是這個不能變。  2.與要調用的包在一個目錄下,並且這個包下要有__init__.py   3.使用的時候不需要導入 conftest.py,pytest 會自動識別到這個文件  4.放到項目的根目錄下可以全局調用,放到某個 package 下,就在這個 package 內有效。
  • Python測試框架Pytest的常用插件測試報告
    ·打開測試報告:allure open·生成臨時報告並打開:allure serve2.2 生成測試報告(1)allure-pytest 插件收集測試結果數據:在 pytest 命令行或 pytest.ini 配置文件 addopts
  • pytest文檔42-fixture參數化params
    ddt 來實現測試用例的參數化。pytest 測試用例裡面對應的參數可以用 parametrize 實現,隨著用例的增多,我們的需求也會越來越多,那麼如何在 fixture 中使用參數呢?fixture 源碼先看下 fixture 源碼,有這幾個參數:scope,params,autouse,ids,name。
  • 手把手教你pytest測試框架(7)-fixture裝飾器
    測試框架(1)-初識框架手把手教你pytest測試框架(2)-參數講解手把手教你pytest測試框架(3)-用例失敗重跑手把手教你pytest測試框架(4)-前置和後置手把手教你pytest測試框架(5)-mark標記裝飾器概念fixture用來完成那些需要多次重複執行的用例
  • 乾貨 | 一文搞定 pytest 自動化測試框架(一)
    >運行 test_add.py 文件,在命令行進入到這個文件所在的路徑,可以直接使用 pytest 命令運行,pytest 會找當前目錄以及遞查找子目錄下所有的 test_*.py 或 *_test.py 的文件,把其當作測試文件。
  • 基於Pytest框架的自動化測試開發實踐(萬字長文入門篇)
    測試框架的作用是,幫助我們管理測試用例、執行測試用例、參數化、斷言、生成測試報告等基礎性工作,讓我們將精力用在測試用例的編寫上。好的測試框架應該具有很高的擴展性,支持二次開發,並能夠支持多種類型的自動化測試。
  • 實戰 | 接口自動化測試框架開發(Pytest+Allure+AIOHTTP+用例自動生成)
    認可的測試用例首先說明下 pytest 的運行機制,pytest 首先會在當前目錄下找 conftest.py 文件,如果找到了,則先運行它,然後根據命令行參數去指定的目錄下找 test 開頭或結尾的 .py 文件,如果找到了,如果找到了,再分析 fixture,如果有 session 或 module 類型的,並且參數 autotest=True 或標記了 pytest.mark.usefixtures
  • python自動化測試之pytest框架
    pytest測試框架也是主流的一個測試框架,想比於unnitest框架來說,其不需要像unittest那樣單獨創建類繼承unittest.TestCase,而只需要創建測試類或者測試文件,然後以test開頭,pytest可以按照這個規則找到測試用例並執行。
  • 技術面試沒過,居然是因為沒用過 pytest 單元測試框架
    顯性的去調用 test_add 這個函數。這還只是在我們只測試了一個函數的情況下,當需要測試的函數或者類越來越多的時候,這個過程會越來越複雜。而使用單元測試框架,可以極大的簡化我們對單元測試的過程,使用單元測試框架以後,框架會幫我們自動去收集用例、運行用例、生成報告。
  • Pytest之命令行執行
    基於SAAS化的架構下,特別是面對to B類型的產品,那麼測試經常面對的就是如何來測試每個上層應用。其實在底層微服務共享的模式下,更多的關注底層的微服務的測試,而對於上層應用來說,只需要隨機的選擇一個使用產品活躍度高的用戶來進行測試就可以了,從這個架構的模式下這樣的測試思路是沒有問題的,而且也是成立的。
  • Pytest丨如何使用全功能的Python測試框架?小白必看
    關注我,每周分享軟體測試技術乾貨、面試經驗,想要進入軟體測試學習交流群的可以直接私信我哦~~我們在寫自動化的過程中,用例的斷言也是至關重要的,斷言可以幫助我們判斷用例測試點是否成功和失敗。當然在我們這麼強大的pytest框架中,斷言也是比較強大的。為什麼?繼續往下看。
  • Pytest的基本應用(一)
    但是前提是需要安裝pytest,它是屬於第三方的庫,安裝的命令為:                   pip  install pytest          在這裡先寫一個函數的測試代碼,來說明pytest的應用,創建f.py的模塊,在裡面編寫以test開頭的測試代碼,然後在該目錄下執行pytest,發現測試代碼並沒有執行,見如下截圖
  • [接口測試_B] 04 Pytest斷言處理_告警斷言
    :import syssys.path.append(".")import pytestimport make_warningsclassTestWarns():deftest_depre(self):with pytest.warns(DeprecationWarning): make_warnings.fxn() deftest_not_warn
  • python pytest接口自動化框架搭建
    在單測文件中,可以包含test_開頭的函數,也可以包含Test開頭的類。在單測類中,可以包含一個或多個test_開頭的函數。此時,在執行pytest命令時,會自動從當前目錄及子目錄中尋找符合上述約束的測試函數來執行。
  • [接口測試_B] 03 Pytest斷言處理_assert和異常斷言
    ,對某些方法進行測試時,預測輸入某些特定數據,會拋出特定異常,若出現特定異常,則用例執行通過。import requestsimport pytestimport is_leap_yearclassTestAssert():# 對一個判斷是否是閏年的方法進行測試deftest_exception_typeerror(self):with
  • Pytest之並發執行(十四)
    (a,b,result): t.sleep(1) assert add(a,b)==result執行命令:pytest -v test_time.py執行後,輸出的結果信息顯示執行時間為9秒多,如下圖所示:     下面結合插件pytest-xdist來執行,執行的時候指定一定運行的處理器進程數
  • 同時連接多臺手機,使用appium實現app自動化測試
    三:conftest的改寫conftest是比較關鍵的一部,因為它會調用BaseDriver()類中的base_driver()方法,以往我們的conftest是這樣定義的:但是現在不同了,這個pytest的fixture為我們提供了一種參數化的操作,fixture可以帶入參數params,依賴於這個fixture的一套測試會根據參數的不同運行多次,而被裝飾函數中通過特殊的request對象來訪問每個參數:request.param訪問的是列表中的每個元素。
  • Pytest中斷言的重要性,就不需要我重複了吧
    出品 | 51Testing軟體測試網前言 我們在寫自動化的過程中,用例的斷言也是至關重要的,斷言可以幫助我們判斷用例測試點是否成功和失敗。當然在我們這麼強大的Pytest框架中,斷言也是比較強大的。為什麼?繼續往下看 。