pytest測試框架系列 - 快速入門和簡單使用

前言

  • 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,安裝的是最新版
cmd窗口
  • 在編譯器安裝模塊界面安裝(pycharm為例):`File -> Settings->Project->Project Interpreter

->點(diǎn)擊"+"號->搜索框輸入 pytest,選擇pytest,點(diǎn)擊Install Package`

pycharm安裝

查看版本

cmd輸入框輸入:pytest --version

pytest版本

快速開始


# _*_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

執(zhí)行結(jié)果

需掌握的知識點(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ī)則

  1. 某個目錄下所有的用例 cmd命令行輸入:pytest
pytest
  1. 執(zhí)行某一個 py 文件下用例 pytest 腳本名稱.py
在這里插入圖片描述
  1. 運(yùn)行模塊里面的某個函數(shù),或者某個類,某個類里面的方法

pytest test_01.py::TestClass::test_one

pytest test_01.py::TestClass

pytest test_01.py::test_answer

執(zhí)行結(jié)果
  1. -m 標(biāo)記表達(dá)式(后面詳細(xì)講解)

pytest -m smoke

將運(yùn)行用 @pytest.mark.smoke 裝飾器裝飾的所有測試用例,后面再詳細(xì)講解標(biāo)記相關(guān)內(nèi)容

  1. -q 簡單打印,只打印測試用例的執(zhí)行結(jié)果

pytest -q test_01.py

執(zhí)行結(jié)果
  1. -v 詳細(xì)打印

pytest -v test_01.py

-v 詳細(xì)打印
  1. -s 打印print 調(diào)式相關(guān)信息

pytest -s test_01.py

-s
  1. -x 遇到錯誤時停止測試

作用調(diào)式用例時使用,遇見失敗就停止

pytest test_01.py -x

-x
  1. —maxfail=num,當(dāng)用例錯誤個數(shù)達(dá)到指定數(shù)量時,停止測試

pytest test_01.py --maxfail=1

—maxfail=num,當(dāng)用例錯誤個數(shù)達(dá)到指定數(shù)量時,停止測試
  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)注微信公眾號

微信公眾號

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容