pytest测试框架-内置插件Hook函数

2022-04-24  本文已影响0人  吱吱菌啦啦
Hook函数:钩子函数,比如人照镜子,镜子里的自己是虚拟的,是一个影子,影子是不能做任何操作的,自己动的时候影子才会动,在程序中影子相当于hook,ta本身没有实现步骤,自己代表实现。
pytest测试用例的执行顺序:
pytest hook的执行顺序

root
└── pytest_cmdline_main
├── pytest_plugin_registered
├── pytest_configure
│ └── pytest_plugin_registered
├── pytest_sessionstart
│ ├── pytest_plugin_registered
│ └── pytest_report_header
├── pytest_collection
│ ├── pytest_collectstart
│ ├── pytest_make_collect_report
│ │ ├── pytest_collect_file
│ │ │ └── pytest_pycollect_makemodule
│ │ └── pytest_pycollect_makeitem
│ │ └── pytest_generate_tests
│ │ └── pytest_make_parametrize_id
│ ├── pytest_collectreport
│ ├── pytest_itemcollected
│ ├── pytest_collection_modifyitems
│ └── pytest_collection_finish
│ └── pytest_report_collectionfinish
├── pytest_runtestloop
│ └── pytest_runtest_protocol
│ ├── pytest_runtest_logstart
│ ├── pytest_runtest_setup
│ │ └── pytest_fixture_setup
│ ├── pytest_runtest_makereport
│ ├── pytest_runtest_logreport
│ │ └── pytest_report_teststatus
│ ├── pytest_runtest_call
│ │ └── pytest_pyfunc_call
│ ├── pytest_runtest_teardown
│ │ └── pytest_fixture_post_finalizer
│ └── pytest_runtest_logfinish
├── pytest_sessionfinish
│ └── pytest_terminal_summary
└── pytest_unconfigure

Hook函数的使用
示例:先在conftest.py文件中加上hook的配置,然后写一个测试用例,执行,用例的执行顺序按hook配置执行~

conftest.py的配置:

from typing import Optional
def pytest_runtest_setup(item: "Item") -> None:
    print("hook:setup")

def pytest_runtest_teardown(item: "Item", nextitem:Optional["Item"]) -> None:
    print("teardown")

测试代码test_hook.py:

def test_case():
    print("\n")
    pass

执行结果:


image.png
用Hook函数写插件
import pytest

@pytest.mark.parametrize('name', ["吱吱菌啦啦", "测试ziz"])
def test_case(name):
    print(f"名称测试:{name}")
    # name 用例的名字
    # nodeid就是测试用例的路径

编写测试代码,执行;未修改编码前,用例名称的展示:


image.png

conftest.py文件中对收集测试用例进行二次开发,然后对item进行encode('utf-8').decode('unicode-escape')

# 收集完测试用例之后被调用的hook函数,对中文传参进行decode
def pytest_collection_modifyitems(session: "Session", config: "Config", items: List["Item"]) -> None:
    print(items)
    # 遍历item,对名称和用例路径_nodeid进行编码
    for item in items:
        item.name = item.name.encode('utf-8').decode('unicode-escape')
        item._nodeid = item.nodeid.encode('utf-8').decode('unicode-escape')

修改编码后,再次执行测试代码,用例名称的展示:


image.png
2.添加命令行参数

conftest.py文件的修改

# 定义一个命令行参数
def pytest_addoption(parser):
    mygroup = parser.getgroup("hogwarts")     #group 将下面所有的 option都展示在这个group下。
    mygroup.addoption("--env",    #注册一个命令行选项
                      default='test',      # 参数的默认值
                      dest='env',            #  存储的变量
                      help='set your run env'    # 帮助提示 参数的描述信息
  )

    mygroup.addoption("--env1",  # 注册一个命令行选项
                      default='test1',  # 参数的默认值
                      dest='env1',  # 存储的变量
                      help='set your run env'  # 帮助提示 参数的描述信息
                      )

# 针对传入的不同参数完成不同的逻辑处理
@pytest.fixture(scope='session')
def cmdoption(request):
    myenv = request.config.getoption("--env",default='test')
    if myenv == 'test':
        datapath = 'datas/test/data.yml'
    if myenv == 'dev':
        datapath = 'datas/dev/data.yml'

    with open(datapath) as file:
        datas = yaml.safe_load(file)
    return myenv, datas

执行测试代码,会打印当前环境及读取对应yaml文件中的数据

也可以用命令行执行:
pytest test_hook_plugin_option.py --env dev -vs
pytest test_hook_plugin_option.py --env test -vs

def test_option(cmdoption):
    print(cmdoption)
上一篇下一篇

猜你喜欢

热点阅读