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