命名規則
測試文件: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 的調用
- 在測試用例中直接調用
- 使用裝飾器調用@pytest.mark.usefixtures(“fixture_name1” , “fixture_name2”)
- 用 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 可以實現看到測試過程中執行的是什麼