天天看點

Pytest 自動化測試架構

如何區分這兩者,很簡單unittest作為官方的測試架構,在測試方面更加基礎,并且可以再次基礎上進行二次開發,同時在用法上格式會更加複雜;而pytest架構作為第三方架構,友善的地方就在于使用更加靈活,并且能夠對原有unittest風格的測試用例有很好的相容性,同時在擴充上更加豐富,可通過擴充的插件增加使用的場景,比如一些并發測試等;

pip安裝:

測試安裝成功:

檢查安裝版本:

pytest編寫規則:

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

測試的類以test開頭;

測試的方法以test_開頭

斷言使用基本的assert

test_example.py

執行測試:

執行結果:

備注:

.代表測試通過,f代表測試失敗;

-v顯示詳細的測試資訊, -h顯示pytest指令詳細的幫助資訊;

預設情況下,pytest會在目前目錄下尋找以test_為開頭(以_test結尾)的測試檔案,并且執行檔案内所有以test_為開頭(以_test為結尾)的所有函數和方法;

指定運作測試用例,可以通過::顯示标記(檔案名::類名::方法名)(檔案名::函數名)

指定一些測試用例測試運作,可以使用-k模糊比對

通過pytest.mark.skip()或者pytest.makr.skipif()條件表達式,跳過指定的測試用例

test_flag = false

@pytest.mark.skip()

def test_odd():

num = random.randint(0, 100)

assert num % 2 == 1

@pytest.mark.skipif(test_flag is false, reason="test_flag is false")

def test_even():

num = random.randint(0, 1000)

assert num % 2 == 0

預先知道測試用例會失敗,但是不想跳過,需要顯示提示資訊,使用pytest.mark.xfail()

對測試用例進行多組資料測試,每組參數都能夠獨立執行一次(可以避免測試用例内部執行單組資料測試不通過後停止測試)

固件就是一些預處理的函數,pytest會在執行測試函數前(或者執行後)加載運作這些固件,常見的應用場景就有資料庫的連接配接和關閉(裝置連接配接和關閉)

簡單使用

按照官方的解釋就是當運作測試函數,會首先檢測運作函數的參數,搜尋與參數同名的fixture,一旦pytest找到,就會運作這些固件,擷取這些固件的傳回值(如果有),并将這些傳回值作為參數傳遞給測試函數;

接下來進一步驗證關于官方的說法:

執行測試函數結果:

首先從結果上看驗證了官方的解釋,pytest執行測試函數前會尋找同名的固件加載運作;

connect_db固件中有yield,這裡pytest預設會判斷yield關鍵詞之前的代碼屬于預處理,會在測試前執行,yield之後的代碼則是屬于後處理,将在測試後執行;

從前面大緻了解了固件的作用,抽離出一些重複的工作友善複用,同時pytest架構中為了更加精細化控制固件,會使用作用域來進行指定固件的使用範圍,(比如在這一子產品中的測試函數執行一次即可,不需要子產品中的函數重複執行)更加具體的例子就是資料庫的連接配接,這一連接配接的操作可能是耗時的,我隻需要在這一子產品的測試函數運作一次即可,不需要每次都運作。

而定義固件是,一般通過scop參數來聲明作用,常用的有:

function: 函數級,每個測試函數都會執行一次固件;

class: 類級别,每個測試類執行一次,所有方法都可以使用;

module: 子產品級,每個子產品執行一次,子產品内函數和方法都可使用;

session: 會話級,一次測試隻執行一次,所有被找到的函數和方法都可用。

從這裡可以看出module,session作用域的固件隻執行了一次,可以驗證官方的使用介紹
有人可能會說,這樣子怎麼那麼麻煩,unittest架構中直接定義setup就能自動執行預處理,同樣的pytest架構也有類似的自動執行; pytest架構中固件一般通過參數autouse控制自動運作。
從結果看到,測試函數運作前後自動執行了connect_db固件;
前面簡單的提到過了@pytest.mark.parametrize通過參數化測試,而關于固件傳入參數時則需要通過pytest架構中内置的固件request,并且通過request.param擷取參數
這裡模拟連接配接redis和elasticsearch,加載固件自動執行連接配接然後執行測試函數再斷開連接配接。
對于開發來說為什麼也要學習自動化測試這一塊,很重要的一點就是通過自動化測試節省一些重複工作的時間,同時對于優化代碼結構,提高代碼覆寫率,以及後續項目重構都是有着很重要的意義,同時了解pytest和unittest在基礎上有何差別有助于不同的業務場景中選擇适合自己的測試工具。 這篇文章隻是簡單的介紹了pytest的基本使用,有興趣的可以去看看官方文檔,官方文檔中還提到了如内置固件的使用,常用測試的場景等等。

參考:

https://docs.pytest.org/en/6.2.x/contents.html https://learning-pytest.readthedocs.io/zh/latest/doc/fixture/builtin-fixture.html