天天看點

一篇文章為你揭秘pytest的基本用法

pytest是一個測試架構,功能與unittest類似,完全相容unittest的功能。一般做接口測試的時候,以前用的多的是python+requests+httptestrunner完成接口自動化測試與報告生成,看到現在很多都在用pytest架構,我也來學習一下,接口測試中pytest應用廣泛的是通過python+pytest+allure生成測試報告,報告格式比較美觀。

文章比較長,先簡單概述一下本文的大概内容:

1、環境搭建以及pytest是怎麼運作的,如何識别有效用例

2、用例執行順序、參數傳遞、資料驅動

3、斷言,以及常見的pytest裝飾器

4、測試報告生成,包括自帶的pytest的報告以及內建allure的報告。

pytest安裝

檢視安裝版本:

cmd視窗輸入:pytest --version ,會在視窗中輸出類似下面格式的一句話:

this is pytest version 5.4.3, imported from d:\python38\lib\site-packages\pytest\__init__.py

用例的識别與運作

測試檔案以test_開頭(或者以_test結尾)

pytest會找目前以及遞歸查找子檔案夾下面所有的test_*.py或*_test.py的檔案,把其當作測試檔案(除非顯式指定檔案所在路徑)

測試類名稱以test開頭,并且不能帶有init方法

如果類名稱以test開頭的class類中包含了init方法,則會觸發告警,提示pytestcollectionwarning: cannot collect test class 'testxxx'

測試函數以test_開頭

斷言使用基本的assert即可

你們可能會有這樣的疑問,現在大家都在用類似pycharm的ide工具,為什麼還要去學習指令行運作的參數和方式呢?

pytest架構是一個測試架構,如果需要內建到jenkins上的話,是需要用指令行的方式去執行的,有時候要執行多個用例的時候,用指令行檔案比較友善。

pytest可以在指令行執行,在指令行執行的時候,可以帶很多參數,下面介紹幾種常用到的參數用法:(使用pytest --help可以看到指令參數的幫助文檔)

不帶參數執行

使用方法:pytest 或者 py.test  ,  将會讀取目前路徑下所有符合規則的檔案,類,方法,函數全部執行

-v 參數

列印詳細運作的日志資訊,友善定位問題

-s參數

可以在控制台輸出結果,當代碼中有用到print語句輸出資訊時,不加這個參數的話,控制台是不會顯示print的内容的

-k參數

使用該參數可以指定運作滿足要求的用例。用法如下:

注意: -k參數後面跟的引号隻能用雙引号"",不能用單引号'',否則不會識别到用例,運作會報錯

-x參數

遇到用例執行失敗或斷言失敗,立即停止運作,不執行後面的用例。

--maxfail參數

設定允許失敗的用例數,超過這個門檻值時,停止運作。

pytest --maxfail=num ,失敗用例數>=num時,停止運作 

-m參數

按照标簽名運作所有包含某個标簽的用例,需要在測試用例上面都加上裝飾符@pytest.mark.标記名。使用-m選項,可以使表達式指定多個标記名。使用-m "mark1 and mark2"可以同時選中帶有這兩個标記的所有測試用例。使用-m "mark1 and  not mark2"則會選中帶mark1标記且不帶mark2标記的測試用例,使用-m "mark1 or mark2"則會選中帶有mark1或者mark2的所有測試用例。

用例标記使用用法如下:

使用-m參數運作時,有可能會提示

pytestunknownmarkwarning: unknown pytest.mark.xxx - is this a typo?

這隻是一個告警,不影響實際執行結果。處理方式有以下幾種:

方法一:在測試用例檔案的根目錄建立conftest.py,内容如下:

方法二:在項目根路徑或者用例目錄下建立一個pytest.ini檔案,内容如下:

注意:有多個mark的時候,換行寫,要注意縮進,不縮進是無法識别的,每個mark名稱後面是可以加冒号,然後備注mark的相關較長的描述資訊。

方法三:在pytest.ini檔案中設定告警過濾,這樣可以避免由于mark标記使用過多時,要一個一個配置,比較麻煩。

具體使用方法可以參考官方文檔:

https://docs.pytest.org/en/latest/warnings.html

運作模式

pytest提供了多種運作模式,可以指定某個子產品,執行單個pytest子產品進行調試,也可以單獨運作某個類下面的某個測試方法。

指令行運作具體使用方法如下:

也可以在pycharm中運作pytest用例

1、先打開pycharm設定->tools->python integrated tools->testing:pytest    

(需要安裝pytest依賴,然後符合編寫規則的測試用例都能被pycharm識别出來,會在用例前面出現一個綠色的執行按鈕,點選這個按鈕就能執行某個方法或者某個類)

一篇文章為你揭秘pytest的基本用法
一篇文章為你揭秘pytest的基本用法

