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 架構結構
與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-ordering插件,在測試方法前面加上裝飾器@pytest.mark.run(order=num),就可以按照num的大小順序來執行。
安裝:
pip install pytest-ordering
案例:
執行結果如下:
注意:按照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'則會自動應用到所有用例中。
用法如下:
使用fixture傳遞測試資料
fixture的param參數可以用來傳遞測試資料,實作資料驅動的效果,避免出現備援代碼。可以大大減少代碼量,并且便于閱讀和維護。傳入的資料需要使用一個固定的參數名request來接收,代碼如下:
運作結果:
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檔案中)
生成的報告樣式如下:
報告中會包含environment和summary以及results的相關資料,如果想要在environment和summary下添加一些個性化的内容展示到報告中的話,可以在conftest.py檔案中添加以下代碼:
加上以上代碼後,運作生成的報告如下:
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使用方法:
單個參數:
輸出結果:
多個參數:
多次使用parametrize的用法:
對同一個方法使用多次@pytest.mark.parametrize裝飾器
ids參數用法及效果:
indirect用法:
使用indirecttrue,pytest可以實作将參數傳入到fixture方法中,也可以在目前測試用例中使用。
scope參數用法及結果示範:
pytest結合yaml實作資料驅動
在實際測試工作中,通常需要對多組不同餓的輸入資料,進行同樣的測試操作步驟,可以将多組測試資料以資料驅動的形式注入,可以做到測試資料和測試用例分别進行管理。常見的外部資料源可以用yaml、json、excel、csv等方式進行管理。
下面以yaml為例,簡單示範一下如何實作資料驅動:
安裝: pip install pyyaml
建立一個testdata的檔案夾,在下面建立data.yml和test_yaml.py檔案,内容如下:data.yaml:
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 會列印出安裝的版本。
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 ,就會自動打開浏覽器顯示報告:
使用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的一些其他文法和用法以及擴充功能,歡迎關注小編,能及時擷取下次更新喔!