1. 程式人生 > >pytest 入門及執行

pytest 入門及執行

關於pytest的入門教程,官網及網上已經很多了,那再多一點也無所謂吧!OK,進入正題~

  下面是一個測試用例,test_one.py

def test_passing():
    assert (1, 2, 3) == (1, 2, 3)

  在用例當前路徑開啟終端,輸入pytest test_one.py,執行結果如下:

============================= test session starts =============================

platform win32 -- Python 3.7.0, pytest-3.9.2, py-1.5.4, pluggy-0.8.0

rootdir: G:\pytest\bopytest-code\code\ch1, inifile:

collected 1 item

test_one.py .                                                            [100%]

========================== 1 passed in 0.10 seconds ===========================

  下面來逐句說明下pytest執行單個測試檔案時的控制檯輸出資訊:

============================= test session starts =============================

  pytest為每段測試會話(session)做了明確的分隔,一段會話就是pytest的一次呼叫,它可能包括多個目錄下被執行的測試用例。

platform win32 -- Python 3.7.0, pytest-3.9.2, py-1.5.4, pluggy-0.8.0

  我使用的windows電腦,所以顯示的是platform win32。接著顯示Python、Pytest以及pytest包的版本。py和pyluggy都是pytest包,用於pytest的實現,均由pytest團隊開發維護。

rootdir: G:\pytest\bopytest-code\code\ch1, inifile:

  rootdir(當前起始目錄)是pytest搜尋測試程式碼時最常使用的目錄,inifile用於列舉配置檔案(這裡沒有指定),檔名可能是pytest.ini、tox.ini或者setup.cfg。

collected 1 item

  搜尋範圍內找到一個名為test_one.py的測試條目。

test_one.py .                                                            [100%]

  test_one.py表示測試檔案,每個檔案的測試情況佔據一行,後接的一個點號表示該測試用例已通過。點號僅僅表示通過,而Failurt(失敗)、error(異常)、skip(跳過)、xfail(預期失敗)、xpass(預期失敗但通過)會被分別標記為F、E、s、x、X。使用-v或--verbose可以看到更多細節。100%表示測試完畢。

========================== 1 passed in 0.10 seconds ===========================

  表示測試通過的數量以及這段會話耗費的時間,如果存在未通過的測試用例,則會根據未通過的型別列舉數量。

 

如上面提到的如果想檢視詳情,可以在pytest後面加上-v或者--verbose選項,pytest -v test_one.py:

============================= test session starts =============================

platform win32 -- Python 3.7.0, pytest-3.9.2, py-1.5.4, pluggy-0.8.0 -- f:\progr am files\python\python.exe

cachedir: .pytest_cache

rootdir: G:\pytest\bopytest-code\code\ch1, inifile:

collected 1 item

test_one.py::test_passing PASSED                                         [100%]

========================== 1 passed in 0.02 seconds ===========================

  加上-v後,會在測試檔名後顯示函式名以及大寫的測試結果。如果使用的彩色終端,那麼PASSED和底部線條都是綠色的。如下:

  

   下面是一個失敗的測試用例,test_two.py:

def test_failing():
    assert (1, 2, 3) == (3, 2, 1)

  執行結果如下:

  

  pytest展示了很清楚的失敗資訊,這也是它受歡迎的原因之一。

  如上,pytest有一塊專門的區域展示test_failing的失敗資訊,它能準確指出失敗原因:index 0 is mismatch。並且重要的提示資訊用紅色字型顯示,以方便使用者閱讀。如果你仔細觀察,還有一條提示指出,使用-v可以得到更完整的前後對比資訊,如下圖:

  

  pytest新增幾個脫字元(^),準確地指出了前後的區別。

  終端執行pytest --help:

  usage: pytest [options] [file_or_dir] [file_or_dir] [...]

  第一句就說明了使用語法,如果你不提供任何引數,pytest會在當前目錄以及子目錄尋找測試檔案,然後執行搜尋到的測試程式碼。如果你提供一個或者多個檔名、目錄名,pytest會逐個查詢並執行所有測試。為了搜尋到所有測試程式碼,pytest會遞迴遍歷每個目錄及其子目錄。

  如在之前路徑下直接執行pytest,結果如下 :

  

  也可以在pytest中指定需要測試的檔名或者目錄,或者預先切換到需要執行的目錄:

  

  我們把pytest搜尋測試檔案和測試用例的過程稱為測試搜尋(test discovery)。只要你按pytest的命名規則,pytest就能自動搜尋到所有待執行的測試用例。

  以下是幾條主的命名規則:

  1. 測試檔案應當命名為 test_<something>.py或者<somethins>_test.py

  2. 測試函式、測試類方法應當命名為test_<something>

  3. 測試類應當命名為Test<Something>.