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參考文件