pytest框架学习-pytest_addoption钩子函数

发布时间 2023-12-13 17:28:56作者: 努力工作,早日退休

适用场景:一套自动化代码,多套环境。

pytest_addoption 允许用户自定义注册一个命令行参数,方便用户通过命令行参数的形式给 pytest 传递不同的参数进行不同测试场景的切换。

pytest_addoption 钩子函数一般和内置 fixture pytestconfig 配合使用, pytest_addoption 注册自定义的命令行参数, pytestconfig 通过pytest配置对象读取参数的值。

pytest_addoption 钩子函数还可以与内置fixture函数request中 request.config.getoption 结合使用来读取用户注册的自定义命令行参数对应的参数值。

 opts:是要注册的命令行参数

可以看到,其他参数和add_argument()是一样的

咱们可以看官网解释:argparse --- 命令行选项、参数和子命令解析器 — Python 3.12.1 文档

注意:使用def pytest_addoption(parser) 需要放在conftest.py文件中

conftest.py中代码如下:

import pytest


def pytest_addoption(parser):
    """
    自定义命令行参数的名字,可以是:"foo", "-foo" 或 "--foo";
    action:指明应当如何处理一个参数  'store', 'store_const', 'store_true', 'append', 'append_const', 'count', 'help', 'version'
    nargs:参数可被使用的次数
    const:存储一个常量值
    default:默认为 None
    type:自动将参数转换为给定的类型    int, float, argparse.FileType('w') 或可调用函数
    choices:将值限制为指定的可选项集合
    required:指明某个参数是必需的还是可选的    True 或 False
    help:参数的帮助消息
    metavar:要在帮助中显示的参数替代显示名称
    dest:指定要在结果命名空间中使用的属性名称
    """
    parser.addoption(
        "--env",  # 添加命令行参数--env,用来表示运行环境
        action="store",
        default="dev",  # 默认为dev开发环境
        choices=["test", "dev", "auto"],  # name只能在这三个环境中选取,否则报错
        help="选择运行环境")

@pytest.fixture(scope='session')
def get_env(request):
    """
    获取命令行参数--env的值,即获取运行环境
    """
    name = request.config.getoption("--env")
    return name

然后在测试用例文件中,可以作为参数引用

class TestRunForAddoption:
    def test_normal_addoption(self, get_env):print(f"当前代码运行环境是:{get_env}")

 pytest -sv -k 'test_normal_addoption'

此时没有传入命令行参数--env,可以看到,取得是默认值dev

 pytest -sv -k 'test_normal_addoption' --env test

传入--env参数,并且赋值为test,可以看到,运行结果取值test

pytest -sv -k 'test_normal_addoption' --env uat

传入--env参数,赋值为uat,不在choices列表里,报错