1. 程式人生 > >Pytest,一個簡潔高效的單元測試框架

Pytest,一個簡潔高效的單元測試框架

640?wx_fmt=gif

本文來自作者 zhong 在GitChat上的分享

前言

Pytest 是 Python 的一種單元測試框架,與 Python 自帶的 unittest 測試框架類似,但是比 unittest 框架使用起來更簡潔,效率更高。

Pytest 是一個成熟的全功能的 Python 測試工具,可以幫助你寫出更好的程式,讓我們很方便的編寫測試用例。

適合從簡單的單元到複雜的功能測試。有很多的第三方外掛可以自定義擴充套件,並且支援 Allure,生成視覺化的測試報告和測試結果,並能輸出 log 資訊。

一、Pytest 介紹

Pytest 官方文件:https://docs.pytest.org/en/latest/

640?wx_fmt=png

  • 能夠支援簡單的單元測試和複雜的功能測試

  • 執行測試過程中可以將某些測試跳過,或者對某些預期失敗的 case標記成失敗

  • 支援重複執行失敗的 case

  • 支援執行由 nose、unittest 編寫的測試 case

  • 具有很多第三方外掛,並且可以自定義擴充套件

  • 方便的和持續整合工具整合

  • 支援引數化

二、安裝 Pytest

在 CMD 視窗下輸入以下指令:

pip install -U pytest   # 通過pip安裝 py.test --version        # 檢視pytest版本

640?wx_fmt=png

安裝外掛:

  • pytest-html(自動生成 HTML 格式測試報告)

  • pytest-describe(給測試用例一個美麗的名字)
    *pytest-autochecklog(不只是自動生成測試日誌)-安裝此之前先安裝 PyYAML

以上外掛均在 Python3.4.4 下通過 pip 工具安裝。

640?wx_fmt=png

三、在 PyCharm 配置 Pytest 並執行程式

通常我們會使用 IDE 進行日常的開發工作,PyCharm 是一款針對 Python 的 IDE,深受廣大 Python 愛好者的青睞。我們可以在 PyCharm 中配置 Pytest,從而可以直接在 PyCharm 中使用 Pytest 的功能,方便且高效。

當我們在命令列安裝好 Pytest 後,在 PyCharm 中進入 File -> Settings... -> Tools -> Python Integrated Tools ,在右邊的視窗中有一個 Default test runner 選項,點選下拉框可以看到 py.test,選擇該項後點擊 Apply 即可。

然後我們可以回到寫有測試函式的檔案中直接右鍵,會出現一個 Run 'py.test' for project_name,直接點選即可執行自動化測試,如下圖所示。

640?wx_fmt=png

四、簡單例項

根據官方文件得來,實現一個示例。

在 PyCharm 中建立資料夾名為 Pytest,在該檔案下建立命名為 test_sample.py 指令碼檔案,然後輸入如下程式,在 PyCharm 底部的 Terminal 中輸入指令進入當前目錄下:D:\work\test_sample>(此路徑是本篇儲存指令碼檔案路徑),然後執行如下指令:

py.test  test_sample.py

test_sample.py指令碼如下

coding:utf-8
def func(x):    
   return x +1
def test_func():    assert func(3) ==5

這裡我們定義了一個被測試函式 func,該函式將傳遞進來的引數加 1 後返回。我們還定義了一個測試函式 test_func 用來對 func 進行測試。test_func 中我們使用基本的斷言語句 assert 來對結果進行驗證。

執行程式碼:

640?wx_fmt=png

結果分析:

執行測試的時候,我們只需要在測試檔案 test_sample 所在的目錄下,執行 py.test 即可。Pytest 會在當前的目錄下,尋找以 test 開頭的檔案(即測試檔案),找到測試檔案之後,進入到測試檔案中尋找 test_ 開頭的測試函式並執行。

通過上面的測試輸出,我們可以看到該測試過程中,一個收集到了一個測試函式,測試結果是失敗的(標記為 F),並且在 FAILURES 部分輸出了詳細的錯誤資訊,幫助我們分析測試原因,我們可以看到 assert func(3) == 5 這條語句出錯了,錯誤的原因是 func(3)=4,然後我們斷言 func(3) 等於 5。

再一個示例:

py.test  test_class.py

test_class.py 指令碼如下:

#coding:utf-8class TestClass():    def test_one(self):        x = "this"        assert "h" in x    def test_two(self):        x = "hello"        assert x == "hi"    def test_three(self):        x = "world"        assert x != "worl"

執行結果:

640?wx_fmt=png

執行該測試用例可以看到,該測試共執行了兩個測試樣例,一個失敗一個成功。同樣,我們也看到失敗樣例的詳細資訊,和執行過程中的中間結果。

五、Pytest 測試樣例規範

  • 測試檔案以 test_ 開頭(以 _test 結尾也可以)

  • 測試類以 Test 開頭,並且不能帶有 __init__ 方法

  • 測試函式以 test_ 開頭

  • 斷言使用基本的 assert 即可

六、獲取幫助資訊

py.test --version # shows where pytest was imported from(查詢py.test的版本號)   py.test --fixtures # show available builtin function arguments(顯示可用的內建函式引數 ) py.test -h | --help # show help on command line and config file options(顯示幫助命令列和配置檔案選項 )

下節,將講解怎樣通過 Pytest 規範來執行多個測試用例檔案。。。歡迎大家共同學習交流。

640?wx_fmt=png