pytest 架構結構

與unittest類似,執行用例前後會執行setup、teardown來增加用例的前置和後置條件。

pytest的前置和後置條件大概有這麼幾類:

子產品級(setup_module/teardown_module)

在子產品始末調用

函數級(setup_function/teardown_function)

在函數始末調用(在類外部)

類級(setup_class/teardown_class)

在類始末調用(在類中)

方法級(setup_method/teardown_method)

在方法始末調用(在類中)

方法級(setup/teardown)

調用順序:

setup_module>setup_function>teardown_function>setup_class>setup_method>setup>teardown>teardown_method>teardown_class>teardown_module

注意事項:

1、其中函數級的setup_function/teardown_function是在class類外部調用的,寫在class類中是沒用的,不會調用

2、(setup_method/teardown) 與 (setup/teardown)功能是一樣的,優先級是先執行setup_method,在執行setup。一般二者用其中一個即可.

驗證上面的執行順序,可以執行下面的腳本,

然後看列印的輸出結果:

一篇文章為你揭秘pytest的基本用法
一篇文章為你揭秘pytest的基本用法

控制用例的執行順序

pytest預設的執行順序是按照檔案名以及測試方法名稱排序執行的,如果想指定用例的順序,可以使用pytest-ordering插件,在測試方法前面加上裝飾器@pytest.mark.run(order=num),就可以按照num的大小順序來執行。

安裝:

pip install pytest-ordering

案例:

執行結果如下:

一篇文章為你揭秘pytest的基本用法

注意:按照num排序時,正整數在前,負數在後面,然後統一按照從小到大的順序執行。(我目前使用的是pytest5.4.3版本,不排除以後版本更改排序規則)

pytest中可以使用@pytest.fixture裝飾器來裝飾一個方法,被裝飾方法的方法名可以作為一個參數傳入到測試方法中。可以通過這種方式來完成測試之前的初始化操作,也可以傳回資料給測試函數。

根據作用範圍大小範圍劃分,分别是:session>module>class>function.

function函數或者方法級别都會被調用

class類級别調用一次

module子產品級别調用一次

session是多個檔案調用一次,可以跨.py檔案調用,每個.py檔案就是module

通過以下腳本可以測試一下scope的作用範圍:

通過更改scope的枚舉值,即可看到效果,可以看到print('調用login方法')在不同的scope選項下,列印出來的次數是不一樣的。

conftest.py檔案

一般用于scope='session'級别的fixture。conftest.py被pytest視為一個本地插件庫,使用conftest.py的規則:

1、conftest.py這個檔案名是固定的,不可以更改

2、conftest.py與運作用例在同一個包下,并且該包中要有__init__.py檔案

3、使用的時候不需要導入conftest.py,pytest會自動加載,放到哪個package下,就在這個package内有效。

如果想讓每條測試用例都添加fixture功能,那麼可以使用@pytest.fixture裡面的autouse參數,autouse='true'則會自動應用到所有用例中。

用法如下:

一篇文章為你揭秘pytest的基本用法

使用fixture傳遞測試資料

fixture的param參數可以用來傳遞測試資料,實作資料驅動的效果,避免出現備援代碼。可以大大減少代碼量,并且便于閱讀和維護。傳入的資料需要使用一個固定的參數名request來接收,代碼如下:

運作結果:

一篇文章為你揭秘pytest的基本用法

pytest使用pytest-xdist并行運作測試

pytest-xdist是pytest裡面的一個分布式執行的插件,可以多個cpu或主機執行。這個是程序級的并發,需要保證測試用例之間的獨立性,插件是動态決定測試用例執行順序,如果互相之間有依賴,可能會導緻執行失敗/達不到預期的結果。

安裝:pip install pytest-xdist

用法:

pytest -n auto 或者 pytest -n num 

參數為auto時,系統會自動檢測cpu核數,如果參數為num數字的話,則表示指定運作的處理器程序數量。

pytest使用pytest-html生成簡易測試報告

安裝:pip install pytest-html

使用方法:pytest --html=xxxx/report.html   (通過這種方式,生成的html報告,css檔案是獨立的,發給其他人的時候要一起帶上css樣式檔案)

pytest --html=xxxx/report.html --self-contained-html  (使用self-contained-html 參數,會将css樣式檔案的内容直接寫到html檔案中)

生成的報告樣式如下:

一篇文章為你揭秘pytest的基本用法

報告中會包含environment和summary以及results的相關資料,如果想要在environment和summary下添加一些個性化的内容展示到報告中的話,可以在conftest.py檔案中添加以下代碼:

加上以上代碼後,運作生成的報告如下:

一篇文章為你揭秘pytest的基本用法
一篇文章為你揭秘pytest的基本用法

pytest斷言

