1. 程式人生 > 其它 >Pytest測試框架介紹

Pytest測試框架介紹

1.Pytest測試框架介紹

Pytest框架是近年來比較流行的python自動化測試框架,主要有以下優點:

  • 使用簡潔,方便:無需測試類繼承,提供詳細的失敗資訊。
  • 自動發現測試用例。
  • 靈活執行指定的測試用例,指定模組,制定測試類,測試用例通過加標籤區分正常用例,迴歸用例 冒煙用例等。
  • 相容unittest/nose框架。
  • 相關外掛眾多,可以根據需要擴充套件功能。

2.環境準備

2.1 安裝python

目前基本都是用python3,所以建議裝python3.

2.1.1使用home-brew工具安裝python3

安裝之前先查詢以下本機是否已經有python3的包

在終端輸入命令brew search python3

如果存在,就可以直接安裝了

在終端輸入命令brew install python3

如果遇到下面的報錯,是因為電腦啟用了SIP(System Integrity Protection),增加了rootless機制,導致即使在root許可權下依然無法修改檔案,在必要時候為了能夠修改下面的檔案,我們只能關閉該保護機制。方法:重啟電腦,開機一瞬間 按住command+R,開啟terminal終端 輸入csrutil disable,再次重啟。

shopeedeMacBook-Pro:~ shopee1$ brew install python fatal: Unable to create
'/usr/local/Homebrew/.git/index.lock': Permission denied fatal: Unable to create '/usr/local/Homebrew/.git/index.lock': Permission denied error: could not lock config file .git/config: Permission deniedni


2.1.2或者去官方下載相應的版本自行安裝

https://www.python.org/downloads/mac-osx/

2.2 安裝編譯器

可以選擇社群版

https://www.jetbrains.com/pycharm/download/#section=mac

2.3安裝pytest包

在終端輸入命令pip3 install pytest

3.Pytest特性介紹

3.1 命名

  • 測試檔案test_*.py 和 *_test.py開頭或結尾,
  • 測試類Test開頭,沒有__init__函式,測試方法名以test_開頭的函式
  • 測試函式以test_開頭

3.2特殊的conftest.py檔案

定義:conftest.py是pytest獨有的檔案,檔名字是固定的,不可以做任何修改

作用:可以在檔案裡面編寫fixture,而這個fixture的作用就相當於我們unittest框架裡面的setup()和teardown(),供測試函式使用。

用法:一個測試工程下是可以有多個conftest.py的檔案,一般在工程根目錄放一個conftest.py起到全域性作用。在不同的測試子目錄也可以放conftest.py,作用範圍只在該層級以及以下目錄生效。所有同目錄測試檔案執行前都會執行conftest.py檔案,不需要import。

3.3 引數化

  • 使用pytest.mark.parametrize()方式進行引數化

    @pytest.mark.parametrize("test_input,expected", [("3+5", 8), ("2+4", 6), ("6*9", 42)]) def test_eval(test_input, expected): assert eval(test_input) == expected
  • pytest.fixture()方式進行引數化,fixture裝飾的函式可以作為引數傳入其他函式

    @pytest.fixture(params=[0, 1, pytest.param(2, marks=pytest.mark.skip)]) def data_set(request): return request.param def test_da(data_set): Pass

3.4給用例打標籤

給用例打標籤

  • 跳過該用例不執行

@pytest.mark.skip(reason='out-of-data api')

  • 當滿足某個條件時就跳過

@pytest.mark.skipif(sys.plafform == "win32", reason="does not run on windows")

自定義標籤

在pytest.ini檔案中註冊自己的mark標籤,

[pytest] markers = smoketest


在測試用例前面加上標籤@pytest.mark.smoketest

加上-m引數執行pytest -v -s Test_DownloadKeywordFile.py -m=smoketest

3.5執行方式

