前言
python常用測試框架有Unittest、Doctest、Nose及Pytest
unittest大部分人都非常清楚,都用來做自動化,無論是UI還是接口自動化
Nose是對unittest的擴(kuò)展,使得python的測試更加簡單。nose自動發(fā)現(xiàn)測試代碼并執(zhí)行,nose提供了大量的插件,但是很多插件不支持python3
doctest是python自帶的一個模塊,你可以把它叫做“文檔測試”(doctest)模塊,使用起來不太方面,被大家放棄使用
pytest是基于unittest開發(fā)的另一款更高級更好用的單元測試框架,提供了豐富的插件且容易使用,二次開發(fā)也比較簡單
那大家為什么都推薦使用Pytest
pytest 的官方網(wǎng)站對Pytest說明如下特點(diǎn):
非常容易上手,入門簡單,文檔豐富,文檔中有很多實(shí)例可以參考
能夠支持簡單的單元測試和復(fù)雜的功能測試
支持用簡單的assert語句實(shí)現(xiàn)豐富的斷言
自動識別測試模塊和測試函數(shù)
安裝插件即可支持參數(shù)化,使用非常簡單
模塊化夾具用以管理各類測試資源
執(zhí)行測試過程中可以將某些測試跳過(skip),或者對某些預(yù)期失敗的case標(biāo)記成失敗
支持重復(fù)執(zhí)行(rerun)失敗的 case
支持運(yùn)行由 nose, unittest 編寫的測試 case
可生成 html 報告,特別有allure報告插件
方便的和持續(xù)集成工具 jenkins 集成
支持用例篩選,支持執(zhí)行部分用例
具有很多第三方插件,并且可以自定義擴(kuò)展,截止目前已有800多個各式各樣的插件
pytest和Unittest區(qū)別
| 類型 | Unittest | Pytest |
|---|---|---|
| 用例編寫規(guī)則 | 測試文件必須先import unittest 測試類必須繼承unittest.TestCase 測試方法必須以“test_”開頭 測試類必須要有unittest.main()方法 |
測試文件名必須以“test_”開頭或者"test"結(jié)尾 測試方法必須以“test”開頭 測試類命名以"Test"開頭 |
| 用例執(zhí)行 | 默認(rèn)執(zhí)行全部用例,也可以通過加載testsuit,執(zhí)行部分用例 | 可以通過@pytest.mark來標(biāo)記類和方法,pytest.main加入?yún)?shù)("-m")可以只運(yùn)行標(biāo)記的類和方法 |
| 用例前置和后置 | 提供了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
->點(diǎn)擊"+"號->搜索框輸入 pytest,選擇pytest,點(diǎn)擊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進(jìn)入當(dāng)前文件目錄,直接執(zhí)行 pytest
需掌握的知識點(diǎn)
如果只輸入 pytest ,就會開始從當(dāng)前目錄及其子目錄下以 test_*.py 或 *_test.py 文件,找到文件后,在文件中找到以 test 開頭函數(shù)并執(zhí)行
如果只想執(zhí)行某個文件,可以 pytest test_01.py
加上-q,就是顯示簡單的執(zhí)行結(jié)果: pytest -q test_01.py
加上 -v,就是顯示詳細(xì)的執(zhí)行結(jié)果: pytest -v test_01.py
Pytest用例的編寫遵循原則
默認(rèn)情況下,使用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

- 運(yùn)行模塊里面的某個函數(shù),或者某個類,某個類里面的方法
pytest test_01.py::TestClass::test_one
pytest test_01.py::TestClass
pytest test_01.py::test_answer
- -m 標(biāo)記表達(dá)式(后面詳細(xì)講解)
pytest -m smoke
將運(yùn)行用 @pytest.mark.smoke 裝飾器裝飾的所有測試用例,后面再詳細(xì)講解標(biāo)記相關(guān)內(nèi)容
- -q 簡單打印,只打印測試用例的執(zhí)行結(jié)果
pytest -q test_01.py
- -v 詳細(xì)打印
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,當(dāng)用例錯誤個數(shù)達(dá)到指定數(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 框架去運(yùn)行
歡迎您給我留言,我們一起討論。
*如果覺得文章不錯,歡迎關(guān)注微信公眾號
微信公眾號