在上一篇文章中分享了 pytest 的基本用法,本文進一步介紹 pytest 的其他實用特性和進階技巧,
pytest fixtures
pytest 中可以使用 @pytest.fixture 裝飾器來裝飾一個方法,被裝飾方法的方法名可以作為一個引數傳入到測驗方法中,可以使用這種方式來完成測驗之前的初始化,也可以回傳資料給測驗函式,
通常使用 setup 和 teardown 來進行資源的初始化,如果有這樣一個場景,測驗用例 1 需要依賴登錄功能,測驗用例 2 不需要登錄功能,測驗用例 3 需要登錄功能,這種場景 setup,teardown 無法實作,可以使用 pytest fixture 功能,在方法前面加個 @pytest.fixture 裝飾器,加了這個裝飾器的方法可以以引數的形式傳入到方法里面執行,
例如在登錄的方法,加上 @pytest.fixture 這個裝飾器后,將這個用例方法名以引數的形式傳到方法里,這個方法就會先執行這個登錄方法,再去執行自身的用例步驟,如果沒有傳入這個登錄方法,就不執行登錄操作,直接執行已有的步驟,
創建一個檔案名為“test_fixture.py”,代碼如下:
在上面的代碼中,測驗用例 test_case1 和 test_case3 分別增加了 login 方法名作為引數,pytest 會發現并呼叫 @pytest.fixture 標記的 login 功能,運行測驗結果如下:
從上面的結果可以看出,test_case1 和 test_case3 運行之前執行了 login 方法,test_case2 沒有執行這個方法,
fixture 里面有一個引數 scope,通過 scope 可以控制 fixture 的作用范圍,根據作用范圍大小劃分:session> module> class> function,具體作用范圍如下:
- function 函式或者方法級別都會被呼叫
- class 類級別呼叫一次
- module 模塊級別呼叫一次
- session 是多個檔案呼叫一次(可以跨.py檔案呼叫,每個.py檔案就是module)
例如整個模塊有多條測驗用例,需要在全部用例執行之前打開瀏覽器,全部執行完之后去關閉瀏覽器,打開和關閉操作只執行一次,如果每次都重新執行打開操作,會非常占用系統資源,這種場景除了setup_module,teardown_module 可以實作,還可以通過設定模塊級別的 fixture 裝飾器(@pytest.fixture(scope=“module”))來實作,
scope=‘module’
fixture 引數 scope=‘module’,module 作用是整個模塊都會生效,
創建檔案名為 test_fixture_scope.py,代碼如下:
代碼決議:
@pytest.fixture() 如果不寫引數,引數默認 scope=‘function’,當 scope=‘module’ 時,在當前 .py 腳本里面所有的用例開始前只執行一次,scope 巧妙與 yield 組合使用,相當于 setup 和 teardown 方法,還可以使用 @pytest.mark.usefixtures 裝飾器,傳入前置函式名作為引數,
運行結果如下:
從上面運行結果可以看出,scope=“module” 與 yield 結合,相當于 setup_module 和 teardown_module 方法,整個模塊運行之前呼叫了 open()方法中 yield 前面的列印輸出“打開瀏覽器”,整個運行之后呼叫了 yield 后面的列印陳述句“執行 teardown !”與“關閉瀏覽器”,yield 來喚醒 teardown 的執行,如果用例出現例外,不影響 yield 后面的 teardown 執行,可以使用 @pytest.mark.usefixtures 裝飾器來進行方法的傳入,
fixture scope 為 session 級別是可以跨 .py 模塊呼叫的,也就是當我們有多個 .py 檔案的用例時,如果多個用例只需呼叫一次 fixture,可以將 scope=‘session’,并且寫到 conftest.py 檔案里,寫到 conftest.py 檔案可以全域呼叫這里面的方法,使用的時候不需要匯入 conftest.py 這個檔案,使用 conftest.py 的規則:
1.conftest.py 這個檔案名是固定的,不可以更改,
2.conftest.py 與運行用例在同一個包下,并且該包中有 init.py 檔案
3.使用的時候不需要匯入 conftest.py,pytest 會自動識別到這個檔案
4.放到專案的根目錄下可以全域呼叫,放到某個 package 下,就在這個 package 內有效,
案例
在運行整個專案下的所有的用例,只執行一次打開瀏覽器,執行完所有的用例之后再執行關閉瀏覽器,可以在這個專案下創建一個 conftest.py 檔案,將打開瀏覽器操作的方法放在這個檔案下,并添加一個裝飾器 @pytest.fixture(scope=“session”),就能夠實作整個專案所有測驗用例的瀏覽器復用,案例目錄結構如下:
創建目錄 test_scope,并在目錄下創建三個檔案 conftest.py,test_scope1.py 和 test_scope2.py,
conftest.py 檔案定義了公共方法,pytest 會自動讀取 conftest.py 定義的方法,代碼如下:
創建 test_scope1.py 檔案,代碼如下:
創建檔案“test_scope2.py”,代碼如下:
打開 cmd,進入目錄 test_scope/,執行如下命令:
或者
執行結果如下:
執行程序中 pytest 會自動識別當前目錄的 conftest.py,不需要匯入直接參考里面的方法配置,應用到整個目錄下的所有呼叫這里面的方法中執行,conftest.py 與運行的用例要在同一個 pakage 下,并且這個包下有 init.py 檔案
如果每條測驗用例都需要添加 fixture 功能,則需要在每一要用例方法里面傳入這個fixture的名字,這里就可以在裝飾器里面添加一個引數 autouse=‘true’,它會自動應用到所有的測驗方法中,只是這里沒有辦法回傳值給測驗用例,
使用方法,在方法前面加上裝飾器,如下:
@pytest.fixture 里設定 autouse 引數值為 true(默認 false),每個測驗函式都會自動呼叫這個前置函式,
創建檔案名為“test_autouse.py”,代碼如下:
執行上面這個測驗檔案,結果如下:
從上面的運行結果可以看出,在方法 myfixture() 上面添加了裝飾器 @pytest.fixture(autouse=“true”),測驗用例無須傳入這個 fixture 的名字,它會自動在每條用例之前執行這個 fixture,
測驗程序中需要大量的測驗資料,如果每條測驗資料都撰寫一條測驗用例,用例數量將是非常寵大的,一般我們在測驗程序中會將測驗用到的資料以引數的形式傳入到測驗用例中,并為每條測驗資料生成一個測驗結果資料,
這時候可以使用 fixture 的引數化功能,在 fixture 方法加上裝飾器 @pytest.fixture(params=[1,2,3]),就會傳入三個資料 1、2、3,分別將這三個資料傳入到用例當中,這里可以傳入的資料是個串列,傳入的資料需要使用一個固定的引數名 request 來接收,
創建檔案名為“test_params.py”,代碼如下:
運行結果如下:
從運行結果可以看出,對于 params 里面的每個值,fixture 都會去呼叫執行一次,使用 request.param 來接受用例引數化的資料,并且為每一個測驗資料生成一個測驗結果,在測驗作業中使用這種引數化的方式,會減少大量的代碼量,并且便于閱讀與維護,
假如專案中有測驗用例 1000 條,一條測驗用例需要執行 1 分鐘,一個測驗人員需要 1000 分鐘才能完成一輪回歸測驗,通常我們會用人力成本換取時間成本,加幾個人一起執行,時間就會縮短,如果 10 人一起執行只需要 100 分鐘,這就是一種并行測驗,分布式的場景,
pytest-xdist 是 pytest 分布式執行插件,可以多個 CPU 或主機執行,這款插件允許用戶將測驗并發執行(行程級并發),插件是動態決定測驗用例執行順序的,為了保證各個測驗能在各個獨立執行緒里正確的執行,應該保證測驗用例的獨立性(這也符合測驗用例設計的最佳實踐),
安裝
多個 CPU 并行執行用例,需要在 pytest 后面添加 -n 引數,如果引數為 auto,會自動檢測系統的 CPU 數目,如果引數為數字,則指定運行測驗的處理器行程數,
案例
某個專案有 200 條測驗用例,每條測驗用例之間沒有關聯關系,互不影響,這 200 條測驗用例需要在 1 小時之內測驗完成,可以加個-n引數,使用多 CPU 并行測驗,運行方法:
進入到專案目錄下,執行 pytest 可以將專案目錄下所有測驗用例識別出來并且運行,加上 -n 引數,可以指定 4 個 CPU 并發執行,大量的測驗用例并發執行提速非常明顯,
測驗報告通常在專案中尤為重要,報告可以體現測驗人員的作業量,開發人員可以從測驗報告中了解缺陷的情況,因此測驗報告在測驗程序中的地位至關重要,測驗報告為糾正軟體存在的質量問題提供依據,為軟體驗收和交付打下基礎,測驗報告根據內容的側重點,可以分為 “版本測驗報告” 和 “總結測驗報告”,執行完 pytest 測驗用例,可以使用 pytest-HTML 插件生成 HTML 格式的測驗報告,
安裝
執行方法
結合 pytest-xdist 使用
生成測驗報告
如下圖:
生成的測驗報告最終是 HTML 格式,報告內容包括標題、運行時間、環境、匯總結果以及用例的通過個數、跳過個數、失敗個數、錯誤個數,期望失敗個數、不期望通過個數、重新運行個數、以及錯誤的詳細展示資訊,報告會生成在運行腳本的同一路徑,需要指定路徑添加–html=path/to/html/report.html 這個引數配置報告的路徑,如果不添加 --self-contained-html 這個引數,生成報告的 CSS 檔案是獨立的,分享的時候容易千萬資料丟失,
撰寫代碼時,我們經常會做出一些假設,斷言就是用于在代碼中捕捉這些假設,斷言表示為一些布爾運算式,測驗人員通常會加一些斷言來斷定中間程序的正確性,斷言支持顯示最常見的子運算式的值,包括呼叫,屬性,比較以及二元和一元運算子,Python使用 assert(斷言)用于判斷一個運算式,在運算式條件為 false 的時候觸發例外,
使用方法:
案例如下:
如果沒有斷言,沒有辦法判定用例中每一個測驗步驟結果的正確性,在專案中適當的使用斷言,來對代碼的結構、屬性、功能、安全性等場景檢查與驗證,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/493110.html
標籤:其他
