Pytest進階使用( 二 )

addopts = -v -s --alluredir=./results
指定/忽略執行目錄;設置執行得路徑;testpaths = bilibili baidu;忽略某些文件夾/目錄norecursedirs = result logs datas test_demo*插件開發
  • pytest插件分類
    • 外部插件:pip install 安裝的插件
    • 本地插件:pytest自動模塊發現機制(conftest.py存放的)
    • 內置插件:代碼內部的_pytest目錄加載(hook函數)
官網:https://pypi.org/
常用插件
Pytest進階使用

文章插圖
每一種測試框架收集測試用例的順序是不一樣的
pytest執行順序控制
  • 場景:
對于集成測試,經常會有上下文依賴關系的測試用例 。如十個步驟 , 拆分成十個case , 這時候能知道到底執行到哪步報錯 。
用例默認執行順序:自上而下執行
  • 解決:
可以通過setup,teardown和fixture來解決,也可以使用pytest-ordering插件來解決
  • 安裝:pip install pytest-ordering
  • 用法:@pytest.mark.run(order=2)
  • 注意:多個插件裝飾器(>2)的時候,有可能會發生沖突
并行與分布式并發執行(xdist)場景1:
  • 測試用例1000條,一個用例執行1分鐘,一個測試人員需要1000分鐘,通常我們會用人力成本換取時間成本,加幾個人一起執行,時間就會縮短 。這就是一種分布式場景 。
場景2:
  • 假設有個報名系統,對報名總數進行統計,數據同時進行修改操作的時候有可能出現問題,需要模擬這個場景,需要多用戶并發請求數據
解決:
  • 使用分布式并發執行測試用例 , 分布式插件:pytest-xdist
  • 安裝:pip install pytest-xdist
  • 注意:用例多的時候效果明顯,多進程并發執行,同時支持allure
hook函數1. 介紹
  • 是個函數,在系統消息觸發時被系統調用
  • 自動觸發機制
  • Hook函數的名稱是確定的
  • pytest有非常多的hook函數
  • 使用時直接編寫函數體
  • 執行是有先后順序的
  • 可以在不同階段實現不同的功能
pytest執行過程
Pytest進階使用

文章插圖
執行順序:
  • 介紹:https://ceshiren.com/t/topic/8807
  • 簡潔版:

Pytest進階使用

文章插圖
pytest編寫插件1-修改默認編碼pytest_collection_modifyitems收集上來的測試用例實現定制化功能
解決問題:
  • 自定義用例的執行順序
  • 解決編碼問題(中文的測試用例名稱)
  • 自動添加標簽
from typing import List# 修改編碼的hook函數def pytest_collection_modifyitems(session: "Session", config: "Config", items: List["Item"]) -> None:# items里的name是測試用例的名字 , nodeid是測試用例的路徑print(items)for item in items:# 如果想改變unicode編碼格式的話,需要先encode成utf-8格式的,再decode成unicode-escape就可以了item.name = item.name.encode('utf-8').decode('unicode-escape')item._nodeid = item.nodeid.encode('utf-8').decode('unicode-escape')編寫插件2-添加命令行參數# 定義命令行參數的hook函數def pytest_addoption(parser):# group 將下面所有的option都展示在這個group組下mygroup = parser.getgroup('hogwarts')mygroup.addoption('--env',# 注冊一個命令行選項default='test',# 參數的默認值dest='env',# 存儲的變量 , 為屬性命令,可以使用option對象訪問到這個值help='set your run env')# 幫助提示,參數的描述信息@pytest.fixture(scope='session')def cmd_option(request):# request獲取命令行的參數,config拿到pytest相關配置,getoption拿到命令行參數return request.config.getoption('--env')
Pytest進階使用

文章插圖
打包發布打包項目構成:
  • 源碼包
  • setup.py
  • 測試包
from setuptools import setup, find_packagessetup(name='pytest_encode',url='',version='1.0',# 版本author='joker',# 作者author_email='',# 郵箱description='set your encoding and logger',# 描述用法long_description='Show Chinese for you mark.parametrize().',# 完整描述classifiers=[# 分類索引,pip所屬包的分類,方便在pip官網中搜索'Framework :: Pytest','Programming Language :: Python','Topic :: Software Development :: Testing','Programming Language :: Python :: 3.8',],license='proprietary',# 程序授權信息packages=find_packages(),# 通過導入的方式發現當前項目下所有的包keywords=[# 便于pip進行分類'pytest', 'py.test', 'pytest_encode'],# 需要安裝的依賴install_requires=['pytest'],# 入口模塊,或者入口函數(最重要的)entry_points={'pytest11': ['pytest_encode = pytest_encode.main']},zip_safe=False# 針對win系統,不設置成false會出錯)

推薦閱讀