使用過unittest架構的都知道,unittest裡面封裝了很多的斷言方法,有assertequa、assertnotequal等好幾十個斷言的方法,在pytest中,斷言直接使用assert關鍵字就行:

assert xx:判斷xx為真

assert not xx:判斷xx不為真

assert a in b:判斷b是否包含a

assert a == b:判斷a等于b

assert a !=b:判斷a不等于b

斷言要做什麼判斷,可以自己去定義。也可以在assert後面加上斷言失敗後的描述資訊:

assert  a>b,'斷言失敗,實際結果是a<b'

pytest parametrize參數化

先來看一下parametrize()的方法源碼:

主要參數說明:

argsvalues:參數對應的值,是由參數組成的清單,清單中有幾個元素,就會生成幾條用例,參數名和參數值的數量要相等。

indirect:該參數值預設為false,表示argnames就是普通的參數,如果将該值設定為true,則可以用來将參數傳入到fixture方法中。

scope:聲明argnames中參數的作用域,進而影響到測試用例的收集順序

parametrize使用方法:

單個參數:

輸出結果:

一篇文章為你揭秘pytest的基本用法

多個參數:

一篇文章為你揭秘pytest的基本用法

多次使用parametrize的用法:

對同一個方法使用多次@pytest.mark.parametrize裝飾器

一篇文章為你揭秘pytest的基本用法

ids參數用法及效果:

indirect用法:

使用indirecttrue,pytest可以實作将參數傳入到fixture方法中,也可以在目前測試用例中使用。

一篇文章為你揭秘pytest的基本用法

scope參數用法及結果示範:

一篇文章為你揭秘pytest的基本用法
一篇文章為你揭秘pytest的基本用法

pytest結合yaml實作資料驅動

在實際測試工作中,通常需要對多組不同餓的輸入資料,進行同樣的測試操作步驟,可以将多組測試資料以資料驅動的形式注入,可以做到測試資料和測試用例分别進行管理。常見的外部資料源可以用yaml、json、excel、csv等方式進行管理。

下面以yaml為例,簡單示範一下如何實作資料驅動:

安裝: pip install pyyaml

建立一個testdata的檔案夾,在下面建立data.yml和test_yaml.py檔案,内容如下:data.yaml:

一篇文章為你揭秘pytest的基本用法

pytest結合allure生成測試報告

allure架構是一種靈活的、輕量級、支援多語言的測試報告工具,報告美觀清晰、一目了然。同時支援多種語言,包括java、python、javascript、ruby、groovy、php、.net、scala等。

環境搭建:

1、以windows系統為例(先安裝好jdk并配置環境變量),先下載下傳allure的指令行工具進行安裝。下載下傳位址可從github上進行下載下傳:

https://github.com/allure-framework/allure2/releases

github如果下載下傳過慢的話,可以從我的網盤裡面下載下傳:

連結:https://pan.baidu.com/s/1cjvl_jjujhfafp0olunlca  

提取碼:1234

下載下傳最新的安裝包後,解壓,配置環境變量。

建立一個allure_home的環境變量,value指向解壓後的根路徑,,我電腦上的是:g:\devops\allure-2.9.0

然後在path中加入%allure_home%\bin 

之是以要單獨配置解壓後的路徑為allure_home,是為了以後更換版本後更改環境變量比較友善。

配置好後,在cmd視窗輸入 allure --version 會列印出安裝的版本。

一篇文章為你揭秘pytest的基本用法

2、安裝python的allure-pytest插件

pip install -u allure-pytest

具體使用方法:

步驟一:在會用pytest執行用例的時候,指定參數 --allure選項及結果資料儲存的目錄:

pytest --alluredir=./tempdir/data 

pytest --alluredir=./tempdir/data  --clean-alluredir 

加--clean-alluredir選項會先清理資料目錄,再重新生成新的資料,不清理也不會影響報告的生成。

步驟二:

使用allure serve 打開報告:

在cmd視窗輸入allure serve ./tempdir/data ,就會自動打開浏覽器顯示報告:

一篇文章為你揭秘pytest的基本用法

使用allure ganerate指令生成html格式報告

cmd視窗輸入如下指令:

allure generate ./tempdir/data -o ./report --clean 

指令說明:

 ./tempdir/data 指測試資料目錄, ./report 指html報告生成的位置, --clean指先清空測試報告目錄再重新生成新的測試報告。

需要使用下面的指令打開報告,直接打開html檔案,看不到資料:

allure open -h 127.0.01 -p 8088  ./report/

到此,allure報告就生成了,至于報告怎麼去分析和檢視,可以将報告切換為中文版本自己去進行分析即可。

以上就是pytest常見的一些用法,适合新手入門了解,後續有時間會繼續補充pytest的一些其他文法和用法以及擴充功能,歡迎關注小編,能及時擷取下次更新喔!

繼續閱讀