前言
python常用測試框架有Unittest损谦、Doctest岖免、Nose及Pytest
unittest大部分人都非常清楚,都用來做自動化照捡,無論是UI還是接口自動化
Nose是對unittest的擴展颅湘,使得python的測試更加簡單。nose自動發(fā)現(xiàn)測試代碼并執(zhí)行栗精,nose提供了大量的插件栅炒,但是很多插件不支持python3
doctest是python自帶的一個模塊,你可以把它叫做“文檔測試”(doctest)模塊,使用起來不太方面赢赊,被大家放棄使用
pytest是基于unittest開發(fā)的另一款更高級更好用的單元測試框架,提供了豐富的插件且容易使用级历,二次開發(fā)也比較簡單
那大家為什么都推薦使用Pytest
pytest 的官方網(wǎng)站對Pytest說明如下特點:
非常容易上手释移,入門簡單,文檔豐富寥殖,文檔中有很多實例可以參考
能夠支持簡單的單元測試和復雜的功能測試
支持用簡單的assert語句實現(xiàn)豐富的斷言
自動識別測試模塊和測試函數(shù)
安裝插件即可支持參數(shù)化玩讳,使用非常簡單
模塊化夾具用以管理各類測試資源
執(zhí)行測試過程中可以將某些測試跳過(skip),或者對某些預期失敗的case標記成失敗
支持重復執(zhí)行(rerun)失敗的 case
支持運行由 nose, unittest 編寫的測試 case
可生成 html 報告嚼贡,特別有allure報告插件
方便的和持續(xù)集成工具 jenkins 集成
支持用例篩選熏纯,支持執(zhí)行部分用例
具有很多第三方插件,并且可以自定義擴展粤策,截止目前已有800多個各式各樣的插件
pytest和Unittest區(qū)別
類型 | Unittest | Pytest |
---|---|---|
用例編寫規(guī)則 | 測試文件必須先import unittest 測試類必須繼承unittest.TestCase 測試方法必須以“test_”開頭 測試類必須要有unittest.main()方法 |
測試文件名必須以“test_”開頭或者"test"結(jié)尾 測試方法必須以“test”開頭 測試類命名以"Test"開頭 |
用例執(zhí)行 | 默認執(zhí)行全部用例樟澜,也可以通過加載testsuit,執(zhí)行部分用例 | 可以通過@pytest.mark來標記類和方法叮盘,pytest.main加入?yún)?shù)("-m")可以只運行標記的類和方法 |
用例前置和后置 | 提供了setUp/tearDown秩贰,只能針對所有用例 | 提供模塊級、函數(shù)級柔吼、類級毒费、方法級等不同級別 更有fixture更加靈活 |
參數(shù)化 | 需依賴第三方庫如ddt、paramunittest庫 | 使用@pytest.mark.parametrize裝飾器 |
斷言 | 很多斷言格式(assertEqual愈魏、assertIn觅玻、assertTrue、assertFalse) | 使用python自帶的assert即可培漏,比較自由方便 |
報告 | 使用HTMLTestRunner.py庫 | 有pytest-HTML溪厘、allure插件 |
失敗重跑 | 無此功能 | 使用插件pytest-rerunfailures即可完成,不需要編寫多余代碼 |
并發(fā)測試 | 無此功能 | 使用插件pytest-xdist即可完成北苟,不需要編寫多余代碼 |
安裝Pytest
- 在編輯器或者cmd命令窗口輸入:
pip install pytest
或者pip install pytest -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com
桩匪,安裝的是最新版
- 在編譯器安裝模塊界面安裝(pycharm為例):`File -> Settings->Project->Project Interpreter
->點擊"+"號->搜索框輸入 pytest,選擇pytest,點擊Install Package`
查看版本
cmd輸入框輸入:pytest --version
快速開始
# _*_coding:utf-8 _*_
# @Time :2021/7/1 22:18
# @Author : king
# @File :test_01.py
# @Software :PyCharm
# @blog :https://blog.csdn.net/u010454117
# @WeChat Official Account: 【測試開發(fā)知識庫】
def func(x):
return x + 1
def test_answer():
assert func(3) == 5
class TestClass:
def test_one(self):
x = "king"
assert "k" in x
def test_two(self):
assert func(2) == 3
然后,cmd進入當前文件目錄友鼻,直接執(zhí)行 pytest
需掌握的知識點
如果只輸入 pytest 傻昙,就會開始從當前目錄及其子目錄下以 test_*.py 或 *_test.py 文件,找到文件后彩扔,在文件中找到以 test 開頭函數(shù)并執(zhí)行
如果只想執(zhí)行某個文件妆档,可以 pytest test_01.py
加上-q,就是顯示簡單的執(zhí)行結(jié)果: pytest -q test_01.py
加上 -v虫碉,就是顯示詳細的執(zhí)行結(jié)果: pytest -v test_01.py
Pytest用例的編寫遵循原則
默認情況下贾惦,使用Pytest編寫用例時候,需要按照下面的規(guī)則去寫,否則不符合規(guī)則的測試用例不會執(zhí)行(后續(xù)會講解如果更改用例搜索執(zhí)行規(guī)則)
文件名以
test_*.py
文件和*_test.py
以
test_
開頭的函數(shù)以
Test
開頭的類须板,不能包含__init__
方法以
test_
開頭的類里面的方法所有的包 pakege 必須要有
__init__.py
文件
Pytest cmd命令行窗口里面執(zhí)行用例搜索規(guī)則
- 某個目錄下所有的用例
cmd命令行輸入:pytest
- 執(zhí)行某一個 py 文件下用例
pytest 腳本名稱.py
- 運行模塊里面的某個函數(shù)碰镜,或者某個類,某個類里面的方法
pytest test_01.py::TestClass::test_one
pytest test_01.py::TestClass
pytest test_01.py::test_answer
- -m 標記表達式(后面詳細講解)
pytest -m smoke
將運行用 @pytest.mark.smoke 裝飾器裝飾的所有測試用例习瑰,后面再詳細講解標記相關(guān)內(nèi)容
- -q 簡單打印绪颖,只打印測試用例的執(zhí)行結(jié)果
pytest -q test_01.py
- -v 詳細打印
pytest -v test_01.py
- -s 打印print 調(diào)式相關(guān)信息
pytest -s test_01.py
- -x 遇到錯誤時停止測試
作用調(diào)式用例時使用,遇見失敗就停止
pytest test_01.py -x
- —maxfail=num甜奄,當用例錯誤個數(shù)達到指定數(shù)量時柠横,停止測試
pytest test_01.py --maxfail=1
- -k 匹配用例名稱牍氛、根據(jù)用例名稱排除某些用例、同時匹配不同的用例名稱
pytest -s -k xkw test_01.py
pytest -s -k "not xkw" test_01.py
pytest -s -k "test_answer or test_two" test_01.py
注意
pytest 是可以兼容 unittest 腳本的烟阐,前面寫的 unittest 用例稍微做下修改就能用 pytest 框架去運行
歡迎您給我留言搬俊,我們一起討論。
*如果覺得文章不錯曲饱,歡迎關(guān)注微信公眾號