Pytest進階使用

fixture特點:

  • 命令靈活:對于setup , teardown可以省略
  • 數據共享:在conftest.py配置里寫方法可以實現數據共享 , 不需要import導入 , 可以跨文件共享
  • scope的層次及神奇的yield組合相當于各種setup和teardown
  • 實現參數化
應用
  • 場景:
測試用例執行時,有的用例需要登錄才能執行,有些用例不需要登錄 。
setup和teardown無法滿足這種情況,但是fixture可以 。默認scope(范圍):function
  • 步驟:
    • 導入pytest
    • 在登錄的函數上添加@pytest.fixture()
    • 在要使用的測試方法中傳入(登錄函數名稱)
    • 不傳入的就不登錄,直接執行測試方法 。
fixture作用域取值范圍說明function函數級每一個函數或方法都會調用class類級別每個測試類只執行一次module模塊級每個.py文件調用一次package包級每個python包只調用一次(暫不支持)session會話每次會話只需要運行一次,會話內所有方法及類,模塊都共享這個方法
  • session是在整個項目中只執行一次的代碼
yield關鍵字
  • 場景:
你已經可以將測試方法【前要執行的或依賴的】解決了 , 那測試方法后銷毀清除數據要如何進行?
  • 解決:
通過在fixture函數中加入yield關鍵字,yield是調用第一次返回結果,第二次執行它下面的語句返回 。
  • 步驟:
@pytest.fixture(scope=module)
在登錄的方法中加yield,之后加銷毀清除的步驟
import pytest@pytest.fixture()def login():# setuptoken = '1235236fdg'print("登錄功能")yield token# 相當于return 返回none# teardownprint("退出登錄操作")def test_search():print("搜索功能")def test_cart(login):print(f"token:{login}")print("購物車")數據共享
  • 場景:
你與其他工程師合作一起開發時,公共的模塊要在不同文件中,要在大家都訪問的到的地方
  • 解決:
使用conftest.py這個文件進行數據共享 , 并且它可以放在不同位置起著不同的范圍共享作用
  • 前提:
    • conftest文件名不能換
    • 放在項目下是全局的數據共享
  • 執行:
    • 系統執行到參數login時先從本模塊中查找是否有這個名字的變量之類的
    • 之后在conftest.py中找是否含有
  • 步驟:
將登錄模塊帶@pytest.fixture寫在conftest.py
自動應用
  • 場景:
不想原測試方法有任何改動,或全部都自動實現自動應用,沒特例,也都不需要返回值時可以選擇自動應用的方法
  • 解決:
使用fixture中的參數autouse=True實現
  • 步驟:
在方法上面加@pytest.fixture(autouse=Ture)
參數化
  • 場景:
測試離不開數據,為了數據靈活,一般數據都是通過參數傳的
  • 解決:
使用fixture中的固定參數request傳遞
  • 步驟:
在fixture中添加@pytest.fixture(params=[1,2,3,'linda'])
在方法參數寫request,方法體里面使用request.param接受參數
@pytest.fixture(params=['hogwarts','joker'])def demo_params(request):print(f'用戶名為:{request.param}')return request.paramdef test_demo(demo_params):print(f"數據為:{demo_params}")
  • 注意:fixture的參數是params,而調用的時候是request.param,沒有s
總結:
  • 模擬setup,teardown(一個用例可以引用多個fixture)
  • yield的用法
  • 作用域(session,module,類級別,方法級別)
  • 自動執行(autouse參數)
  • conftest.py用法,一般會把fixture寫在conftest.py文件中
  • 實現參數化
pytest.ini文件
  • pytest.ini是pytest的配置文件
  • 可以修改pytest的默認行為
  • 不能使用中文符號 , 包括漢字,空格  , 引號,冒號等
作用:
  • 修改用例的命名規則
  • 配置日志格式,比代碼配置方便很多
  • 添加標簽,防止運行過程報警告錯誤
  • 指定執行目錄
  • 排除搜索目錄
改變pytest運行規則[pytest];執行check_開頭的所有文件python_files = check_* test_*;執行所有的以Test和Check開頭的類python_classes = Test* Check*;執行所有以test_和check_開頭的方法python_functions = check_* test_*
  • 注意:win系統的pytest.ini文件不能寫中文 , 注釋也不行
pytest配置-添加默認參數

推薦閱讀