3.5.1執行檔案

  • 指定執行某個模組,命令列輸入pytest test_demo1.py
  • 指定某個模組下某個類的某個用例,pytest 模組名::類名::方法名,例pytest test_demo2.py::TestDemo2::test_success
  • 指定某個模組下的某個方法,pytest 模組名::方法名,例pytest test_demo1.py::test_fail

3.5.2常用執行引數

可以通過pytest -h或pytest --help檢視所有的命令,包含了所有外掛的

  • -s:預設情況下你在用例中寫的print或者log輸出,都不會在測試結果中展示。如果你想看到用例中的標準輸出,那麼需要加上-s引數
  • -v:使用-v會讓輸出結果更詳細,不用的時候一個檔案佔一行,而用例之後一個用例佔結果的一行。並且結果中的用例名稱和結果都會展示,而不僅僅是一個.或字元。
  • -m:標記markers用於標記測試並分組,以便快速選中某些需要的用例並執行。比如我們在冒煙測試時執行其中某一部分用例,等到真正測試時執行另一部分用例。可以通過@pytest.mark.標記名來標記這些需要的用例,執行時用-m標記就能快速選出這部分用例執行。
  • -k:pytest -k "stra or strb"測試類或函式包含stra或strb字元測試將被執行,其他的將忽略

4.測試報告生成

  • 生成txt格式的報告:加引數 --resultlog及存放路徑,如 pytest test_class.py --resultlog=./log.txt
  • 生成JunitXML 格式的測試報告, JunitXML報告是一種很常用的測試報告,比如可以和Jenkins進行整合,在Jenkins的GUI上顯示Pytest的執行結果,非常便利。 執行完case後可以到report路徑下去檢視相應的xml檔案,也可以在PyCharm開啟該xml檔案檢視。執行時加上引數--junitxml及存放路徑
  • 生成html測試報告:需安裝pytest-html包。執行時加上--html引數及存放路徑
  • 利用allure外掛生成測試報告,也可以整合到jenkins。

5.案例實踐

上面介紹了pytest的一些特性,現在來看以下Listing QC系統目前的介面自動化實現。

5.1測試背景

目前需要測試http介面,需要驗證介面主要是3個方面的內容:

請求引數:每個欄位的校驗,格式,是否必填,邊界值等

返回引數:是否都返回了預期的欄位

邏輯校驗:是否按照預定的輸入返回預期的輸出,有些需要和資料庫的資料進行比對

5.2整體程式碼分佈

目前由於時間緊急,搭得比較簡陋,只有一些基礎功能。

--Common存放一些自己編寫的類,由於Listing QC涉及的資料庫有些是分表分庫的,找到具體的表有一定的邏輯,我把這部分邏輯封裝成函式,方便操作資料庫。

--Conf配置檔案存放資料庫的連線資訊及API的配置資訊等。

--run.py 主函式入口,目前主要是用allure外掛生成報告

--TestCase測試用例存放處。每個API單獨存放一個檔案。

--Util存放一些基礎操作類,如資料庫連線。

5.3設計思路

  • Conftest.py檔案中利用pytest自帶pytest_addoption函式負責儲存好命令列引數。

  • 封裝fixture,返回某個表的查詢結果。內建的request fixture可以獲取設定的命令列引數

  • 將fixture mqc_file_profile_tab作為引數傳入測試函式中

  • 命令列輸入pytest -v -s Test_ListUploadedFiles.py::test_responsecheck_records執行用例

  • 如果要切換環境,加上引數--env引數,如--env=sit即可

  • 引數化,對於校驗欄位格式時很實用

allure外掛報告生成


5.4未完待續

後續還可以加上日誌列印,郵件傳送,CI整合等。

寫在最後:只要是寫的程式碼就有可能有瑕疵,因此手工測試也是很有必要,我更多地把這個作為輔助測試手段。

附錄:

1.pytest參考文件

https://docs.pytest.org/en/latest/contents.html

2.使用Pytest實現介面自動化