1. 程式人生 > 實用技巧 >pytest「conftest、pytest引數化、重執行、出測試報告」

pytest「conftest、pytest引數化、重執行、出測試報告」

文章總覽圖

一、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當中的fixtureaccess_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也可以配置引數在這裡輸出日誌。


歡迎掃碼關注!