Pytest 學習筆記

命名規則

測試文件:test_file_name.py

測試函數:test_function_name()

測試類:Test_class_name

測試結果

「.」: Passed,測試通過

「F」:Failure,測試失敗

「s」:Skip,測試未被執行

「x」:xfail,預期失敗

「X」:xpass,預期失敗但通過

「E」:Error,觸發異常

常用命令

-v/–verbose 測試結束輸出詳細的信息,最明顯的區別就是每個測試用例都佔一行,否則就是一個「.」

-q 簡化輸出信息 ,與–tb=line(僅打印異常代碼位置)搭配

–help/-h 查看 pytest 用法,也可以展示新添加的插件的選項和用法

–collect-only 查看哪些用例會被執行

-k “name1 or name2” 指定希望運行的測試用例

-m mark_name 在函數上方標記@pytest.mark.mark_naem,可以運行相同標記的用例(自定義標記名),還可以使用 -m “mname1 and mname2” / “mname1 or mname2” 進行過濾, and or not 關鍵字

-x 默認測試失敗繼續執行之後的用例,加-x後可以立即停止

–maxfail 使用–maxfail=num 指定可以失敗幾次,–maxfail=1 與-x 效果一樣

-s 允許終端在測試運行時輸出某些結果

–lf last-failed 定位到最後一個失敗的測試用例重新運行

–ff 運行完剩餘的測試用例

-l 顯示局部變量和其值

預期異常

with pytest.raises(ErrorName)

跳過測試

@pytest.mark.skip()

@pytest.mark.skipif( expression )

加上這個註解的測試用例會直接跳過而不執行,運行時加上 -rs 可以顯示跳過的原因

標記預期會失敗的測試
@pytest.mark.xfail()

執行結果 x 代表 expected to fail,預期失敗,實際也失敗了

X 代表 expected to fail but passed,預期失敗,但實際運行並沒有失敗

運行測試子集
運行單個目錄下的所有測試,以目錄作爲 pytest 的參數即可

運行點個文件裏的全部測試,以路徑名加文件名作爲 pytest 的參數即可

運行單個測試函數,只需要在文件名後面添加「::」符號和函數名,pytest tests/test.py::test_func_name

運行測試類需要在文件名後面添加「::」符號和類名

參數化測試

@pytest.mark.parametrize( argnames, argvalues ) 可以達到批量傳送參數的目的

Fixture

fixture 的優勢在於用戶在編寫測試函數時可以只考慮核心測試邏輯,而不需要考慮測試前的準備工作。在 fixture 中的錯誤會被報告爲 Error 而不是 Fail。

參考 https://www.jianshu.com/p/54b0f4016300

@pytest.fixture()裝飾器用於聲明函數是一個 fixture。如果測試函數的參數列表中包含 fixture 名,pytest 會檢測到並在運行測試函數之前執行該 fixture。在編寫測試函數的時候,可以將此函數名稱做爲傳入參數,pytest將會以依賴注入方式,將該函數的返回值作爲測試函數的傳入參數

fixture 可以放在單獨的測試文件裏,但如果希望多個測試文件共享 fixture,可以在某個公共目錄下新建一個 conftest.py 文件,將 fixture 放在其中

fixture 的調用

  1. 在測試用例中直接調用
  2. 使用裝飾器調用@pytest.mark.usefixtures(“fixture_name1” , “fixture_name2”)
  3. 用 autos 調用 fixture
    fixture decorator 一個 optional 的參數是autouse, 默認設置爲False。
    當默認爲False,就可以選擇用上面兩種方式來試用fixture。
    當設置爲True時,在一個session內的所有的test都會自動調用這個fixture。
    權限大,責任也大,所以用該功能時也要謹慎小心。
    fixture scope
    function:每個test都運行,默認是function的scope
    class:每個class的所有test只運行一次,無論測試類裏有多少個方法都可以共享這個 fixture
    module:每個module的所有test只運行一次,無論模塊中有多少個測試函數、類或其它 fixture 都可以共享該 fixture
    session:每個session只運行一次,一次 pytest 的會話中所有的函數、方法都可以共享這個 fixture
    比如所有test都需要連接同一個數據庫,那可以設置爲module,只需要連接一次數據庫,對於module內的所有test,這樣可以極大的提高運行效率,fixture 只能使用同級別的 fixture 或者更高級別的

fixture 參數與返回值
fixture還可以帶參數,可以把參數賦值給params,默認是None。對於param裏面的每個值,fixture都會去調用執行一次,就像執行for循環一樣把params裏的值遍歷一次。
fixture返回值默認是None,我們可以選擇讓fixture返回我們需要的東西。如果你的fixture需要配置一些數據,讀個文件,或者連接一個數據庫,那麼你可以讓fixture返回這些數據或資源。

fixture 會在測試函數之前運行,如果 fixture 包含 yield 那麼系統會在 yield 處停止,轉而運行測試函數,等測試函數執行完畢之後再回到 fixture 繼續執行 yield 之後的代碼,因此可將 yield 之前的代碼視爲配置過程(setup),將 yield 之後的代碼視爲清理過程(teardown)過程,無論測試過程中發生了什麼,yield 之後的代碼都會被執行。

–setup-show 可以實現看到測試過程中執行的是什麼

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章